AWS Cognito用户身份验证

时间:2016-08-26 07:08:26

标签: php laravel amazon-web-services lumen amazon-cognito

行。这是我的事。

我们正在Lumen / Laravel之上构建一个小应用程序。我们需要AWS Cognito完全照顾用户管理。

基本上有2个简单的功能。

  1. 根据用户注册请求将用户详细信息推送到AWS cognito用户池。
  2. 在登录请求时使用简单的电子邮件/手机和密码对Cognito用户池进行身份验证。
  3. 我们需要使用PHP来做到这一点。

    现在的问题是,我无法找到任何带有明确程序或示例的PHP API文档。 Cognito提供API;仅适用于Android,IOS,JS,Unity和Xamarian。我需要一个类似的PHP文档。

    有人使用带有PHP的cognito API,只有上述2个功能的工作示例。

    注意:我差不多花了一天半的时间来确定是否以及如何做到这一点。所以请不要向我发送任何在谷歌搜索中出现第一或第二的链接。很可能我可能已经看到没有运气的链接。

    任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:8)

不幸的是,没有PHP的工作示例。 目前,Cognito支持您提到的高级SDK,但不支持PHP的高级SDK。可以通过调用下面提到的API来使用低级SDK。

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提供了围绕此计算的包装器,可以为您管理它,但是单独执行它非常困难。

答案 1 :(得分:0)

为了能够使用任何API请求,您首先需要正确设置凭据。在服务器端和外部EC2实例上进行操作,您将需要提供 AWS ACCESS KEY和AWS SECRET ACCESS KEY,App客户端ID,App客户端密钥和用户池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客户端密钥,您需要先创建用户池,然后转到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完全是随机的..但它们应具有相同的格式。