开发人员验证身份与亚马逊

时间:2016-02-12 15:23:44

标签: ios authentication amazon-dynamodb aws-lambda amazon-cognito

我对亚马逊并不熟悉,所以几乎没有问题:

我想使用我自己的自定义backEnd解决方案使用Cognito为亚马逊上的用户执行登录。找到this可能的解决方案。注册并登录后,此backEnd返回

{
    identityId = "eu-xxxx-x:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx";
    login = 1;
    token = "eyJraWQiOiJldS13ZXN0LTExIiwidHlwIjoiSldTIiwiYWxnIjoiUlM1MTIifQ.eyJzdWIiOiJldS13ZXN0LTE6NGFmNDdmMWItZDNmOC00NmZkLWI2MzEtZGE2OGU3ZmRmYzE1IiwiYXVkIjoiZXUtd2VzdC0xOjIwNjBiZDc3LWEwNDAtNGI4OC05MDU4LTczMGY3Y2RmNGQyZSIsImFtciI6WyJhdXRoZW50aWNhdGVkIiwibG9naW4ud3A0Lm15YXBwIiwibG9naW4ud3A0Lm15YXBwOmV1LXdlc3QtMToyMDYwYmQ3Ny1hMDQwLTRiODgtOTA1OC03MzBmN2NkZjRkMmU6a2lyaWxsLmdlQGdtYWlsLmNvbSJdLCJpc3MiOiJodHRwczovL2NvZ25pdG8taWRlbnRpdHkuYW1hem9uYXdzLmNvbSIsImV4cCI6MTQ1NTI5MDA5OSwiaWF0IjoxNDU1Mjg5MTk5fQ.FGnBUEQZ3wDENFNa_g29l2UhlIAklBnLdqpMomSE3_ayesNV1dqGyzAMQCvwyr4XdJpB3lI0KF-k3wc4t8BKPYg5QKrZ-q-aNkjwp34tHFMIr8vGw4vbZiKB6XnGMRghYSbPtuwwFG80ibZMAAXik4nld8sGxoQSrCjTubPKU4I9Mzi6lJQsDGAZxmm56E2lVSeBw2nZbE1iwRDhJf6hHJsKOLceDDtWoknRX3NHeNuoueNLS1JrbphD8wVqejxhEjrK-qucoUL_uj81GxYUkyONQtu-3B79epsXIsxvU_zW1MwVufFg5p5ID83F1Cic77QkzF2FJnEJIadEG6R_yw";
}

我想要关注此guide。但根据这个,我应该提供IdentityProviderName和令牌,并在任何社交登录后设置它:

credentialsProvider.logins = @{
    @(AWSCognitoLoginProviderKeyFacebook): token
};

作为IdentityProviderName,我使用了config.json

中设置的名称
"DEVELOPER_PROVIDER_NAME": "<ProviderName>"

但是我没有任何提供者的例外

  

AWSCognitoCredentialsProvider   getCredentialsWithCognito:authenticated:] _ block_invoke |   GetCredentialsForIdentity失败。错误是[错误   Domain = com.amazonaws.AWSCognitoIdentityErrorDomain Code = 8&#34;(null)&#34;   UserInfo = {__ type = InvalidParameterException,message =请提供一个   有效的公共提供者}]

当我去IAM Console创建providerID时,它要求我选择提供者类型(OpenID或SAML)

enter image description here

所以我真的不明白我到底应该放在哪里?选择什么类型。

对于服务器我使用Lambda服务和DynamoDB服务,对于使用S3的网页。

根据this流程:

enter image description here

我已经完成了前4个步骤并且我在5步上堆叠,所以我只需要将这些数据发送到Cognito(不需要准备我的自定义开发者提供者,因为我已经有了idendityID和令牌,那看起来很像像是不正确的。)

结果

enter image description here

开发人员Auth - 仅用于lambda的登录方法但是当我尝试使用DynamoDB时,用户不是auth。

添加了所有角色 - 目前我为Unath用户添加临时角色

 {
        "Sid": "DynamoDBPolicy",
        "Effect": "Allow",
        "Action": [
            "dynamodb:*"
        ],
        "Resource": [
            "*"
        ]
    }

所有的作品(呵呵)但它并不是很好

问题 - 如何使用我的backEnd解决方案中收到的令牌将Cognito DevAuth置于Lambda上?我错过了什么吗?

更新

感谢@Rachit Dhall

AWSCognitoIdentity *cognitoIdentity = [AWSCognitoIdentity defaultCognitoIdentity];
AWSCognitoIdentityGetCredentialsForIdentityInput *input = [[AWSCognitoIdentityGetCredentialsForIdentityInput alloc] init];
input.identityId = [task.result valueForKey:@"identityId"];
input.logins = @{
                 @"cognito-identity.amazonaws.com" : [task.result valueForKey:@"token"]
                 };

[cognitoIdentity getCredentialsForIdentity:input completionHandler:^(AWSCognitoIdentityGetCredentialsForIdentityResponse * _Nullable response, NSError * _Nullable error) {

            //how to update my configuration for AWS with 
            //AWSCognitoIdentityCredentials object?
        }];

但不确定如何处理响应中收到的AWSCognitoIdentityCredentials - 如何更新我的配置?

下一步还有:

enter image description here

这是否意味着没有其他办法?还是错过了什么?

1 个答案:

答案 0 :(得分:1)

显示有效的公共提供程序问题的错误是因为您使用登录提供程序调用GetCredentialsForIdentity。但是,流程是你从后端调用GetOpenIdTokenForDeveloperIdentity,你得到一个令牌作为响应。然后,要获取凭据,请使用logins参数中的密钥cognito-identity.amazonaws.com调用GetCredentialsForIdentity,并将值作为从上一次调用中收到的令牌。

更新

要确保Amazon Cognito销售的Amazon DynamoDB uses credentials,您可以使用凭据提供程序创建默认的AWSServiceConfiguration,并使用它来初始化客户端。

// create a configuration that uses the provider
AWSServiceConfiguration *configuration = [AWSServiceConfiguration configurationWithRegion:AWSRegionUSEast1 provider:credentialsProvider];

// get a client with the default service configuration
AWSDynamoDB *dynamoDB = [AWSDynamoDB defaultDynamoDB];