我想允许用户在字段中输入他们的电子邮件地址/密码。继续,我想运行检查以查看该用户是否已存在。如果他们这样做,请将其登录并继续使用应用程序,如果他们不这样做,请转到帐户创建流程,他们将被指示添加姓名,电话号码等。
我不能为我的生活找到有关如何使用AWS Cognito登录用户的文档。我应该能够在电话中传递电子邮件/传递并获得回复,表示用户存在/用户不存在或者其他什么!我在这里错过了什么吗?
非常感谢任何帮助。我仔细检查了文件......这是我的最后一招。
答案 0 :(得分:8)
在当前的SDK中,调用getUser
上的AWSCognitoIdentityUserPool
只构造内存中的用户对象。要通过网络进行呼叫,您需要在构造的用户上调用getSession
方法。这是我写的一个Swift 3方法,用于检查电子邮件是否可用:
/// Check whether an email address is available.
///
/// - Parameters:
/// - email: Check whether this email is available.
/// - completion: Called on completion with parameter true if email is available, and false otherwise.
func checkEmail(_ email: String, completion: @escaping (Bool) -> Void) {
let proposedUser = CognitoIdentityUserPoolManager.shared.pool.getUser(email)
UIApplication.shared.isNetworkActivityIndicatorVisible = true
proposedUser.getSession(email, password: "deadbeef", validationData: nil).continueWith(executor: AWSExecutor.mainThread(), block: { (awsTask) in
UIApplication.shared.isNetworkActivityIndicatorVisible = false
if let error = awsTask.error as? NSError {
// Error implies login failed. Check reason for failure
let exceptionString = error.userInfo["__type"] as! String
if let exception = AWSConstants.ExceptionString(rawValue: exceptionString) {
switch exception {
case .notAuthorizedException, .resourceConflictException:
// Account with this email does exist.
completion(false)
default:
// Some other exception (e.g., UserNotFoundException). Allow user to proceed.
completion(true)
}
} else {
// Some error we did not recognize. Optimistically allow user to proceed.
completion(true)
}
} else {
// No error implies login worked (edge case where proposed email
// is linked with an account which has password 'deadbeef').
completion(false)
}
return nil
})
}
作为参考,我的ExceptionString
枚举如下所示:
public enum ExceptionString: String {
/// Thrown during sign-up when email is already taken.
case aliasExistsException = "AliasExistsException"
/// Thrown when a user is not authorized to access the requested resource.
case notAuthorizedException = "NotAuthorizedException"
/// Thrown when the requested resource (for example, a dataset or record) does not exist.
case resourceNotFoundException = "ResourceNotFoundException"
/// Thrown when a user tries to use a login which is already linked to another account.
case resourceConflictException = "ResourceConflictException"
/// Thrown for missing or bad input parameter(s).
case invalidParameterException = "InvalidParameterException"
/// Thrown during sign-up when username is taken.
case usernameExistsException = "UsernameExistsException"
/// Thrown when user has not confirmed his email address.
case userNotConfirmedException = "UserNotConfirmedException"
/// Thrown when specified user does not exist.
case userNotFoundException = "UserNotFoundException"
}
答案 1 :(得分:3)
有些澄清是有道理的。 Cognito有几个部分。执行“身份验证”(您正在谈论的内容)的部分称为“Cognito用户池”。不要与Cognito联合身份池混淆。
使用用户池,您可以使用属性创建用户名和密码组合,这些可用于向用户(跨多个设备)验证并交付持久的跨设备Cognito Federated身份identityId。
登录后,联合身份池将挂钩到可以让“授权”使用AWS服务(如Dynamo DB等)的角色。
让所有这些部分协同工作可能很棘手,AWS有一个名为“Mobile Hub”的在线站点,它将为您构建代码并下载xcode项目。此过程正确配置联合身份池和用户池,并将它们全部连接到一组示例代码。
将凭证提供程序连接到用户池到标识池有点违反直觉,但github上aws-mobilehub-helper-ios中的AWSIdentityManager管理所有这些。所以我建议在控制台上使用移动集线器。
Cognito是一个有点混乱的系统,这里有一个指向brief powerpoint的链接,它突出了它的工作原理(对于那些无法理解AWS文档的人(比如我))。
话虽如此,“如何检查用户是否已经存在?”
最合理的方法是创建用户(通过注册),如果名称正在使用,则获取拒绝,并建议您的用户尝试使用其他用户名。对于正在使用的电子邮件,您将在确认后获得拒绝(注册通过电子邮件和/或文本发送确认ID)。这可以被覆盖以回收电子邮件地址,或者您可以通过尝试登录并查看失败代码来预先进行测试以查看电子邮件是否正在使用中。
您可以像其他答案所示获取用户,但是如果您在用户池中建立了登录别名(如电子邮件),您会发现这有问题,因为这只会告诉您某人是否有用户名,而不是某人已在使用该电子邮件地址,您将在确认时间后收到拒绝。
答案 2 :(得分:1)
ListUsers 现在是检查现有用户名的好方法。
https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ListUsers.html
您还可以查找现有的电子邮件,电话号码和其他默认属性。
这是一个简单的.NET示例:
Dim userRequest = New ListUsersRequest With {
.UserPoolId = "poolId",
.Filter = "username = bob@email.com"
}
Dim response = amazonCognitoIdentityProviderClient.ListUsers(userRequest)
Debug.WriteLine(response.Users.Count)
答案 3 :(得分:0)
在执行userName
进程之前提供login
,检查用户名是否存在。如果您获得getUser
方法的价值,那么用户就会存在,如果您获得nil
或error
,那么用户就不存在了。
let pool = AWSCognitoIdentityUserPool(forKey: "UserPool")
let user: AWSCognitoIdentityUser = pool.getUser("userName")
感谢:)