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

Integrate Facebook login with AWS Cognito User Pool

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

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

在我的用户池中,在联合身份提供者中,我 select 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 登录,只使用用户池而不使用身份池?

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

然后您可以使用 AUTHORIZE 和 TOKEN 端点为您的用户获取 JWT 令牌(连同托管 UI)。或者直接使用 Hosted 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

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

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