首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AWS认知集成swift3 Refresh提供ResourceNotFoundException

AWS认知集成swift3 Refresh提供ResourceNotFoundException
EN

Stack Overflow用户
提问于 2016-10-27 14:46:01
回答 2查看 642关注 0票数 0

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

我做了一个这样的AWSCustomIdentityProvider:

代码语言:javascript
复制
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的登录方法:

代码语言:javascript
复制
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
        })
    }
}

然而,我得到了错误:

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

如果你对如何解决我的问题有任何想法,请告诉我。我还尝试跟踪这些文档并直接设置登录"credentialsProvider.logins = {"graph.facebook.com":mytoken}

这会在调用lambda方法时产生不同的异常,但确实正确地检索了identityID。但是,按照docs的做法发出警告,我正在使用的方法是不推荐的。

我所犯的错误:

UserInfo={NSLocalizedDescription=serialized对象既不是有效的json对象,也不是NSData对象:}

然而,这种情况有时才会发生。如果我重试,那么我可能会获得标识id,但是在调用lambda方法时,我会得到相同的错误。我认为这是一个认知问题。

更新

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

代码语言:javascript
复制
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

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

代码语言:javascript
复制
credentialsProvider.credentials().continue({ (task: AWSTask!) -> Any? in
            print(task.result)
        })

导致这样的错误:

AWSiOSSDK v2.4.10错误的AWSCredentialsvecProvider.m行:577 x_44- AWSCredentialsProvider.m credentials_block_invoke.352无法刷新。错误是错误Domain=com.amazonaws.AWSCognitoIdentityErrorDomain Code=10 "(null)“UserInfo={__type=ResourceNotFoundException,未找到message=Identity __type=ResourceNotFoundException。}

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-07 18:27:06

我想几乎没有什么东西能让它发挥作用。

我通过创建自己的身份提供管理器做出了正确的举动,我认为阻止我执行lambda方法的主要原因实际上是我使用的是AWSLambda而不是AWSLambdaInvoker。在我切换后,它开始犯一些有意义的错误。

票数 0
EN

Stack Overflow用户

发布于 2016-11-06 07:10:30

错误:

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

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

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

我认为不匹配意味着identityId记录与令牌中指定的不同的唯一用户。

您确定令牌构造正确吗?

正如你提到的..。文件..。嗯..。我发现这些文档不值得一看,所以我设置了我的项目,这样我就可以检查工作代码并设置断点。

以下是Mobile的Facebook AWSSignInProvider的代码片段,其中显示了他们用来获取令牌(token.tokenstring)的内容。

代码语言:javascript
复制
    - (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签约的一个很好的架构。即使您不使用其他移动集线器帮助。为什么要重新发明轮子,他们在aws-ios的身份部分做得很好。

我在github上发布了这个库的一个版本,它也为认知用户池添加了一个AWSSignInProvider。艾斯姆,它需要在aws ios中使用aws-移动中心-助手-ios (所以如果您克隆做一个克隆--递归的,您将被设置为使用库中的断点进行调试)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40287670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档