使用Xamarin的Cognito Federated Identities

时间:2017-09-06 01:04:18

标签: c# amazon-web-services xamarin amazon-cognito

我想我的问题Understanding Cognito Identities不够具体。我仍然无法弄清楚如何使用Xamarin应用程序中的联合身份。这是我正在尝试的,但它确实非常随机,因为我找不到任何这个任务的示例代码。我尝试在AddLogin行上放置一个断点,它永远不会被击中,即使断点两行确实被击中。在这段代码中有太多新的技术让我知道从哪里开始追踪问题。 (我在下面的代码中输出了身份池ID,但是真的就在那里。)此时我只是想获得证据,证明我可以唯一地识别/验证亚马逊帐户,并可能将其添加到我的用户池。但我甚至无法让代码完全执行或报告错误。

Login().ContinueWith(t => { if (t.Exception != null) 
    Toast.MakeText(ApplicationContext, t.Exception.ToString(), ToastLength.Long).Show(); });

public async Task Login()
{
   CognitoAWSCredentials credentials = new CognitoAWSCredentials(
       "us-east-2:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", // Identity pool ID
       RegionEndpoint.USEast2 // Region
   );

   var client = new Amazon.SecurityToken.AmazonSecurityTokenServiceClient(credentials);
   var request = new Amazon.SecurityToken.Model.GetFederationTokenRequest("myamazonid@gmail.com");
   var response = await client.GetFederationTokenAsync(request);
   credentials.AddLogin("www.amazon.com", response.Credentials.SessionToken);
}

1 个答案:

答案 0 :(得分:1)

这需要大量的搜索,但我想我已经弄明白了。与编制代码相比,设置服务和获取客户端ID并不太难(有详细记录),所以这个答案将集中在代码上。由于对OAuth实施所做的更改阻止某些形式的身份验证工作,因此Google特别棘手。为了使Google身份与Cognito一起使用,API需要是最新的。使用NuGet引用以下API版本或更高版本:

  • Xamarin.Auth 1.5.0.3
  • Xamarin.Android.Support.v4 25.4.0.2
  • Xamarin.Android.Support.CustomTabs 25.4.0.2
  • AWSSDK.CognitoIdentity 3.3.2.14
  • AWSSDK.Core 3.3.17.8
  • 验证2.4.15
  • Xamarin.Android.Support.Annotations 25.4.0.2

此代码位于主要活动中:

protected override void OnCreate(Bundle savedInstanceState)
{
    // (etc)
    credentials = new CognitoAWSCredentials(
       "us-east-2:00000000-0000-0000-0000-000000000000", // Identity pool ID
       RegionEndpoint.USEast2 // Region
    );
    // (etc)
}

private void ShowMessage(string message)
{
  AlertDialog dlgAlert = new AlertDialog.Builder(this).Create();
  dlgAlert.SetMessage(message);
  dlgAlert.SetButton("Close", (s, args) => { dlgAlert.Dismiss(); });
  dlgAlert.Show();
}

public void Logout()
{
  credentials.Clear();
}

public void Login()
{
  if (!string.IsNullOrEmpty(credentials.GetCachedIdentityId()) || credentials.CurrentLoginProviders.Length > 0)
  {
     if (!bDidLogin)
        ShowMessage(string.Format("I still remember you're {0} ", credentials.GetIdentityId()));
     bDidLogin = true;
     return;
  }

  bDidLogin = true;
  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.mynamespace.myapp:/oauth2redirect"),
     new System.Uri("https://www.googleapis.com/oauth2/v4/token"),
     isUsingNativeUI: true);

  auth.Completed += Auth_Completed;
  StartActivity(auth.GetUI(this));
}

private void Auth_Completed(object sender, Xamarin.Auth.AuthenticatorCompletedEventArgs e)
{
  if (e.IsAuthenticated)
  {
     var http = new System.Net.Http.HttpClient();
     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:00000000-0000-0000-0000-000000000000";
     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");
}

然后还有另一项活动来处理Google身份验证过程中重定向网址的回调:

[Activity(Label = "GoodleAuthInterceptor")]
[IntentFilter(actions: new[] { Intent.ActionView }, Categories = new[] { Intent.CategoryDefault, Intent.CategoryBrowsable },
  DataSchemes = new[] { "com.mynamespace.myapp" }, 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();
  }
}