Как добавить "&войти hint=user@gmail.com " к GoogleWebAuthorizationBroker
Я хочу добавить login_hint к запросу аутентификации в Google. Я использую следующий код:
FileDataStore fDS = new FileDataStore(Logger.Folder, true);
GoogleClientSecrets clientSecrets = GoogleClientSecrets.Load(stream);
credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
clientSecrets.Secrets,
scopes.ToArray(),
username,
CancellationToken.None,
fDS).
Result;
var initializer = new Google.Apis.Services.BaseClientService.Initializer();
initializer.HttpClientInitializer = credential;
Куда передать этот параметр, чтобы адрес электронной почты был добавлен до открытия браузера?
2 ответа:
Спасибо за подсказки от Жафа!
Мое решение до сих пор:
using Google.Apis.Auth.OAuth2; using Google.Apis.Auth.OAuth2.Flows; using Google.Apis.Auth.OAuth2.Requests; using Google.Apis.Util.Store; using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; namespace MyOAuth2 { //own implementation to append login_hint parameter to uri public class MyOAuth2WebAuthorizationBroker : GoogleWebAuthorizationBroker { public new static async Task<UserCredential> AuthorizeAsync(ClientSecrets clientSecrets, IEnumerable<string> scopes, string user, CancellationToken taskCancellationToken, IDataStore dataStore = null) { var initializer = new GoogleAuthorizationCodeFlow.Initializer { ClientSecrets = clientSecrets, }; return await AuthorizeAsyncCore(initializer, scopes, user, taskCancellationToken, dataStore) .ConfigureAwait(false); } private static async Task<UserCredential> AuthorizeAsyncCore( GoogleAuthorizationCodeFlow.Initializer initializer, IEnumerable<string> scopes, string user, CancellationToken taskCancellationToken, IDataStore dataStore = null) { initializer.Scopes = scopes; initializer.DataStore = dataStore ?? new FileDataStore(Folder); var flow = new MyAuthorizationCodeFlow(initializer, user); // Create an authorization code installed app instance and authorize the user. return await new AuthorizationCodeInstalledApp(flow, new LocalServerCodeReceiver()).AuthorizeAsync (user, taskCancellationToken).ConfigureAwait(false); } } public class MyAuthorizationCodeFlow : GoogleAuthorizationCodeFlow { private readonly string userId; /// <summary>Constructs a new Google authorization code flow.</summary> public MyAuthorizationCodeFlow(Initializer initializer, string userId) : base(initializer) { this.userId = userId; } public override AuthorizationCodeRequestUrl CreateAuthorizationCodeRequest(string redirectUri) { return new GoogleAuthorizationCodeRequestUrl(new Uri(AuthorizationServerUrl)) { ClientId = ClientSecrets.ClientId, Scope = string.Join(" ", Scopes), //append user to url LoginHint = userId, RedirectUri = redirectUri }; } } }
Глядя на исходный код для библиотеки .NET, этот параметр не поддерживается.
В настоящее время на Url запроса авторизации определены следующие параметры строки запроса:
[Google.Apis.Util.RequestParameterAttribute("response_type", Google.Apis.Util.RequestParameterType.Query)] [Google.Apis.Util.RequestParameterAttribute("client_id", Google.Apis.Util.RequestParameterType.Query)] [Google.Apis.Util.RequestParameterAttribute("redirect_uri", Google.Apis.Util.RequestParameterType.Query)] [Google.Apis.Util.RequestParameterAttribute("scope", Google.Apis.Util.RequestParameterType.Query)] [Google.Apis.Util.RequestParameterAttribute("state", Google.Apis.Util.RequestParameterType.Query)]
В пределах
GoogleAuthorizationCodeFlow
класс (который вызываетсяAuthorizeAsyncCore
внутри брокера), методCreateAuthorizationCodeRequest
действительно вызываетGoogleAuthorizationCodeRequestUrl
, но он только задаетClientId
,Scope
иRedirectUrl
.Похоже, что вам нужно будет написать свой собственный экземпляр брокерской службы, если вы хотите установить дополнительные свойства этого класса.