Quand je note dans mon application, je passe par le code suivant:En utilisant l'identité Cognito en cache de Xamarin
auth = new Xamarin.Auth.OAuth2Authenticator(
"my-google-client-id.apps.googleusercontent.com",
string.Empty,
"openid",
new System.Uri("https://accounts.google.com/o/oauth2/v2/auth"),
new System.Uri("com.enigmadream.storyvoque:/oauth2redirect"),
new System.Uri("https://www.googleapis.com/oauth2/v4/token"),
isUsingNativeUI: true);
auth.Completed += Auth_Completed;
StartActivity(auth.GetUI(this));
qui déclenche cette activité:
[Activity(Label = "GoodleAuthInterceptor")]
[IntentFilter(actions: new[] { Intent.ActionView }, Categories = new[] { Intent.CategoryDefault, Intent.CategoryBrowsable },
DataSchemes = new[] { "com.enigmadream.storyvoque" }, DataPaths = new[] { "/oauth2redirect" })]
public class GoodleAuthInterceptor : Activity
{
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
Android.Net.Uri uri_android = Intent.Data;
Uri uri_netfx = new Uri(uri_android.ToString());
MainActivity.auth?.OnPageLoading(uri_netfx);
Finish();
}
}
Et enfin ce code pour lier le compte Cognito:
private void Auth_Completed(object sender, Xamarin.Auth.AuthenticatorCompletedEventArgs e)
{
if (e.IsAuthenticated)
{
var idToken = e.Account.Properties["id_token"];
credentials.AddLogin("accounts.google.com", idToken);
AmazonCognitoIdentityClient cli = new AmazonCognitoIdentityClient(credentials, RegionEndpoint.USEast2);
var req = new Amazon.CognitoIdentity.Model.GetIdRequest();
req.Logins.Add("accounts.google.com", idToken);
req.IdentityPoolId = "us-east-2:79ebf8e1-97de-4d1c-959a-xxxxxxxxxxxx";
cli.GetIdAsync(req).ContinueWith((task) =>
{
if ((task.Status == TaskStatus.RanToCompletion) && (task.Result != null))
{
ShowMessage(string.Format("Identity {0} retrieved", task.Result.IdentityId));
}
else
ShowMessage(task.Exception.InnerException != null ? task.Exception.InnerException.Message : task.Exception.Message);
});
}
else
ShowMessage("Login cancelled");
}
tout cela fonctionne très bien, et après la connexion, je peux utiliser mon identité/crede ntials pour récupérer des données de DynamoDB. Avec cet objet:
Amazon.DynamoDBv2.AmazonDynamoDBClient ddbc = new Amazon.DynamoDBv2.AmazonDynamoDBClient(credentials, RegionEndpoint.USEast2);
La deuxième fois que je lance mon application, ce code fonctionne:
if (!string.IsNullOrEmpty(credentials.GetCachedIdentityId()) || credentials.CurrentLoginProviders.Length > 0)
{
if (!bDidLogin)
{
var idToken = credentials.GetIdentityId();
ShowMessage(string.Format("I still remember you're {0} ", idToken));
Et si je tente d'utiliser les informations d'identification avec DynamoDB (ou quoi que ce soit, je suppose) à ce stade , Je reçois des erreurs que je n'ai pas accès à l'identité. Je dois me déconnecter (credentials.Clear()
) et me reconnecter pour obtenir les informations d'identification appropriées. Je pourrais demander à un utilisateur de passer par tout le processus de connexion à chaque fois que mon application fonctionne, mais le processus de connexion Google oblige l'utilisateur à fermer manuellement le navigateur pour revenir à l'application après s'être authentifié. Y at-il quelque chose qui me manque sur le but et l'utilisation des informations d'identification en cache? Lorsque j'utilise la plupart des applications, elles ne me demandent pas de me connecter à mon compte Google à chaque fois et de fermer un navigateur Web uniquement pour accéder aux ressources de leur serveur.
1) Vous pouvez utiliser une activité 'LaunchMode.SingleTask' pour fermer l'onglet personnalisé Chrome (ou Firefox, Samsung, etc ...) après la fin de la connexion oauth2 en lançant l'OAuth2Authenticator dans cette même activité, et non votre "MainActivity" (les docs Xamarin.Auth (readme.md) sont juste faux sur la façon dont ils vous montrent pour le configurer). 2) Voulez-vous dire que les informations d'identification mises en cache sont vides ou que le jeton est manquant après la première connexion? – SushiHangover
@SushiHangover Je crois que les identifiants sont là parce qu'il me dit mon identité, et me dit que je ne peux pas utiliser une autre identité si j'essaie de me connecter à un autre compte Google (en ajoutant un autre identifiant avec un ID différent). Mais si j'essaie d'utiliser les informations d'identification, cela signifie que je n'ai pas accès à l'identité. Je suis très nouveau à ce sujet, donc je ne suis pas sûr de savoir comment les pièces s'emboîtent, ou ce que ces erreurs signifient. – BlueMonkMN
@SushiHangover J'ai pu obtenir 'LaunchMode.SingleTask' pour améliorer le comportement, mais je ne suis toujours pas clair sur la nature ou le but des informations d'identification mises en cache et si je dois demander un compte Google chaque fois que l'application fonctionne . Il se souvient de mon jeton d'identité, mais apparemment pas de tout ce dont il a besoin pour être authentifié avec. – BlueMonkMN