将 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 资源的临时访问密钥。
但我想您不需要在您的用户池中有一个条目。取决于你想要什么:)
我正在尝试将 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 资源的临时访问密钥。
但我想您不需要在您的用户池中有一个条目。取决于你想要什么:)