【问题标题】:Cognito Authentication working but errors show?Cognito 身份验证工作但显示错误?
【发布时间】:2016-01-18 14:53:04
【问题描述】:

基本上,我使用开发人员身份验证身份来验证我的用户。即使显示此错误:

AWSiOSSDKv2 [详细] AWSURLResponseSerialization.m 行:87 | -[AWSJSONResponseSerializer responseObjectForResponse:originalRequest:currentRequest:data:error:] |回复正文: [{"__type":"InvalidParameterException","message":"请提供一个 有效的公共提供者"}] 2015-10-20 17:50:19.251 BusyTime[56549:7365231] AWSiOSSDKv2 [错误] AWSCredentialsProvider.m 行:435 | __73-[AWSCognitoCredentialsProvider getCredentialsWithCognito:authenticated:]_block_invoke | GetCredentialsForIdentity 失败。错误是[错误 Domain=com.amazonaws.AWSCognitoIdentityErrorDomain Code=7 "的 操作无法完成。 (com.amazonaws.AWSCognitoIdentityErrorDomain 错误 7。)“ UserInfo=0x7f9d9342dde0 {__type=InvalidParameterException, message=请提供有效的公共提供商}]

虽然显示此错误,但我仍然返回我的 identityId 和 Token 并成功调用需要经过身份验证的权限才能调用的 lambda 方法。我相信这与我的刷新方法有关,但我不确定。请帮我处理这个错误。

我的凭据提供程序代码:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    [AWSLogger defaultLogger].logLevel = AWSLogLevelVerbose;
    id<AWSCognitoIdentityProvider> identityProvider = [[BusytimeAuthenticated alloc] initWithRegionType:AWSRegionUSEast1
                                                                                             identityId:nil
                                                                                         identityPoolId:@"EXAMPLEPOOLID"
                                                                                logins:@{@"login.busytimeapp": [defaults objectForKey:@"username"]}
                                                                                           providerName:@"login.busytimeapp"
                                                       ];

    credentialsProvider = [[AWSCognitoCredentialsProvider alloc] initWithRegionType:AWSRegionUSEast1
                                                                   identityProvider:identityProvider
                                                                      unauthRoleArn:nil
                                                                        authRoleArn:nil];

    configuration = [[AWSServiceConfiguration alloc] initWithRegion:AWSRegionUSEast1
                                                credentialsProvider:self.credentialsProvider];
    AWSServiceManager.defaultServiceManager.defaultServiceConfiguration = configuration;
    [[credentialsProvider refresh] continueWithBlock:^id(BFTask *task){
        [self testAuth];
        return nil;
    }];

我的刷新方法:

- (BFTask *)refresh {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    if (![self authenticatedWithProvider]) {
        return [super getIdentityId];
    }else{
        NSDictionary *post = [[NSDictionary alloc] initWithObjectsAndKeys:
                              [defaults objectForKey:@"username"], @"username",
                              [defaults objectForKey:@"password"], @"password",
                              nil];
        NSError *error;
        NSData *postData = [NSJSONSerialization dataWithJSONObject:post options:0 error:&error];
        NSString *postLength = [NSString stringWithFormat:@"%lu", (unsigned long)[postData length]];
        NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
        [request setURL:[NSURL URLWithString:@"SOMEURL"]];
        [request setHTTPMethod:@"POST"];
        [request setValue:postLength forHTTPHeaderField:@"Content-Length"];
        [request setHTTPBody:postData];
        NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
        __block BOOL isLogged = false;
        [[session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
            NSDictionary *newJSON = [NSJSONSerialization JSONObjectWithData:data
                                                                    options:0
                                                                      error:&error];
            isLogged = true;
            if(!newJSON){
                NSLog(@"DID NOT AUTHENTICATE");
            }else{

            self.identityId = [newJSON objectForKey:@"IdentityId" ];
            self.token = [newJSON objectForKey:@"Token" ];
            NSLog(@"Result: %@", newJSON);
            }

        }] resume];

        return [super getIdentityId];

    }
    return [super getIdentityId];
}

【问题讨论】:

    标签: ios authentication amazon-cognito


    【解决方案1】:

    这里的问题是您将登录映射中的登录提供程序名称作为键传递。对于开发人员身份验证,您不能这样做。

    相反,您应该在地图中使用 Cognito 身份提供商名称 cognito-identity.amazonaws.com,就像 documentation 中所说的那样。这应该可以解决您的异常。

    【讨论】:

    • 你能通过代码给我一个例子吗?我对此有点困惑
    • 如果你的意思是这样的:logins:@{@"cognito-identity.amazonaws.com": [defaults objectForKey:@"username"]} 当我切换它时我得到这个错误:AWSiOSSDKv2 [错误] AWSCredentialsProvider.m 行:534 | __40-[AWSCognitoCredentialsProvider 刷新]_block_invoke350 |无法刷新。错误是 [错误域 = com.amazonaws.AWSCognitoIdentityErrorDomain 代码 = 9“操作无法完成。(com.amazonaws.AWSCognitoIdentityErrorDomain 错误 9。)” UserInfo = 0x7fc7084f7ed0 {__type = NotAuthorizedException,消息 = 无效登录令牌。}]
    • 是的,这就是我的意思。错误状态为“无效的登录令牌”,这意味着您在登录映射中传递的令牌无效。此令牌应该是您后端提供的令牌,由名为 GetOpenIdTokenForDeveloperIdentity 的 Cognito API 生成。您必须使用 AWS 开发人员凭证从后端调用此 API。
    • 谢谢,它适用于以下代码:logins:@{@"cognito-identity.amazonaws.com": [defaults objectForKey:@"Token"]} providerName:@"cognito-identity.amazonaws .com”
    • 设置 login.busytimeapp 的目的是什么?
    猜你喜欢
    • 2019-06-11
    • 2018-01-29
    • 2019-02-20
    • 1970-01-01
    • 2017-10-11
    • 2020-04-28
    • 2016-10-06
    • 2018-05-08
    • 2016-06-25
    相关资源
    最近更新 更多