在 Xamarin.Forms 跨平台应用程序中使用 Amazon Cognito 用户池进行身份验证

Authentication with Amazon Cognito User Pools in Xamarin.Forms Cross-Platform App

我正在使用 Xamarin.Forms 开发跨平台移动应用程序。我有一个 Amazon Cognito 用户池,可以通过第三方(Facebook,Google)以及包含我所有用户的本机应用程序用户身份验证(username/password)进行身份联合。我目前有一个 Cognito 应用程序客户端和一个重定向 URL、https://localhost:PORT

我编写了与 Cognito 交互的 .NET Standard 帮助程序库。我有一个接口 ICognitoAuthHelper,其中包含一个方法 AuthenticateUserAsync(PoolRequest request)PoolRequest 对象有一个 AuthorizationCode 属性 用于授权码授权流程。 AuthenticateUserAsync 函数本质上是 post 向 Cognito 应用程序客户端 TOKEN 端点发送授权代码以接收 JWT,然后我让实用程序库对其进行解码以检索有关经过身份验证的用户身份的声明。

输入问题:我想利用我编写的实用程序库在我的 Xamarin.Forms 应用程序中进行身份验证。

这是一个简单的用例,以及我将如何(并且将如何)在 ASP.NET 核心 MVC 网络应用程序中执行身份验证流程:

1) 我点击“使用 Facebook 登录”按钮重定向到 Cognito 应用程序客户端的 AUTHORIZE 端点

2) 当应用程序客户端重定向回我的重定向 URL (localhost) 时,我将 code 查询参数抓取出来URL 中的一个,将其包装在 PoolRequest 中,并将其提供给我的实用程序库。然后,如上所述,库将 post 授权代码 (code) 到令牌端点以开始返回的 JWT 的解码过程。

3)实用程序库的响应将包含用户声明,我可以重定向到配置文件页面、设置会话变量等

如何通过 Xamarin.Forms 应用程序实现这种身份验证流程? 我考虑过使用 WebView,但不确定如何使用我可以捕获将从 Cognito 应用程序客户端返回的授权代码。我应该在 Xamarin 的应用程序客户端上将什么设置为重定向 URL?解码令牌集后,如何让 WebView 导航到个人资料页面?

非常感谢对此的任何帮助。

认为已经解决了这个问题。我没有 Mac,所以我只能在 Android 上进行测试,但解决方案需要做一些事情:

  • 正在使用自定义 URL 方案在 Cognito 应用程序客户端中注册新的重定向 URL。例如:myapp://login
  • 在绑定到我的登录视图的视图模型中创建两个命令。
public ICommand FacebookLogin => new Command(FacebookLoginCommand);
public ICommand GoogleLogin => new Command(GoogleLoginCommand);

private async void FacebookLoginCommand()
{
    var redirect = "<COGNITO APP CLIENT AUTHORIZE URL (FB)>"; // 
    await Launcher.OpenAsync(redirect);
}

private async void GoogleLoginCommand()
{
    var redirect = "<COGNITO APP CLIENT AUTHORIZE URL (Google)>"; // 
    await Launcher.OpenAsync(redirect);
}

请注意,我在这里引用自定义方案重定向 URLs,如上所述,在 redirect 变量中。

  • 在指定自定义 URL 方案的 Android 特定项目中,在我的 MainActivity 上放置一个 IntentFilter
[IntentFilter(
    new [] { Intent.ActionView }, 
    DataScheme = "myapp", 
    DataHost = "login", 
    AutoVerify = true, 
    Categories = new[] { Intent.CategoryDefault, Intent.CategoryBrowsable})]
public class MainActivity : global::Xamarin.Forms.Android.FormsAppCompatActivity
{
    ...
}
  • 覆盖MainActivity中的OnNewIntent(Intent intent)方法获取授权码查询参数。可以用intent.Data?.GetQueryParameter("code").

    提取
  • 用我的实用库兑换码tokens/user身份