繁体   English   中英

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

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

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

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

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

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

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

2)当应用程序客户端重定向回我的重定向 URL ( localhost ) 时,我从 URL 中获取code查询参数,将其包装在PoolRequest中,并将其提供给我的实用程序库。 然后,如上所述,库将向 TOKEN 端点发布授权代码( code ),以开始对返回的 JWT 的解码过程。

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

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

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

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

  • 使用自定义 URL 方案在 Cognito 应用程序客户端中注册新的重定向 URL。 例如: myapp://login
  • 在绑定到我的登录视图的视图 model 中创建两个命令。
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 特定项目中的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")提取。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM