После ответа здесь: 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.logins = {" graph.facebook.com ": mytoken}
и это создает другое исключение при вызове лямбда-метода, но ДЕЙСТВИТЕЛЬНО извлекает идентификатор identityID должным образом. Однако выполнение этого в соответствии с документами вызывает предупреждение о том, что используемый мной метод устарел.
Я получаю ошибку:
UserInfo = {NSLocalizedDescription = сериализованный объект не является ни допустимым объектом json, ни объектом NSData:}
Однако это случается только иногда. Если я попытаюсь повторить попытку, я потенциально могу получить идентификатор личности, но при вызове лямбда-метода я получаю ту же ошибку. Я предполагаю, что это проблема когнитивности.
ОБНОВЛЕНИЕ
Если я использую AWSCognitoLoginProviderKey.facebook.rawValue вместо graph.facebook.com в первой части, он дает мне идентификатор когнито, а затем я вызываю лямбда-метод. Я включу лямбда-метод на тот случай, если я ошибаюсь, но я вполне уверен, что это когнитивный метод, который мешает мне вызвать лямбда-метод:
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.} ]
Я считаю, что большая строка, которая выглядит как идентификатор identitypoolID, на самом деле является идентификатором идентификатора для данного пользователя, который у меня есть, поэтому когнито распространил идентификатор, но не может его запросить?