0

こちらの回答に従ってください: 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を配布しましたが、クエリを実行できませんか?

4

2 に答える 2

0

エラー:

ログインが一致しません。この ID または ID プールの有効なログインを少なくとも 1 つ含めてください

また、ログアウトせずに別のユーザーとしてログインしようとすると、ログイン ディクショナリのトークンが別の ID の identityId と比較される (一致しない) ために発生する可能性もあります。この場合、SDK は通常、identityId の再試行、クリア、および再確立によって回復し、その後機能します。

しかし、あなたの場合、独自のログイン辞書を作成しているため、一致しないトークンを作成した可能性が高くなります。https://jwt.ioを使用してトークンを検査できます。(ただし、Googleおよびcognitoユーザープールでは機能しますが、Facebookトークンでは機能しません(理由はわかりません))、

一致しないということは、identityId がトークンで指定されているものとは異なる一意のユーザーを記録していることを意味すると思います。

トークンが正しく構築されていますか?

あなたが言ったように...ドキュメント..まあ..ドキュメントは見る価値がないと思うので、プロジェクトをセットアップして、作業中のコードを確認し、ブレークポイントを設定できるようにします。

これは、Mobile Hub Helper の 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 にサインインするための優れたアーキテクチャです。Mobile Hub Helper の残りの部分を使用しない場合でも。なぜ車輪を再発明するのか、彼らは aws-mobilehub-helper-ios のアイデンティティ部分で非常に良い仕事をしました

そのライブラリのバージョンを github に投稿して、Cognito ユーザー プールにも AWSSignInProvider を追加しています。SignIn-awsmhh cognito ユーザープールを使用するには、aws-mobilehub-helper-ios でいくつかの修正が必要ですライブラリのブレークポイントを使用します)。

于 2016-11-06T07:10:30.813 に答える