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にしましょう。
この設定を行った後に、

までは特に問題なく実施できました。

できなかったこと

  • 作ったユーザでログインする

要は、作ったユーザとパスワードでログインして、そのログインセッション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のロジックを見る限り、パスワードは何らかの暗号化をして送付する必要があるっぽい

感想

  • いろんなAPIの呼び出し(例えばDeleteUser)に"AccessToken"を要求するくせに、それを取得する方法がない*1API...
  • 最初はnode.js読んでたけれど、JS力が足りなくて読めなかった...
  • AWSのPublicBetaってAPIを含めて全て公開されるものと思ってたんですが、どうやって使えばいいかだけしか公開されないときもあるんですね...

追記

node.jsですがリベンジしました - http://d.hatena.ne.jp/a-hisame/20160502/1462194635

*1:多分他のOpenIDとかの場合はそれが使えるんだろうけど