【问题标题】:ios swift AWS cognito and Facebook Authenticationios swift AWS cognito 和 Facebook 身份验证
【发布时间】:2016-12-11 08:59:13
【问题描述】:

我正在尝试使用 Facebook 凭据登录 AWS。我已经使用 Facebook 作为我在 Amazon Cognito 上的社交身份提供商设置了一个联合身份,但由于某种原因它没有进行身份验证。亚马逊上的文档不是最新的,所以我不知道该怎么做。

以下是来自 ios 应用的一些 swift 代码:

let token = FBSDKAccessToken.currentAccessToken().tokenString

    let provider = MyProvider(tokens: [AWSIdentityProviderFacebook: token])


    let credentialsProvider = AWSCognitoCredentialsProvider(regionType: region, identityPoolId: poolId, identityProviderManager: provider)


    let configuration = AWSServiceConfiguration(region: region, credentialsProvider:credentialsProvider)

    AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = configuration

    let id = credentialsProvider.getIdentityId()

这是 MyProvider 类:

import Foundation
import AWSCognitoIdentityProvider

class MyProvider:NSObject, AWSIdentityProviderManager{
     var tokens : [NSString : NSString]?
     init(tokens: [NSString : NSString]) 
     {
         self.tokens = tokens
     }
    @objc func logins() -> AWSTask {

        return AWSTask(result: tokens)
    }
}

我能够从 Facebook 获取令牌并登录,但是当我将此令牌传递给 Cognito 时,我收到类似“NotAuthorizedException”“令牌不是来自此身份池的受支持提供者”之类的错误。我传递给 AWSCognitoCredentialsProvider 的池 ID 和区域与 Amazon Cognito 上的匹配,我在 MyProvider 中定义的方法被调用。如果有人让它工作,请分享你做了什么让它工作。我将不胜感激任何建议和帮助!

【问题讨论】:

    标签: ios swift amazon-web-services aws-sdk facebook-sdk-4.0


    【解决方案1】:

    我正在尝试进行 facebook 身份验证和 cognito 登录。我做了几乎和你一样的代码。下面是我的代码。

    @IBAction func SigninWithFaceBook(_ sender: Any) {
        let loginManager: FBSDKLoginManager = FBSDKLoginManager()
        loginManager.logIn(withReadPermissions: ["public_profile", "email", "user_birthday", "user_gender"], from: self) { (result, error) in
            if error != nil {
                 print("error")
            } else if (result?.isCancelled)! {
                print("Cancelled")
            } else {
                let loginResult: FBSDKLoginManagerLoginResult = result!
                if loginResult.grantedPermissions != nil {
                    if loginResult.grantedPermissions.contains("email") {
                        if FBSDKAccessToken.current() != nil {
                            let tokenString = FBSDKAccessToken.current().tokenString
                            print("FBSDKAccessToken.current() \(FBSDKAccessToken.current()) string \(String(describing: tokenString)) )")
                            FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "id, name, email, gender, birthday "]).start(completionHandler: { (connection, result, error) -> Void in
                                if error == nil {
                                    let json = result as! [String : Any]
                                     print("FBSDKGraphRequest \(json)")
                                    let email = json["email"] as! String
                                    let id = json["id"] as! String
                                    let name = json["name"] as! String
                                    let gender = json["gender"] as! String
                                    let birthdate = json["birthday"] as! String
                                    print("facebook login suceseeded email \(email)) id \(id) id \(name) gender \(gender) birthData \(birthdate)  ")
    
                                //// Sync Cognito UserPool for facebook login //////////////////
                                    let customcedentialProvider = CustomIdentityProvider(tokens: ["graph.facebook.com" : tokenString!])
                                    let credentialsProvider = AWSCognitoCredentialsProvider(regionType: CognitoIdentityUserPoolRegion,
                                                                                            identityPoolId: CognitoFederatedIdentityUserPoolID,
                                                                                            unauthRoleArn: CognitoFedratedIAMRoleUnauthARN,
                                                                                            authRoleArn: CognitoFedratedIAMRoleAuthARN,
                                                                                            identityProviderManager: customcedentialProvider)
                                    let configuration = AWSServiceConfiguration(region:CognitoIdentityUserPoolRegion, credentialsProvider:credentialsProvider)
                                    AWSServiceManager.default().defaultServiceConfiguration = configuration
                                    credentialsProvider.getIdentityId()
                                    print("credentialsProvider.getIdentityId() \(credentialsProvider.getIdentityId())")
    
                                    self.navigationController?.popToRootViewController(animated: true)
                                    self.dismiss(animated: true, completion: nil)
                                    print("didCompleteFBLogin  ~~~~~ No Error ----- and dismiss")
    
                                }else{
                                    print("FBSDKGraphRequest error")
                                }
                            })
                        } else {
                            print("Token is nil")
                        }
                        loginManager.logOut()
                    } else {
                        print("It can not get user email from this Facebook user")
                    }
                } else {
                    print("Permission is not granted")
                }
            }
        }
    }
    

    我不确定 Cognito 登录是否有效。 打印我们的“credentialsProvider.getIdentityId()”完成如下,但在 Cognito 联合身份池中的 Cognito 用户中没有为 FederatedAppAuthRole 注册用户池。

    credentialsProvider.getIdentityId() AWSTask: 0x1c5e78d00;完成=是;取消=否;故障=否;结果 = ap-northeast-1:2fd1e4aa-97f4-XXXX-XXXX-XXXXXXXXXXXX

    请告诉我您的建议。

    【讨论】:

      【解决方案2】:

      您的登录地图中的键应该是 graph.facebook.com。尝试使用AWSCognitoLoginProviderKey.Facebook.rawValue 而不是AWSIdentityProviderFacebook

      【讨论】:

      • AWSCognitoLoginProviderKey.Facebook.rawValue 已弃用
      • 您好,您是否通过 AWS 实现了 facebook 登录。我正在努力实现这一点,请帮助我做到这一点。
      • 使用 Cognito 所需的大量代码和设置令人震惊。我发现 Firebase 更智能,更容易集成到 swift。
      【解决方案3】:

      以某种方式解决了我的问题。我所做的只是删除了我的身份池和 Facebook 应用程序并创建了新的。现在工作正常。

      【讨论】:

        猜你喜欢
        • 2015-04-15
        • 2018-05-22
        • 2018-01-29
        • 2014-09-30
        • 1970-01-01
        • 2016-08-20
        • 2016-06-25
        • 1970-01-01
        • 2017-01-02
        相关资源
        最近更新 更多