注册后无法使用 iOS Cognito UserPool SDK 改变用户属性
Unable to mutate user attributes using iOS Cognito UserPool SDK after signup
我想在用户注册后更改其属性(即姓氏)。这是在 Cognito 用户池中选择并在他们最初注册时填写的属性。我只设置了用户池而不是身份池。
为此,我使用 AWSCognitoIdentityProvider
中的方法 adminUpdateUserAttributes
,使用 iOS SDK,但它给了我以下错误:
Error Domain=com.amazonaws.AWSCognitoIdentityErrorDomain Code=0 "(null)" UserInfo={__type=MissingAuthenticationTokenException, message=Missing Authentication Token}
这是我在 AppDelegate 中的设置:
let clientId:String = self.cognitoConfig!.getClientId()
let poolId:String = self.cognitoConfig!.getPoolId()
let clientSecret:String = self.cognitoConfig!.getClientSecret()
let region:AWSRegionType = self.cognitoConfig!.getRegion()
let serviceConfiguration:AWSServiceConfiguration = AWSServiceConfiguration(region: region, credentialsProvider: nil)
let cognitoConfiguration:AWSCognitoIdentityUserPoolConfiguration = AWSCognitoIdentityUserPoolConfiguration(clientId: clientId, clientSecret: clientSecret, poolId: poolId)
AWSCognitoIdentityUserPool.register(with: serviceConfiguration, userPoolConfiguration: cognitoConfiguration, forKey: userPoolID)
let pool:AWSCognitoIdentityUserPool = AppDelegate.defaultUserPool()
pool.delegate = self
AWSServiceManager.default().defaultServiceConfiguration = serviceConfiguration
这是我实际尝试更改属性的代码
let identityProvider = AWSCognitoIdentityProvider.default()
let requestAttributeChange = AWSCognitoIdentityProviderAdminUpdateUserAttributesRequest()
requestAttributeChange?.username = user?.username
requestAttributeChange?.userPoolId = AppDelegate.defaultUserPool().userPoolConfiguration.poolId
let attribute = AWSCognitoIdentityProviderAttributeType.init()
attribute?.name = "given_name"
attribute?.value = "TEST"
if let att = attribute {
print("Change attribute")
requestAttributeChange?.userAttributes = [att]
identityProvider.adminUpdateUserAttributes(requestAttributeChange!).continueWith(block: { (res) -> Any? in
print(res.error)
})
}
我是否也需要设置一个单独的身份池?我也不确定 data/keys 除了获得更多访问权限外我还需要存储什么类型?因为我试图避免在实际设备上存储任何敏感数据。
所以,我的方法行不通,因为它还需要我创建一个身份池。如果您已经有一个身份池,那么上述方法可能会奏效,但它有点 dirty/unsecure-ish 因为您作为管理员强迫自己做一些非常简单的事情。
感谢 this issue and this resource,我找到了更好的解决方案。
这是 swift 4 语法中的相同答案。
let attr = AWSCognitoIdentityUserAttributeType.init(name: "given_name", value: "TEST")
user?.update([attr]).continueOnSuccessWith(block: { (response) -> Any? in
// Was successful, do any changes, UI changes must be done on the main thread.
return nil
})
您也可以通过这种方式更新自定义属性。只需确保当您通过 aws 面板添加自定义属性时,您会进入 AWS Cognito 用户池。转到常规设置 -> 应用程序客户端 -> 单击 "Show Details" -> 单击 "Set attribute read and write permissions" 并为新创建的自定义属性指定适当的读写权限。
更新自定义属性时,只需在属性名前加上custom
标签即可。因此,例如,一个名为 school
的属性将按如下方式创建。
let attr = AWSCognitoIdentityUserAttributeType.init(name: "custom:school", value: "Junior High")
我想在用户注册后更改其属性(即姓氏)。这是在 Cognito 用户池中选择并在他们最初注册时填写的属性。我只设置了用户池而不是身份池。
为此,我使用 AWSCognitoIdentityProvider
中的方法 adminUpdateUserAttributes
,使用 iOS SDK,但它给了我以下错误:
Error Domain=com.amazonaws.AWSCognitoIdentityErrorDomain Code=0 "(null)" UserInfo={__type=MissingAuthenticationTokenException, message=Missing Authentication Token}
这是我在 AppDelegate 中的设置:
let clientId:String = self.cognitoConfig!.getClientId()
let poolId:String = self.cognitoConfig!.getPoolId()
let clientSecret:String = self.cognitoConfig!.getClientSecret()
let region:AWSRegionType = self.cognitoConfig!.getRegion()
let serviceConfiguration:AWSServiceConfiguration = AWSServiceConfiguration(region: region, credentialsProvider: nil)
let cognitoConfiguration:AWSCognitoIdentityUserPoolConfiguration = AWSCognitoIdentityUserPoolConfiguration(clientId: clientId, clientSecret: clientSecret, poolId: poolId)
AWSCognitoIdentityUserPool.register(with: serviceConfiguration, userPoolConfiguration: cognitoConfiguration, forKey: userPoolID)
let pool:AWSCognitoIdentityUserPool = AppDelegate.defaultUserPool()
pool.delegate = self
AWSServiceManager.default().defaultServiceConfiguration = serviceConfiguration
这是我实际尝试更改属性的代码
let identityProvider = AWSCognitoIdentityProvider.default()
let requestAttributeChange = AWSCognitoIdentityProviderAdminUpdateUserAttributesRequest()
requestAttributeChange?.username = user?.username
requestAttributeChange?.userPoolId = AppDelegate.defaultUserPool().userPoolConfiguration.poolId
let attribute = AWSCognitoIdentityProviderAttributeType.init()
attribute?.name = "given_name"
attribute?.value = "TEST"
if let att = attribute {
print("Change attribute")
requestAttributeChange?.userAttributes = [att]
identityProvider.adminUpdateUserAttributes(requestAttributeChange!).continueWith(block: { (res) -> Any? in
print(res.error)
})
}
我是否也需要设置一个单独的身份池?我也不确定 data/keys 除了获得更多访问权限外我还需要存储什么类型?因为我试图避免在实际设备上存储任何敏感数据。
所以,我的方法行不通,因为它还需要我创建一个身份池。如果您已经有一个身份池,那么上述方法可能会奏效,但它有点 dirty/unsecure-ish 因为您作为管理员强迫自己做一些非常简单的事情。
感谢 this issue and this resource,我找到了更好的解决方案。
这是 swift 4 语法中的相同答案。
let attr = AWSCognitoIdentityUserAttributeType.init(name: "given_name", value: "TEST")
user?.update([attr]).continueOnSuccessWith(block: { (response) -> Any? in
// Was successful, do any changes, UI changes must be done on the main thread.
return nil
})
您也可以通过这种方式更新自定义属性。只需确保当您通过 aws 面板添加自定义属性时,您会进入 AWS Cognito 用户池。转到常规设置 -> 应用程序客户端 -> 单击 "Show Details" -> 单击 "Set attribute read and write permissions" 并为新创建的自定义属性指定适当的读写权限。
更新自定义属性时,只需在属性名前加上custom
标签即可。因此,例如,一个名为 school
的属性将按如下方式创建。
let attr = AWSCognitoIdentityUserAttributeType.init(name: "custom:school", value: "Junior High")