2014-12-01 5 views
3

Я использую MVC sample code из Google для подключения к Google Диску. Однако я хочу реализовать свой собственный IDataStore, чтобы я мог хранить учетные данные пользователя в моей базе данных.Google Drive Api - MVC IDataStore

С FileStorage образца все работает отлично, и я получаю Токен и RefreshToken и более того, он автоматически обновлять маркеры, когда истек.

, реализующий IDataStore выглядит просто:

public class MyDataStore : IDataStore 
{ 
    public Task ClearAsync() 
    { 
     ... 
    } 

    public Task DeleteAsync<T>(string key) 
    { 
     ... 
    } 

    public Task<T> GetAsync<T>(string key) 
    { 
     ... 
    } 

    public Task StoreAsync<T>(string key, T value) 
    { 
     ... 
    } 
} 

Так в StoreAsync я сохранить полномочия на моей базе данных, и на GetAsync я получаю из базы данных.

Но странно при использовании этого я получаю access_token, но refresh_token не возвращается.

Я попытался выполнить поиск по образцам с использованием пользовательского IDataStore, но я ничего не могу найти.

Любые идеи?

Большое спасибо

+1

Have вы добавили «access_type = offline» в запросе кода авторизации, когда хотите обновить_токен? – gui47

+0

Каждый раз, когда я вызываю api, я не получаю токен обновления. Я получаю только заполненный доступ access_token. Не уверен, что вы имеете в виду. Спасибо –

+1

UserCredential и AuthorizationCodeFlow заботятся о автоматическом «обновлении» токена, что просто означает получение нового токена доступа. Это делается с использованием долгоживущего токена обновления, который вы получаете вместе с токеном доступа, если вы используете параметр access_type = offline во время потока кода авторизации. Вы можете найти информацию о своем URL-адресе кода. – gui47

ответ

1

Принимая во внимание @ gui47 комментарий Я искал о том, как добавить access_type параметр, и я узнал еще post on StackOverflow с раствором:

internal class OfflineGoogleAuthorizationCodeFlow : GoogleAuthorizationCodeFlow 
{ 
    public OfflineGoogleAuthorizationCodeFlow(GoogleAuthorizationCodeFlow.Initializer initializer) : base(initializer) { } 

    public override AuthorizationCodeRequestUrl CreateAuthorizationCodeRequest(string redirectUri) 
    { 
     return new GoogleAuthorizationCodeRequestUrl(new Uri(AuthorizationServerUrl)) 
     { 
      ClientId = ClientSecrets.ClientId, 
      Scope = string.Join(" ", Scopes), 
      RedirectUri = redirectUri, 
      AccessType = "offline", 
      ApprovalPrompt = "force" 
     }; 
    } 
}; 

Спасибо очень

Смежные вопросы