【问题标题】:How to get Cognito user pool "sub" attribute on iOS如何在 iOS 上获取 Cognito 用户池“子”属性
【发布时间】:2017-08-25 22:18:16
【问题描述】:

我正在使用“Cognito 用户池授权方”(无“AWS_IAM”选项,无自定义编码授权方)通过 API Gateway 调用 Lambda 方法并识别登录 iOS 客户端的用户。

在 Lambda 上,我使用通过 event.requestContext.authorizer.claims.sub 从 Cognito 用户池授权方获得的用户 ID(将用户 ID 与一些 DynamoDB 项目一起存储)。

我现在需要将其与 iOS 客户端中登录用户的 id 进行比较。

我找到了[AWSIdentityManager defaultIdentityManager].identityId,但这(显然)返回了他 IdentityID(我可以在 Cognito 的 AWS 控制台中查找 --> Federated Identities --> Identity Browser),这与我在 Cognito 中看到的“子”ID 不同 --> 用户池 --> 用户和组

我可以通过 AWS iOS 开发工具包获取“子”吗?

如果我无法获取它,我应该使用什么其他 id 参数来在 Lambda 和客户端上检索以识别当前客户端用户/发出 API 请求的用户?

【问题讨论】:

  • 嗨@bob-kinney,您100% 确定“它与API-Gateway 或Lambda 无关”吗?请注意我的最后一句话:“如果我不能得到它,我应该使用什么其他 id 参数,我可以在 Lambda 和客户端上检索来识别当前客户端用户/发出 API 请求的用户?”我假设如果你 100% 确定,那么你一定知道答案,但如果你不是,你为什么要删除标签? ;-)
  • 我可能在删除标签时过于仓促而忽略了您的最后一句话。无论如何,Cognito 团队的某个人应该能够回答您的问题。

标签: ios amazon-web-services amazon-cognito


【解决方案1】:

看来我必须通过这样的用户详细信息专门请求属性:

AWSCognitoIdentityUserPool *pool = [AWSCognitoIdentityUserPool CognitoIdentityUserPoolForKey:AWSCognitoUserPoolsSignInProviderKey];
AWSCognitoIdentityUser *user = [pool currentUser];

NSString *mySub;

[[user getDetails] continueWithBlock:^id _Nullable(AWSTask<AWSCognitoIdentityUserGetDetailsResponse *> * _Nonnull task) {
    if(!task.error){
        AWSCognitoIdentityUserGetDetailsResponse *response = task.result;
        NSArray<AWSCognitoIdentityProviderAttributeType*> *userAttributes = response.userAttributes;
        for (AWSCognitoIdentityProviderAttributeType *attr in self.userAttributes) {
            if ([attr.name isEqualToString:@"sub"]) {
                mySub = attr.value;
            }
        }
    } else {
        NSLog(@"Error fetching Cognito User Attributes: %@", task.error.localizedDescription);
    }
}];

【讨论】:

    【解决方案2】:

    另一种解决方案(使用 AWS JavaScript SDK 测试):

    当我们使用 Cognito 进行身份验证时,我们可以检索 JWT 令牌:

    user.authenticateUser(authenticationDetails, {
        onSuccess: (result) => resolve(result.getIdToken().getJwtToken()),
        onFailure: (err) => reject(err)
    })
    

    恰好这个 JWT 令牌是一个可以解码的标准对象。

    使用Auth0 JWT decode (npm install jwt-decode),我们可以解码此令牌并检索所有用户属性(电子邮件、用户名等)和sub

    var jwtDecode = require('jwt-decode');
    var decoded = jwtDecode(token);
    console.log(decoded);
    
    // prints sub, email, username, ...
    

    【讨论】:

      猜你喜欢
      • 2019-01-06
      • 2017-08-12
      • 1970-01-01
      • 2019-05-08
      • 2020-04-21
      • 2022-01-21
      • 2020-10-07
      • 2021-06-02
      • 2018-08-25
      相关资源
      最近更新 更多