Бета-версия .NET Google API 1.7 с аутентификацией с помощью токена обновления
-
21-12-2019 - |
Вопрос
Я просматривал 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));