注册后无法使用iOS Cognito UserPool SDK更改用户属性

时间:2018-08-23 18:00:50

标签: ios swift amazon-web-services aws-cognito

注册后,我正在尝试更改用户的属性(即姓氏)。此属性已在Cognito用户池中选择,并在他们最初注册时填写。我只设置了一个用户池,而没有设置一个身份池。

为此,我正在使用iOS SDK在adminUpdateUserAttributes中使用方法AWSCognitoIdentityProvider,但它给了我以下错误:

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)
        })
    }

我也需要设置一个单独的身份池吗?我也不确定要获得更多访问权限还需要存储的数据/密钥的类型?我正努力避免在实际设备上存储任何敏感数据。

1 个答案:

答案 0 :(得分:2)

因此,我的方法行不通,因为它还要求我也创建一个身份池。如果您已经有一个身份池,那么上述方法可能会起作用,但是由于您迫使管理员以非常简单的方式进行操作,因此它有点肮脏/不安全。

多亏了this issuethis 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 UserPool。转到常规设置->应用程序客户端->单击“显示详细信息”->单击“设置属性读写权限”,然后为新创建的自定义属性指定适当的读写权限。

更新自定义属性时,只需在属性名称之前包含custom标记。因此,例如,将创建一个名为school的属性,如下所示。

let attr = AWSCognitoIdentityUserAttributeType.init(name: "custom:school", value: "Junior High")