Amazon Cognito User Pools をPythonから利用しようとして挫折した
先週のAWS Summit in シカゴで発表された AWS Cognito User Pools ですが、モバイルやウェブ画面からだけではなくて、サーバー側の認証機構として使えないかをPythonとAWSCLIで色々試行錯誤して失敗したので記録しておきます。
原理的にはできなくもないんですが、現在提供されているソースコードを使わない場合は生のAPIを読み解いてゴリゴリ実装する必要がありそうなので、自分は調査を打ち切りました。
現在専用の命令が提供されていない言語でも同じことが言えると思います。
できたこと
そもそものUserPoolsの設定は こちらの記事を参照 して設定しました。
1点注意事項として、Appを設定するときに"Generate Client Secret"の設定がデフォルトでONになっていますが、
JavaScriptや他のAPIコールの場合まだSecret ONの場合に対応していないようなのでOFFにしましょう。
この設定を行った後に、
- ユーザを作る (http://docs.aws.amazon.com/cli/latest/reference/cognito-idp/sign-up.html)
- 作ったユーザの認証をする (http://docs.aws.amazon.com/cli/latest/reference/cognito-idp/confirm-sign-up.html)
までは特に問題なく実施できました。
できなかったこと
- 作ったユーザでログインする
要は、作ったユーザとパスワードでログインして、そのログインセッションIDを取得するオペレーションがやりたかったのです。
アプリケーションを作る場合、ユーザやパスワードはアプリケーションのDB内に持つことが多いですが、
それを代替するサービスとしてCognito UserPoolsが使えないかを検証していました。
原因
- 2016-04-25時点で公式に開示されていない"AWSCognitoIdentityProviderService.Authenticate"というAWS APIをコールしている。
- 呼び出しの詳細は Android SDK内のソースコードをたどった実装から
- boto3の"cognito-idp"は2016-04-18時点のものが最新(version 1.3.1)。 利用可能なAPIは ここ にJSON形式で記載されているが、この中に "Authenticate" APIの定義はない。
- 上記の定義が参照しているcognito-idpのAPIで公開されているリスト (2016-04-18の仕様ではここに Authenticate は存在しない)
- なお、Javaのロジックを見る限り、パスワードは何らかの暗号化をして送付する必要があるっぽい
感想
追記
node.jsですがリベンジしました - http://d.hatena.ne.jp/a-hisame/20160502/1462194635