Microsoft.Maui.Authentication.WebAuthenticator Вход в Google продолжает запрашивать выбор учетной записи каждый разAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Microsoft.Maui.Authentication.WebAuthenticator Вход в Google продолжает запрашивать выбор учетной записи каждый раз

Сообщение Anonymous »

У меня есть небольшое приложение .net Maui, которое использует вход Google для доступа к файлам на Google Диске.
Код, который я использую для получения UserCredential, выглядит следующим образом:
Обратите внимание, что конфиденциальные значения являются поддельными и показаны здесь в качестве примера.

Код: Выделить всё

const string userEmailKey = "UserEmail";
const string redirectUrl = "com.mytestapp.mytestapp://";
var clientId = "82cef48b-9e0e-46b3-ae05-ab53227e9862.apps.googleusercontent.com";
var tokenUrl = "https://oauth2.googleapis.com/token";

var authUrl = $"https://accounts.google.com/o/oauth2/auth?response_type=code" +
$"&redirect_uri={redirectUrl}" +
$"&client_id={clientId}" +
$"&scope=https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/drive https://www.googleapis.com/auth/spreadsheets" +
$"&include_granted_scopes=true" +
$"&state=state_parameter_passthrough_value";

var userEmail = Preferences.Get(userEmailKey, null);
if (!string.IsNullOrEmpty(userEmail))
{
authUrl += $"&login_hint={userEmail}"; // I thought this would force login with the email saved in preferences
}

var authResult = await WebAuthenticator.Default.AuthenticateAsync(
new Uri(authUrl),
new Uri(redirectUrl));

var codeToken = authResult.Properties["code"];

var parameters = new FormUrlEncodedContent(
[
new KeyValuePair("grant_type","authorization_code"),
new KeyValuePair("client_id", clientId),
new KeyValuePair("redirect_uri",redirectUrl),
new KeyValuePair("code",codeToken)
]
);

HttpClient client = new HttpClient();
var accessTokenResponse = await client.PostAsync(tokenUrl, parameters);
accessTokenResponse.EnsureSuccessStatusCode();

var responseContent = await accessTokenResponse.Content.ReadAsStringAsync();
var accessTokenResponseDict = JsonConvert.DeserializeObject(responseContent);
if (accessTokenResponseDict == null)
{
throw new NullReferenceException("tokenResponse found to be null");
}

// save email to preferences
var idToken = accessTokenResponseDict["id_token"];
var jwt = new JwtSecurityTokenHandler().ReadJwtToken(idToken);
var email = jwt.Claims.FirstOrDefault(c => c.Type == "email")?.Value;
Preferences.Set(userEmailKey, email);

Google.Apis.Auth.OAuth2.Responses.TokenResponse tokenResponse = new TokenResponse()
{
AccessToken = accessTokenResponseDict["access_token"],
ExpiresInSeconds = Convert.ToInt64(accessTokenResponseDict["expires_in"]),
RefreshToken = accessTokenResponseDict["refresh_token"],
Scope = accessTokenResponseDict["scope"],
TokenType = accessTokenResponseDict["token_type"],
};

Google.Apis.Auth.OAuth2.Flows.GoogleAuthorizationCodeFlow googleAuthFlow = new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer()
{
ClientSecrets = new ClientSecrets()
{
ClientId = clientId
}
});

var credential = new UserCredential(googleAuthFlow, "user", tokenResponse);
Но страница выбора учетной записи и страница согласия продолжают появляться каждый раз при запуске приведенного выше кода.
Если я добавлю Prompt=none в URL-адрес аутентификации завершается сбоем.
Существует ли другой шаблон для кэширования некоторого значения, чтобы после того, как пользователь вошел в систему и дал согласие, его больше не спрашивали?

Подробнее здесь: https://stackoverflow.com/questions/793 ... mpting-for
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»