2014-12-02 3 views
9

Я реализовал свой обычай IDataStore, так что я могу хранить End лексем пользователя на моей базы данных вместо реализации по умолчанию, которая сохраняется на FileSystem в% AppData%.Google Drive Апи - Пользовательское IDataStore с Entity Framework

public class GoogleIDataStore : IDataStore 
{ 
    ... 

    public Task<T> GetAsync<T>(string key) 
    { 
     TaskCompletionSource<T> tcs = new TaskCompletionSource<T>(); 

     var user = repository.GetUser(key.Replace("oauth_", "")); 

     var credentials = repository.GetCredentials(user.UserId); 

     if (key.StartsWith("oauth") || credentials == null) 
     { 
      tcs.SetResult(default(T)); 
     } 
     else 
     { 
      var JsonData = Newtonsoft.Json.JsonConvert.SerializeObject(Map(credentials));     
      tcs.SetResult(NewtonsoftJsonSerializer.Instance.Deserialize<T>(JsonData)); 
     } 
     return tcs.Task; 
    } 
} 

Контроллер

public async Task<ActionResult> AuthorizeDrive(CancellationToken cancellationToken) 
{ 
    var result = await new AuthorizationCodeMvcApp(this, new GoogleAppFlowMetadata()). 
      AuthorizeAsync(cancellationToken); 

    if (result.Credential == null) 
     return new RedirectResult(result.RedirectUri); 

    var driveService = new DriveService(new BaseClientService.Initializer 
    { 
     HttpClientInitializer = result.Credential, 
     ApplicationName = "My app" 
    }); 

    //Example how to access drive files 
    var listReq = driveService.Files.List(); 
    listReq.Fields = "items/title,items/id,items/createdDate,items/downloadUrl,items/exportLinks"; 
    var list = listReq.Execute(); 

    return RedirectToAction("Index", "Home"); 
} 

Проблема происходит на событие переадресации. После этого первое перенаправление работает нормально.

Я узнал, что что-то отличается от события переадресации. В событии переадресации T не является ответом маркера, а строкой. Кроме того, ключ имеет префикс «oauth_».

Итак, я предполагаю, что я должен вернуть другой результат при перенаправлении, но я не знаю, что вернуть.

Ошибки я получаю: Google.Apis.Auth.OAuth2.Responses.TokenResponseException: Ошибка: "Государство является недействительным", Описание: "", Ури: ""

Google Исходный код Эталонные https://code.google.com/p/google-api-dotnet-client/source/browse/Src/GoogleApis.DotNet4/Apis/Util/Store/FileDataStore.cs?r=eb702f917c0e18fc960d077af132d0d83bcd6a88

https://code.google.com/p/google-api-dotnet-client/source/browse/Src/GoogleApis.Auth/OAuth2/Web/AuthWebUtility.cs?r=eb702f917c0e18fc960d077af132d0d83bcd6a88

Спасибо за вашу помощь

ответ

0

Я не совсем уверен, почему ваш не работает, но это копия кода, который я использую. Полный класс можно найти здесь DatabaseDatastore.cs

/// <summary> 
     /// Returns the stored value for the given key or <c>null</c> if the matching file (<see cref="GenerateStoredKey"/> 
     /// in <see cref="FolderPath"/> doesn't exist. 
     /// </summary> 
     /// <typeparam name="T">The type to retrieve</typeparam> 
     /// <param name="key">The key to retrieve from the data store</param> 
     /// <returns>The stored object</returns> 
     public Task<T> GetAsync<T>(string key) 
     { 
      //Key is the user string sent with AuthorizeAsync 
      if (string.IsNullOrEmpty(key)) 
      { 
       throw new ArgumentException("Key MUST have a value"); 
      } 
      TaskCompletionSource<T> tcs = new TaskCompletionSource<T>(); 


      // Note: create a method for opening the connection. 
      SqlConnection myConnection = new SqlConnection("user id=" + LoginName + ";" + 
             @"password=" + PassWord + ";server=" + ServerName + ";" + 
             "Trusted_Connection=yes;" + 
             "database=" + DatabaseName + "; " + 
             "connection timeout=30"); 
      myConnection.Open(); 

      // Try and find the Row in the DB. 
      using (SqlCommand command = new SqlCommand("select RefreshToken from GoogleUser where UserName = @username;", myConnection)) 
      { 
       command.Parameters.AddWithValue("@username", key); 

       string RefreshToken = null; 
       SqlDataReader myReader = command.ExecuteReader(); 
       while (myReader.Read()) 
       { 
        RefreshToken = myReader["RefreshToken"].ToString(); 
       } 

       if (RefreshToken == null) 
       { 
        // we don't have a record so we request it of the user. 
        tcs.SetResult(default(T)); 
       } 
       else 
       { 

        try 
        { 
         // we have it we use that. 
         tcs.SetResult(NewtonsoftJsonSerializer.Instance.Deserialize<T>(RefreshToken)); 
        } 
        catch (Exception ex) 
        { 
         tcs.SetException(ex); 
        } 

       } 
      } 

      return tcs.Task; 
     } 
+0

Hi. Mine также работает. Однако при первоначальном перенаправлении (для того, чтобы пользователь разрешил доступ к своему приводу Google) после «StoreAsync» вызывается '' GetAsync'', а ключ имеет значение *[email protected].xxx*. Так вот, я получил ошибку. Я не уверен, что ваш проект MVC, как мой ... проблема может быть связана с этим. Я отредактирую свой вопрос с помощью кода '' Controller''. –

0

В API магазинах (по крайней мере) два значения в вашем IDataStore. Вот что процесс авторизации выглядит с точки пустой IDataStore зрения (обратите внимание, какие строки набор значение и какие линии получить значение):

Getting IDataStore value: MyKey  <= null 

Setting IDataStore value: oauth_MyKey => "http://localhost..." 
Setting IDataStore value: MyKey  => {"access_token":"... 

Getting IDataStore value: oauth_MyKey <= "http://localhost..." 
Getting IDataStore value: MyKey  <= {"access_token":"... 

Сначала API пытается найти хранится access_token, но в хранилище данных нет (который возвращает null), и API запускает процесс авторизации. Ключ «oauth _...» - это информация о состоянии, которая требуется API в ходе этого процесса, и обычно устанавливается перед ее извлечением (по моему опыту).

Однако, если ваш IDataStore никогда не получил значение с помощью ключа «oauth_ ..» и, следовательно, ему нечего возвращать, просто верните null, и при необходимости API должен создать новый.

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