下面的答案是: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
})
}
}然而,我得到了错误:
错误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方法的认知:
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错误的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,但是无法查询它?
发布于 2016-11-07 18:27:06
我想几乎没有什么东西能让它发挥作用。
我通过创建自己的身份提供管理器做出了正确的举动,我认为阻止我执行lambda方法的主要原因实际上是我使用的是AWSLambda而不是AWSLambdaInvoker。在我切换后,它开始犯一些有意义的错误。
发布于 2016-11-06 07:10:30
错误:
登录不匹配。请至少为此身份或身份池包含一个有效的登录名。
也可能是因为您试图以另一个用户的身份登录而不注销,因此登录字典中的令牌将与identityId进行不同身份的比较(并且不匹配)。在这种情况下,SDK通常通过重新尝试、清除和重新建立identityId来恢复,然后才能工作。
但是在您的情况下,由于您正在构建自己的登录字典,因此问题更有可能是您已经构造了一个不匹配的令牌。您可以使用https://jwt.io检查令牌。(虽然我承认它适用于谷歌和认知用户池,但在facebook令牌上却不适用(我不知道这是为什么)。
我认为不匹配意味着identityId记录与令牌中指定的不同的唯一用户。
您确定令牌构造正确吗?
正如你提到的..。文件..。嗯..。我发现这些文档不值得一看,所以我设置了我的项目,这样我就可以检查工作代码并设置断点。
以下是Mobile的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签约的一个很好的架构。即使您不使用其他移动集线器帮助。为什么要重新发明轮子,他们在aws-ios的身份部分做得很好。
我在github上发布了这个库的一个版本,它也为认知用户池添加了一个AWSSignInProvider。艾斯姆,它需要在aws ios中使用aws-移动中心-助手-ios (所以如果您克隆做一个克隆--递归的,您将被设置为使用库中的断点进行调试)。
https://stackoverflow.com/questions/40287670
复制相似问题