代码之家  ›  专栏  ›  技术社区  ›  user2576008

将Facebook登录与AWS Cognito用户池集成

  •  3
  • user2576008  · 技术社区  · 8 年前

    我正在尝试将aws用户池集成到我的项目中。我设法用电子邮件和密码进行正常登录,但我需要用Facebook添加登录。

    根据我在文档中读到的内容,为此,我需要在联邦身份中创建一个标识池。我创建了一个,并为身份验证提供程序添加了以下配置: -在Facebook选项卡中添加我的Facebook应用程序ID, -并在Cognito选项卡中为我的用户池添加我的用户池id和应用程序客户端id。

    在我的用户池中,在联合会的身份提供者中,我选择Facebook,并为此添加我的Facebook应用程序ID和应用程序机密。

    在我的应用程序中,我实现了一个AWSIdentityProviderManager,其中包含:

    class CognitoSocialProvider: AWSIdentityProviderManager {
    
       func logins() -> AWSTask<NSDictionary> {
          if let token = FBSDKAccessToken.current() {
            return AWSTask(result: [AWSIdentityProviderFacebook:token.tokenString])
          }
          return AWSTask(error:NSError(domain: kCognitoFacebookDomainError, code: -1 , userInfo: [kCognitoFaceook : kCognitoFacebookInvalidAccessToken]))
       }
    }
    

    下面是我登录Facebook的代码:

        let loginManager = FBSDKLoginManager()
        let permisions = [kCognitoFacebookPublicProfil, kCognitoFacebookEmail]
        loginManager.logIn(withReadPermissions: permisions,
                           from: parentVC) { (result, error) in
                            if (error != nil) {
                                failure(error! as NSError)
                            } else if (result?.isCancelled == true){
                                failure(NSError())
                            } else {
                                let socialProvider = CognitoSocialProvider()
                    provider = AWSCognitoCredentialsProvider(regionType: REGION,
                                                 identityPoolId: IDENTITY_POOL,
                                identityProviderManager: socialProvider)
                    let serviceConfiguration = AWSServiceConfiguration(region: REGION, credentialsProvider: provider)
                    AWSServiceManager.default().defaultServiceConfiguration = serviceConfiguration
                    provider.clearKeychain()
                    provider.clearCredentials()
                    provider.credentials().continueWith { (task) -> Any? in
                    DispatchQueue.main.async(execute: {
                            if let error = task.error as NSError? {
                                    failure(error)
                            } else {
                                    let response = task.result! as AWSCredentials
                                    success(CognitoFacebookSession(credentials: response))
    
                            }
                    })
                    return nil
                  }
            }
    

    登录正常,但当我在“用户和组”部分查看我的用户池时,我看不到我的用户。

    有没有其他解决方案可以集成Facebook登录,只使用用户池而不使用身份池?

    1 回复  |  直到 8 年前
        1
  •  1
  •   KOT    8 年前

    您需要在用户池中使用标识提供程序,而不是在联合标识中使用标识池。它位于用户池中左侧菜单的底部。这将在您的用户池中创建一个用户,但允许他们使用第三方登录。

    然后,您可以使用AUTHORIZE和TOKEN端点为您的用户(以及托管UI)获取JWT令牌。或者直接使用托管UI就可以了。 https://docs.aws.amazon.com/cognito/latest/developerguide/authorization-endpoint.html https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-app-settings.html

    用户池中的身份提供者和联合身份中的身份池不是一回事。有点困惑。身份池将在第三方保留身份,只允许您获得AWS资源的临时访问密钥。

    但我想您不需要在用户池中有条目。取决于您想要什么:)