こちらの回答に従ってください: https://github.com/aws/aws-sdk-ios/issues/357 一番下に、Swift と Cognito を機能させるためのミニガイドがあります。
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=ログインが一致しません。この ID または ID プールの有効なログイン情報を少なくとも 1 つ含めてください。}
私の問題を解決する方法について何かアイデアがあれば教えてください。ドキュメントに従ってログインを直接設定しようとしました "credentialsProvider.logins = {"graph.facebook.com": mytoken}
ラムダメソッドを呼び出すと別の例外が生成されますが、identityID は適切に取得されます。ただし、ドキュメントに従って実行すると、使用している方法が非推奨であるという警告が表示されます。
私が得るエラー:
UserInfo={NSLocalizedDescription=serialized オブジェクトは、有効な json オブジェクトでも NSData オブジェクトでもありません: }
ただし、それは時々しか起こりません。再試行すると、ID ID を取得できる可能性がありますが、ラムダ メソッドを呼び出すと、同じエラーが発生します。私はそれが認識の問題であると仮定しています。
アップデート
最初の部分で、graph.facebook.com の代わりに AWSCognitoLoginProviderKey.facebook.rawValue を使用すると、cognito ID が提供され、ラムダ メソッドが呼び出されます。それが私が間違っている部分である場合に備えて、ラムダメソッドを含めますが、ラムダメソッドの呼び出しを妨げているのは認識であると確信しています:
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 [エラー] AWSCredentialsProvider.m 行:577 | __44-[AWSCognitoCredentialsProvider 認証情報]_block_invoke.352 | リフレッシュできません。エラーは [Error Domain=com.amazonaws.AWSCognitoIdentityErrorDomain Code=10 "(null)" UserInfo={__type=ResourceNotFoundException, message=Identity 'us-east-1:0db18266-1baa-4c59-9110-f9041dc92ead' not found.} です。 ]
IDプールIDのように見える大きな文字列は、実際には私が持っている特定のユーザーのIDだと思います.cognitoはIDを配布しましたが、クエリを実行できませんか?