Бета-версия .NET Google API 1.7 с аутентификацией с помощью токена обновления

StackOverflow https://stackoverflow.com//questions/21007866

Вопрос

Я просматривал Oauth .Net Google Apis, чтобы пройти аутентификацию через OAuth и использовать Apis диска Google.

В частности, я хочу использовать уже сохраненный токен обновления, чтобы использовать его для создания экземпляра службы GoogleDrive.

Я нашел такие образцы, какhttps://code.google.com/p/google-api-dotnet-client/source/browse/Tasks.SimpleOAuth2/Program.cs?repo=samples

Кажется, здесь используется «GoogleWebAuthorizationBroker.AuthorizeAsync», но я не уверен, как я могу использовать этот метод с токеном обновления, а не с секретами клиента, которые вы, похоже, передаете ему в этом примере.

Это было полезно?

Решение

Если я вас правильно понимаю, вы спрашиваете, как вы можете создать новый сервис Google, основанный на существующем токене обновления.

Так, вы можете сделать следующее:

var token = new TokenResponse { RefreshToken = "YOUR_REFRESH_TOKEN_HERE" }; 
var credentials = new UserCredential(new GoogleAuthorizationCodeFlow(
    new GoogleAuthorizationCodeFlow.Initializer 
    {
      ClientSecrets = [your_client_secrets_here]
    }), "user", token);
.

Затем вы можете передавать свои учетные данные на инициализатор службы.

, делая вышеупомянутое, GoogleauthorizationCodeFlow получит новый токен доступа на основе вас обновления токенов и клиентских секретов.

Обратите внимание, что у вас должны быть секреты клиента здесь, без этого вы не сможете получить токен доступа.

Другие советы

Client_Secrets.json содержит идентификатор клиента и секрет клиента (который имеет информацию о вашей заявке на ваше приложение).

Я думаю, что эта статья объяснит лучше, как вы можете OAUTH 2.0, чтобы получить доступ к API в Google Apps, особенно если вы создаете веб-приложение.

https://developers.google.com/accounts/docs/oauth2webserver

Если вы заинтересованы в примере кодирования, есть один в Stackoverflow: API Google+: Как я могу использовать Refreshtokens, чтобы не запрашивать доступ каждый раз, когда мой приложение запускается?

GoogleWebauthorizationBroker требует, чтобы вы отправили его в него IdataStaStore в этом случае FileDataStore отправляется.FiledataStore хранит данные в% AppData%.Если вы хотите использовать обновленные, которые вы сохранили где-то еще, вам нужно создать собственную IDATASTORE.

Код для фактического хранилища данных я немного долго, чтобы опубликовать здесь. http://daimto.com/google-oauth2-csharp/

Вы тогда используете это так же, как будто вы бы FileDataStore

//Now we load our saved refreshToken.
StoredResponse myStoredResponse = new StoredResponse(tbRefreshToken.Text);
// Now we pass a SavedDatastore with our StoredResponse.
 using (var stream = new FileStream("client_secrets.json", FileMode.Open,
        FileAccess.Read))
  {
     GoogleWebAuthorizationBroker.Folder = "Tasks.Auth.Store";
     StoredCredential = GoogleWebAuthorizationBroker.AuthorizeAsync(
     GoogleClientSecrets.Load(stream).Secrets,
     new[] { DriveService.Scope.Drive,
     DriveService.Scope.DriveFile },
     "user",
      CancellationToken.None,
      new SavedDataStore(myStoredResponse)).Result;
     }
.

Есть образец проекта, прикрепленный к этому руководству.

Чтобы использовать токен обновления:

var init = new GoogleAuthorizationCodeFlow.Initializer
{
    ClientSecrets = new ClientSecrets
    {
        ClientId = "OAuth_Client_ID_From_GoogleAPI",
        ClientSecret = "OAuth_Client_Secret"
    },
    Scopes = new string[] {"MY_SCOPES"}
};
var token = new TokenResponse { RefreshToken = "MY_REFRESH_TOKEN" };
var credential = new UserCredential(new Google.Apis.Auth.OAuth2.Flows.AuthorizationCodeFlow(init), "", token);

//init your Google API service, in this example Google Directory
var service = new DirectoryService(new BaseClientService.Initializer()
{
    HttpClientInitializer = credential,
    ApplicationName = "",
});

Что делать, если у вас нет токена обновления?Самый простой — следовать инструкциям в документации Google SDK.Сначала загрузите свои учетные данные из Google API Project.Назовите файл credentials.json.Затем запустите код:

using (var stream =
    new FileStream("credentials.json", FileMode.Open, FileAccess.Read))
{
    // The file token.json stores the user's access and refresh tokens, and is created
    // automatically when the authorization flow completes for the first time.
    string credPath = "token.json";
    credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
        GoogleClientSecrets.Load(stream).Secrets,
        Scopes,
        "user",
        CancellationToken.None,
        new FileDataStore(credPath, true)).Result;
    Console.WriteLine("Credential file saved to: " + credPath);
}

Это должно создать папку Token.json, а внутренняя папка - это еще один файл JSON, который имеет ваш обновление_token.

{
    "access_token" : "asdf",
    "token_type" : "Bearer",
    "expires_in" : 3600,
    "refresh_token" : "XXX",
    "scope" : "https://www.googleapis.com/auth/admin.directory.user.readonly",
    "Issued" : "2019-02-08T12:37:06.157-08:00",
    "IssuedUtc" : "2019-02-08T20:37:06.157Z"
}

Я предпочитаю не использовать GoogleWebauthorizationBroker, потому что он автоматически запускает веб -браузер, когда токен не найден.Я предпочитаю старый добрый способ получения токена обновления по коду доступа.Это очень похоже на использование Google OAuthUtil.CreateOAuth2AuthorizationUrl и OAuthUtil.GetAccessTokenв устаревшем API OAuth Google.

var a = new Google.Apis.Auth.OAuth2.Flows.GoogleAuthorizationCodeFlow.Initializer
{
    ClientSecrets = new ClientSecrets
    {
        ClientId = "asdf",
        ClientSecret = "hij"
    },
    Scopes = Scopes
};
var flow = new Google.Apis.Auth.OAuth2.Flows.AuthorizationCodeFlow(a);
var url = flow.CreateAuthorizationCodeRequest(GoogleAuthConsts.InstalledAppRedirectUri).Build().AbsoluteUri;
Console.WriteLine("Go to this URL and get access code: " + url);

Console.Write("Enter access code: ");
var code = Console.ReadLine();

Console.WriteLine("Fetching token for code: _" + code + "_");
var r = flow.ExchangeCodeForTokenAsync("user", code, GoogleAuthConsts.InstalledAppRedirectUri, CancellationToken.None).Result;
Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(r));
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top