微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决使用 Xamarin.Forms 跨平台应用程序中的 Amazon Cognito 用户池进行身份验证

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

的 Cognito 应用客户端

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

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

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

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

2) 当应用客户端重定向回我的重定向 URL (localhost) 时,我从 URL 中获取 code 查询参数,将其封装在一个PoolRequest,并将其提供给我的实用程序库。然后,如上所述,库将授权代码 (code) 发布到 TOKEN 端点以开始对返回的 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);
}

请注意,我在此处引用了 redirect 变量中的自定义方案重定向 URL,如上所述。

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

  • 使用我的实用程序库来交换令牌/用户身份的代码

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。