3

我正在尝试将 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 登录,只使用用户池而不使用身份池?

4

1 回答 1

1

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

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

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

于 2018-05-11T14:26:29.573 回答