当前位置: 首页 > 知识库问答 >
问题:

代码更新:AWS Cognito用户标识池授权?目标-C

岳嘉悦
2023-03-14

所以我一直在试图弄明白这一点,但文档不够清晰。

我正在尝试使用AWS cognito用户池和联邦身份池。

在网上,他们说你可以连接这两个人,然后通过你的用户池验证用户,从你的身份池获得证书。现在我已经将它们连接起来,它显示为授权方法,但我无法弄清楚在目标c中要做什么才能让它工作。我只能让未经授权的用户进入我的联邦身份池,而不是授权用户。

我还负责用户池的所有工作(创建和验证用户),因此只需将他们放入联邦身份池中获取权限。

有人可以在objective-c中发布一个代码示例来说明如何实现它吗?或者带我走一下如何做的逻辑步骤?

我一直在看这些链接:http://mobile.awsblog.com/post/TxGNH1AUKDRZDH/Announcing-Your-User-Pools-in-Amazon-Cognito

如何将Cognito用户池与Facebook等外部提供商相结合?

几乎每一个aws链接

这里的问题的更新是一些代码:

我能够注册和验证用户,但是它没有在用户联合身份池的控制台上注册,只有未经身份验证。这是我的AWSServiceConfiguration的问题吗?(等)

这是我们用来创建用户的注册方法

RCT_EXPORT_METHOD(submitUser: (NSString*) email and:

                         (NSString*) gender and:

                         (NSString*) name and:

                         (NSString*) nickname and:

                         (NSString*) picture and:

                         (NSString*) phone_number and:

                         (NSString*) preferred_username and:

                         (NSString*) hashedPass and:

                         (RCTResponseSenderBlock)callback){



  AWSCognitoIdentityUserPool *pool = [AWSCognitoIdentityUserPool CognitoIdentityUserPoolForKey:@"UserPool"];





  NSMutableArray * attributes = [NSMutableArray new];

  AWSCognitoIdentityUserAttributeType * userEmail = [AWSCognitoIdentityUserAttributeType new];

  userEmail.name = @"email";

  userEmail.value = email;

  AWSCognitoIdentityUserAttributeType * userGender = [AWSCognitoIdentityUserAttributeType new];

  userGender.name = @"gender";

  userGender.value = gender;

  AWSCognitoIdentityUserAttributeType * userName = [AWSCognitoIdentityUserAttributeType new];

  userName.name = @"name";

  userName.value = name;

  AWSCognitoIdentityUserAttributeType * userNickname = [AWSCognitoIdentityUserAttributeType new];

  userNickname.name = @"nickname";

  userNickname.value = nickname;

  AWSCognitoIdentityUserAttributeType * userPicture = [AWSCognitoIdentityUserAttributeType new];

  userPicture.name = @"picture";

  userPicture.value = picture;

  AWSCognitoIdentityUserAttributeType * userPhone = [AWSCognitoIdentityUserAttributeType new];

  userPhone.name = @"phone_number";

  userPhone.value = phone_number;

  AWSCognitoIdentityUserAttributeType * userPreferredUsername = [AWSCognitoIdentityUserAttributeType new];

  userPreferredUsername.name = @"preferred_username";

  userPreferredUsername.value = preferred_username;



  [attributes addObject:userEmail];

  [attributes addObject:userGender];

  [attributes addObject:userName];

  [attributes addObject:userNickname];

  [attributes addObject:userPicture];

  [attributes addObject:userPhone];

  [attributes addObject:userPreferredUsername];


  NSMutableString *str = [NSMutableString string];

  [str appendString:name]; 

  [str appendString:name];

  NSString *immutableString = str;  // Change later to unique identifier


  [[pool signUp:immutableString password:html" target="_blank">hashedPass userAttributes:attributes validationData:nil]

   continueWithBlock:^id(AWSTask<AWSCognitoIdentityUser*> *task) {

    if (task.error) {

      RCTLog(@"Error: %@", task.error);

    }

    if (task.exception) {

      RCTLog(@"Exception: %@", task.exception);

    }

    if (task.result) {

      RCTLog(@"Successfully registered user: %@",task.result);

    }

    callback(@[[NSNull null],@NO]);

    return nil;  

      }];

}

使用电子邮件代码方法验证用户

RCT_EXPORT_METHOD(verifyUser:(nonnull NSString *)userName and:

                             (nonnull NSString *)code and:

                             (RCTResponseSenderBlock)callback) {



  AWSCognitoIdentityUserPool *pool = [AWSCognitoIdentityUserPool CognitoIdentityUserPoolForKey:@"UserPool"];

  AWSCognitoIdentityUser * user = [pool getUser:userName];




  [[user confirmSignUp:code] continueWithBlock:^id(AWSTask<AWSCognitoIdentityProviderConfirmSignUpResponse*> *task) {

    bool pass = NO;    

    if(task.error){

       RCTLog(@"Error: %@", task.error);

    }

    else if(task.exception){

       RCTLog(@"Exception: %@", task.exception);

    }

    else{

       RCTLog(@"Successfully confirmed user: %@",user.username); pass = YES;

    }

    // Return TRUE If Succead

    if(pass){

      callback(@[[NSNull null],@YES]);

    }

    else{

      callback(@[[NSNull null],@NO]);

    }

    return nil;

  }];


}

在Appdelegate.m中

AWSServiceConfiguration *serviceConfiguration = [[AWSServiceConfiguration alloc] initWithRegion:AWSRegionUSEast1 credentialsProvider:nil];

  AWSCognitoIdentityUserPoolConfiguration *configuration = [[AWSCognitoIdentityUserPoolConfiguration alloc]

                                                            initWithClientId:@"clientidhere"

                                                            clientSecret:@"clientsecrethere"

                                                            poolId:@"poolidhere"];



  [AWSCognitoIdentityUserPool registerCognitoIdentityUserPoolWithConfiguration:serviceConfiguration userPoolConfiguration:configuration forKey:@"UserPool"];



  AWSCognitoCredentialsProvider *credentialsProvider = [[AWSCognitoCredentialsProvider alloc]

                                                        initWithRegionType:AWSRegionUSEast1

                                                        identityPoolId:@"identitypoolIDhere"];







  AWSServiceConfiguration *config = [[AWSServiceConfiguration alloc] initWithRegion:AWSRegionUSEast1 credentialsProvider:credentialsProvider];

  [AWSServiceManager defaultServiceManager].defaultServiceConfiguration = config;



  [AWSSQS registerSQSWithConfiguration:config forKey:@"USWest2SQS"]; // Needed for sqs work throughout the app

共有1个答案

公孙令秋
2023-03-14

我解决了这个问题,提供了一个自定义标识提供商

@interface CustomIdentityProvider : NSObject <AWSIdentityProviderManager>
  @property (nonatomic, retain) NSDictionary *tokens;
  - (AWSTask *) logins;
@end

@implementation CustomIdentityProvider

- (AWSTask *) logins {
    AWSTask *task = nil;

    if (nil != self.tokens) {
        return [AWSTask taskWithResult:self.tokens];
    }

    return task;
}

@end

创建AWSCognitoCredentialsProvider时,需要分配identityProviderManager

self.identityProviderManager = [[CustomIdentityProvider alloc] init];

self.credentialsProvider = [[AWSCognitoCredentialsProvider alloc]
                            initWithRegionType:AWSRegionUSEast1
                            identityPoolId:self.identityPoolId
                             identityProviderManager:self.identityProviderManager];

一旦设置好了此项,就需要填充令牌字典。这是在调用getSession并获取AWSCognitoIdentityUserSession后完成的。

AWSCognitoIdentityUserSession *session;  // Obtained from getSession
NSString *userPoolName = [NSString stringWithFormat:@"cognito-idp.us-east-1.amazonaws.com/%@", self.poolId];
NSDictionary *dict = @{userPoolName : session.idToken.tokenString};
self.customIdentityProvider.tokens = dict;

假设您是通过API网关中的SDKGeneration功能生成AWSApigateway客户端代码,那么您应该已经做好了所有设置,可以作为经过身份验证的用户进行API网关调用。

(请注意,不要忘记配置您的联合身份,为经过身份验证的用户设置IAMS角色,以允许执行api:Invoke。)

 类似资料:
  • 我正在使用AWS Congito用户池进行帐户管理,其中Cognoto标识池将此用户池作为标识提供者。我用它来控制通过API网关对API的访问,API网关向Lambda发送请求。我的Lambda是使用Micronaut用Java8实现的。所有这些都很好。 在Lambda中,我从中的获得名称: 在Cognito标识符的字符串名称中返回的是什么。像这样的东西: us-east-1:xxxxe650-5

  • 我正在使用令牌式认证过程。客户端获得令牌后,它或者被设置在客户端的cookies中(对于Web),或者被设置在客户端请求的授权头中(对于移动设备)。但是,为了获得有效的令牌,客户端必须首先使用有效的用户名/密码组合“登录”。我的问题是: 通过在授权标头中发送用户名/密码组合与作为请求的JSON正文中的参数(假设我使用的是HTTPS)是否有任何额外的安全性? 我只需要在每次会话中发送用户名/密码组合

  • 我有一个混合移动应用程序使用AWS Javascript SDK与Amazon Cognito集成,使用Cognito用户池作为身份提供者。很管用。 我需要使用AWS API遍历数据以生成报告。一个关键部分是列出哪个用户(显示他们的用户名)与哪些项(与他们的认知身份相关联)相关联。

  • 我们正在研究为我们的应用程序使用用户池。我想用REST的方式来尝试API。https://docs.aws.amazon.com/cognito-user-identity-pools/lates/apireference/welcome.html中的文档不像其他文档那样有请求和响应示例。寻找SignUp、ResendConfirmationCode、ChangePassword和ConfirmS

  • 我想我获得了使用授权代码授予类型的OAuth2流。资源所有者登录到服务器,然后使用授权代码重定向到客户端。然后客户端使用授权代码向授权服务器查询访问令牌和刷新令牌。这就是我困惑的地方。 当访问令牌过期时,客户端应该使用授权码还是刷新令牌来获取新的访问令牌?如果您有授权代码,为什么要使用刷新令牌? 注:我并不是在找一个回答说“刷新令牌是可选的”,因为我正在为amazon-alexa编写这个服务器,这

  • 我喜欢通过基于Java的AWS-CDK版本0.24.1创建cognito用户池。在我收到了InvalidParameterException错误。 服务:AWSCognitoIdentityProvider 状态代码:400 错误代码:ValueDealPosialExtExc:Qualito无效属性DATABATYPE输入,考虑使用提供的属性数据类型枚举 可能使用自动验证属性(Arrays.as