我几乎已经完成了使用AWS进行开发人员身份验证登录的流程。我似乎无法验证我收到的后端令牌,似乎无法找到通过第三方后端执行开发人员身份验证的任何当前实现。我得到的错误如下所示。
截至目前,我的代码如下所示:
包含自定义标识提供程序的类:
import Foundation
import AWSCognitoIdentityProvider
class CustomIdentityProvider: NSObject, AWSIdentityProviderManager {
var tokens: [NSString: NSString]?
init(tokens: [NSString: NSString]) {
self.tokens = tokens
}
@objc func logins() -> AWSTask<NSDictionary> {
return AWSTask(result: tokens! as NSDictionary)
}
}
AWS-APIManager.swift {snippet}
/* obtained cognito token from my back-end via getOpenIdTokenForDeveloperIdentity*/
/* From here I my app receives an IdentityId and Token */
let client_cognito_id = String(describing: valid_response)
let session_token = json.dictionaryValue["Token"]!
let login_with_amazon = NSString(string: "cognito-identity.amazonaws.com")
let token = NSString(string: String(describing: session_token))
let customProviderManager = CustomIdentityProvider(tokens: [login_with_amazon: token])
let credentialsProvider = AWSCognitoCredentialsProvider(
regionType: self.AWS_REGION,
identityPoolId: "us-east-1:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
identityProviderManager: customProviderManager
)
credentialsProvider.setIdentityProviderManagerOnce(customProviderManager)
credentialsProvider.getIdentityId().continue ({ (task: AWSTask!) -> AnyObject! in
if (task.error != nil) {
print("Error!!!: " + (task.error?.localizedDescription)!)
} else {
// the task result will contain the identity id
let cognitoId = task.result
print(cognitoId)
print("SUCCESS!!!")
}
return nil
})
}
由于奇怪的原因,我无法验证我收到的令牌。我收到错误“无效的登录令牌。无法传入Cognito令牌。”。我试图按照文档和拼凑工作代码,我已经找到了数百个源代码,似乎无法通过这部分身份验证过程。任何帮助将不胜感激。谢谢!
答案 0 :(得分:0)
我认为这里的问题是,虽然您提供令牌,但您没有设置从后端获取的身份ID。因此,它使用Cognito OpenIdConnectToken调用GetId,但不支持。
Developer Authenticated Identities最简单的客户端实现是扩展AWSCognitoCredentialsProviderHelper
在Objective C而不是Swift中提供此内容的道歉。在您的实现中,只需覆盖令牌方法。
- (AWSTask<NSString *> *)token {
//get the identity id and token from your server
//You can use AWSTaskCompletionSource if you don't have it and need to get it asynchronously.
//Once you have this information, simply set the identity id and return the token
self.identityId = identityId;
return [AWSTask taskWithResult:token];
}