AWS Cognito集成swift3 Refresh提供ResourceNotFoundException



答案如下:https://github.com/aws/aws-sdk-ios/issues/357在最底部有一个关于快速和认知工作的迷你指南。

我已经做了一个AWSCustomIdentityProvider:

import Foundation
import AWSCognitoIdentityProvider
import AWSCognito
class AWSCustomIdentityProvider: NSObject, AWSIdentityProviderManager
{
private var dict = NSDictionary()
func addToken(value:NSString)
{
    dict = ["graph.facebook.com":value]
}
public func logins() -> AWSTask<NSDictionary>
{
    return AWSTask(result: dict)
}
}

我有一个从facebook登录的方法:

public func loginButtonDidCompleteLogin(_ loginButton: FacebookLogin.LoginButton, result: FacebookLogin.LoginResult){
    switch result {
    case .failed(let error):
        print("FACEBOOK LOGIN FAILED: (error)")
    case .cancelled:
        print("User cancelled login.")
    case .success(_, _, let accessToken):

        let customIdentity = AWSCustomIdentityProvider()
        let token = accessToken.authenticationToken
        customIdentity.addToken(value: token as NSString)
        let credentialsProvider = AWSCognitoCredentialsProvider(regionType: REGIONTYPE, identityPoolId: "XXXXXXXXXXXXXXXXXXXXXXX", identityProviderManager:customIdentity)
        credentialsProvider.clearKeychain()
        credentialsProvider.clearCredentials()
        let serviceConfiguration = AWSServiceConfiguration(region: REDIONTYPE, credentialsProvider: credentialsProvider)
        AWSServiceManager.default().defaultServiceConfiguration = serviceConfiguration;
        credentialsProvider.getIdentityId().continue( { (task: AWSTask!) -> AnyObject! in
            if (task.error != nil) {
                print("Error: " + (task.error?.localizedDescription)!)// gets called
            }
            else {
                print(task.result)//identityid
            }
            return nil
        })
    }
}

但是我得到错误:

= com.amazonaws误差域。AWSCognitoIdentityErrorDomain Code=8 "(null)"UserInfo={__type=NotAuthorizedException, message=登录不匹配。请包含此身份或身份池的至少一个有效登录。}

请让我知道如果你有任何想法如何解决我的问题。我也尝试遵循文档并直接设置登录"credentialsProvider"。登录= {"graph.facebook.com": mytoken}

,在调用lambda方法时产生不同的异常,但确实正确检索了identityID。然而,根据文档进行操作会发出警告,我正在使用的方法已被弃用。

我得到的错误:

UserInfo={NSLocalizedDescription=序列化对象既不是有效的json对象也不是NSData对象:}

然而,这只是偶尔发生。如果我重试,那么我可以潜在地获得身份id,但在调用lambda方法时,我得到相同的错误。我猜这是认知问题。

如果我在第一部分使用AWSCognitoLoginProviderKey.facebook.rawValue而不是graph.facebook.com,那么它会给我cognito ID,然后我调用lambda方法。我将包含lambda方法,以防这是我出错的部分但我很确定这是阻止我调用lambda方法的认知:

import AWSLambda
import Foundation
struct AWSHelper{
let lambda = AWSLambda.default()
let APPLICATION_NAME = "MYAPPLICATION"
init(){
}
func getFunctionName(funcName: String) -> String{
    return "(funcName)_(APPLICATION_NAME)"
}
func login(facebookID: String, cognitoID:String, callback:@escaping (Bool) -> Void){
    let req = AWSLambdaInvocationRequest();
    req?.invocationType = AWSLambdaInvocationType.requestResponse
    req?.payload = ["cognitoID" : cognitoID, "facebookID" : facebookID]
    req?.functionName = getFunctionName(funcName: "MYFUNCNAME")
    lambda.invoke(req!) { (response: AWSLambdaInvocationResponse?,error: Error?) in
        print(error)
        let payload = response?.payload
        print(payload)
        callback(true)
    }
}
}

更新2

我发现调用这样的刷新方法:

credentialsProvider.credentials().continue({ (task: AWSTask!) -> Any? in
            print(task.result)
        })

导致如下错误:

AWSiOSSDK v2.4.10 [Error] AWSCredentialsProvider。__44-[AWSCognitoCredentialsProvider凭据]_block_invoke. m行:577 | __44352 |无法刷新。错误是[Error Domain=com.amazonaws]。AWSCognitoIdentityErrorDomain Code=10 "(null)"UserInfo={__type=ResourceNotFoundException, message=Identity 'us-east-1:0db18266-1baa-4c59-9110-f9041dc92ead' not found.}]

我相信看起来像identitypoolID的大字符串实际上是我所拥有的给定用户的identityID,所以cognito已经分发了一个ID,但无法查询它?

错误:

登录不匹配。请包含此身份或身份池的至少一个有效登录

也可能发生,因为您试图以另一个用户身份登录而没有注销,因此将登录字典中的令牌与不同身份的identityId进行比较(并且不匹配)。在这种情况下,SDK通常通过重试,清除和重新建立identityId来恢复,然后它就可以工作了。

但是在您的情况下,由于您正在构建自己的登录字典,因此问题更有可能是您构建了一个不匹配的令牌。您可以使用https://jwt.io检查令牌。(虽然我承认它适用于谷歌和cognito用户池,但不适用于facebook令牌(我不知道为什么)),

I think doesn't match表示identityId记录的唯一用户与令牌中指定的不同。

您确定令牌是正确构造的吗?

如你所述…文档. .嗯. .我发现文档不值得看,所以我设置了我的项目,这样我就可以检查工作代码和设置断点。

下面是来自Mobile Hub Helper的Facebook AWSSignInProvider的代码片段,它显示了它们用来获取令牌(token.tokenstring)的方法。

    - (AWSTask<NSString *> *)token {
    FBSDKAccessToken *token = [FBSDKAccessToken currentAccessToken];
    NSString *tokenString = token.tokenString;
    NSDate *idTokenExpirationDate = token.expirationDate;
    if (tokenString
        // If the cached token expires within 10 min, tries refreshing a token.
        && [idTokenExpirationDate compare:[NSDate dateWithTimeIntervalSinceNow:AWSFacebookSignInProviderTokenRefreshBuffer]] == NSOrderedDescending) {
        return [AWSTask taskWithResult:tokenString];
    }
    AWSTaskCompletionSource *taskCompletionSource = [AWSTaskCompletionSource taskCompletionSource];
    [FBSDKLoginManager renewSystemCredentials:^(ACAccountCredentialRenewResult result, NSError *error) {
        if (result == ACAccountCredentialRenewResultRenewed) {
            FBSDKAccessToken *token = [FBSDKAccessToken currentAccessToken];
            NSString *tokenString = token.tokenString;
            taskCompletionSource.result = tokenString;
        } else {
            taskCompletionSource.error = error;
        }
    }];
    return taskCompletionSource.task;
}

也……值得一提的是。AWSIdentityManager和它关联的AWSSignInProviders是一个很好的架构,用于登录Facebook和Google。即使您不使用Mobile Hub Helper的其余部分。为什么要重新发明轮子,他们在laws -mobilehub-helper-ios的身份部分做得非常好

我在github上发布了该库的一个版本,该版本也为Cognito用户池添加了AWSSignInProvider。sign -awsmhh它需要在aws-mobilehub-helper-ios中进行一些修复,以使用认知用户池,它们在这里是aws-mobilehub-helper-ios(因此,如果你克隆——递归,你将设置使用库中的断点进行调试)。

我认为有几件事使它起作用。

我通过制作我自己的identityprovidermanager做出了正确的举动,我认为阻止我执行lambda方法的主要原因实际上是我使用的是AWSLambda而不是AWSLambdaInvoker。在我转换后,它开始出现有意义的错误。

相关内容

  • 没有找到相关文章

最新更新