Angular×Cognitoでサインアップの処理を書いている時に、
「A client attempted to write unauthorized attribute」
というエラーが出ました。
僕の場合はクソしょうもないことが原因でしたが、一応備忘録として書いておこうと思います。
目次
「A client attempted to write unauthorized attribute」とは
翻訳すると、「クライアントが不正な属性を書き込もうとしました。」です。
つまり、Cognitoの属性に対して、書き込み権限がないということですね。
Cognitoの属性って?
「ユーザプール」⇒「属性」を押すと、上記のような画面が表示されます。
属性は、Cognitoユーザ登録時に設定したい値のことです。
つまり、認証に使うものではなく、あくまでユーザ作成時に登録させたいものを指します。
「email」にはデフォルトでチェックが入っています。
Cognitoの属性に対する書き込み権限とは?
「ユーザプール」⇒「アプリクライアント」⇒「属性の読み込みおよび書き込みアクセス権限を設定する」で、上記の画面が表示されます。
ここで属性の書き込み権限を設定できます。
が、僕はここにチェックを入れていたので、エラーの対処法としては不適切でした。
で、エラーの原因は?
ここで一度冷静になってみました。
属性の権限は確実に付与されているので、そもそも属性の指定が間違っているのではないかと思ったのです。
つまり、Cognitoに存在しない属性を間違って指定しているのではないかと。
ということで、ソースコードを再度確認してみました。
間違いのあるソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
var poolData = { UserPoolId : 'us-east-1_TcoKGbf7n', ClientId : '4pe2usejqcdmhi0a25jp4b5sh3' }; var userPool = new AmazonCognitoIdentity.CognitoUserPool(poolData); var attributeList = []; var dataEmail = { Name : 'emali', Value : 'email@mydomain.com' }; var dataPhoneNumber = { Name : 'phone_number', Value : '+15555555555' }; var attributeEmail = new AmazonCognitoIdentity.CognitoUserAttribute(dataEmail); var attributePhoneNumber = new AmazonCognitoIdentity.CognitoUserAttribute(dataPhoneNumber); attributeList.push(attributeEmail); attributeList.push(attributePhoneNumber); userPool.signUp('username', 'password', attributeList, null, function(err, result){ if (err) { alert(err); return; } cognitoUser = result.user; console.log('user name is ' + cognitoUser.getUsername()); }); |
まとめ
しょうもない原因でしたが、1時間くらいハマってしまいました。
冷静に考えれば分かるものなので、落ち着いて対処しないとだめですね。
ではまた!