AWS Cognito 用户身份验证

Posted

技术标签:

【中文标题】AWS Cognito 用户身份验证【英文标题】:AWS Cognito User Authentication 【发布时间】:2017-01-02 18:34:05 【问题描述】:

好的。这是我的事。

我们正在 Lumen/Laravel 之上构建一个小型应用程序。我们需要 AWS cognito 完全负责用户管理。

基本上 2 个简单的功能。

    根据用户注册请求将用户详细信息推送到 AWS cognito 用户池。 根据登录请求,使用简单的电子邮件/手机和密码针对 cognito 用户池对用户进行身份验证。

我们需要使用 php 来做到这一点。

现在的问题是,我无法找到任何具有清晰过程或示例的 PHP API 文档。 Cognito 只为 androidios、JS、Unity 和 Xamarian 提供 API。我需要类似的 PHP 文档。

谁有使用 cognito API 和 PHP 的上述 2 个功能的工作示例。

注意:我几乎花了一天半的时间来弄清楚是否以及如何做到这一点。因此,请不要向我发送任何出现在您的谷歌搜索中的第一个或第二个链接。很有可能我已经看到了这个链接,但没有运气。

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

很遗憾,没有适用于 PHP 的示例。 目前 Cognito 支持您提到的那些高级 SDK,但不支持 PHP 的高级 SDK。底层SDK可以通过调用下面提到的API来使用。

http://docs.aws.amazon.com/aws-sdk-php/v3/api/class-Aws.CognitoIdentityProvider.CognitoIdentityProviderClient.html

下面的示例应该与 PHP 的一些转换一起工作,这个 SDK 中的大部分代码也应该如此 https://github.com/aws/aws-sdk-android/blob/master/aws-android-sdk-cognitoidentityprovider/src/main/java/com/amazonaws/mobileconnectors/cognitoidentityprovider/CognitoUser.java

您可能希望使用 ADMIN_NO_SRP_AUTH 参数调用 AdminInitiate auth API,而不是调用 InitiateAuth,这样您就不需要在 PHP 中进行 SRP 计算。高级 SDK 提供了一个围绕此计算的包装器,可以为您管理它,但您自己做这件事非常困难。

【讨论】:

或许有帮助:github.com/pallant/laravel-aws-cognito-auth 和 github.com/aws/aws-sdk-php【参考方案2】:

为了能够使用任何 API 请求,您首先需要正确设置您的凭据。在服务器端和 EC2 实例之外进行操作,您需要像这样提供您的 AWS ACCESS KEY 和 AWS SECRET ACCESS KEY、应用程序客户端 ID、应用程序客户端密钥和用户池 ID

$args = [ 
'credentials' => [
    'key' => 'AAAAAAAAAA',
    'secret' => 'abacaaswfas',
],
'region' => 'eu-central-1',
'version' => 'latest',

'app_client_id' => '3asd123adfs1231sdfs',
'app_client_secret' => '1sdf123sdfs123sdfsfsdf132fd3213',
'user_pool_id' => 'eu-central-1_aaaW2Df3',
]

否则,在您获得正确的 ID 之前,您将看到所有可能的错误。

要获取 AWS ACCESS KEY 和 AWS SECRET ACCESS KEY,请转到您的 AWS 控制台,单击您的姓名,然后转到帐户,然后再次单击您的姓名,转到“我的安全凭证”然后我猜你会找到出路的..

要获取 App 客户端 ID、App 客户端 Secret,您需要先创建用户池,然后转到 App Client 并创建一个。 (您可以在常规设置下找到池 ID)

一个简单的登录查询

$client = new CognitoIdentityProviderClient($args);
$client->adminInitiateAuth([
            'AuthFlow' => 'ADMIN_NO_SRP_AUTH',
            'AuthParameters' => [
                'USERNAME' => YOUR_USERNAME_HERE,
                'PASSWORD' => YOUR_PASS_HERE,
                'SECRET_HASH' => , base64_encode(hash_hmac('sha256', YOUR_USERNAME_HERE . APP_CLIENT_ID, APP_CLIENT_SECRET, true))
            ],
            'ClientId' => APP_CLIENT_ID,
            'UserPoolId' => USER_POOL_ID,
        ]);

如果你让它工作,你应该能够使用文档here中列出的任何操作

注意:这适用于 API 版本 2016-04-18 和 PHP 7.1,请确保您使用的是相同版本或至少没有重大变化在假设这对你有用之前,在 API 中。

注意 2:我使用的 Id 是完全随机的 .. 但它们应该具有相同的格式。

【讨论】:

以上是关于AWS Cognito 用户身份验证的主要内容,如果未能解决你的问题,请参考以下文章

如何配置 AWS 用户 cognito 身份验证流程以在 Java sdk 后端生成身份令牌、访问令牌?

有啥方法可以限制 IAM 用户/假定角色在 AWS cognito 中启用未经身份验证的用户身份?

已通过身份验证的 Cognito 用户访问 DynamoDB 表的 AWS IAM 策略问题

使用 aws amplify cognito 的自定义身份验证流程

AWS - JavaScript - 具有经过身份验证的 Cognito 用户对 DynamoDB 的 CRUD 操作

在 Graphql 操场上使用 AWS Cognito 用户池对 AppSync 突变进行身份验证