Money Button OAuth を実装してみた

詳細には書きづらいので概要のみになります。

これjs版もあるそうですが、私はcurlAPI叩きまくる方。
導入の敷居としては他のOAuth実装経験あれば行けると思う。

まず英文のマニュアル。これを読めば経験者ならいけるはず。

docs.moneybutton.com

docs.moneybutton.com

まず最初にマネボアカウントの設定画面でcreate new appで
必要項目を埋めて、

  • Client identifier
  • OAuth identifier

を使用します。
OAuth redirect URLは入れておいてください。
まるでパスワードかのようにAPIで使います(笑)

まずはhtmlにログインしてなければマネボのログインボタンを出して、
そのとび先をauthorize API のURLにします。

https://www.moneybutton.com/oauth/v1/authorize?
  response_type=code&
  client_id=<your app oauth identifier>&
  redirect_uri=<your app redirect uri>&
  scope=<your selected scope>&
  state=<client generated random string>

stateはセキュリティのために自分で用意した文言を入れてAPIレスポンスでその値が返ってくるので照合します。
セッションIDでもいいかな...。

scopeなんですが、なんのこっちゃですが、ここで使用するAPIをいれます。その使用許可を下したアクセストークンが返ってくる仕組みです。
ここで指定しないAPIは権限がなく使えないので、ここでしっかり入れる必要があります。

一番手堅いのが"auth.user_identity:read users.profiles:read"です。
user_identity APIとprofiles APIがあればOAuthは実現できるためで、それ以外のAPIは必要に応じて追加しましょう。

これでマネボからリダイレクトURLに返ってくるので、そのGETパラメータをトリガーにログイン処理を開始します。

続いてはcurlでPOSTリクエストでtoken APIを実施します。これのレスポンスでアクセストークンが手に入ります。

curl --request POST \
  --url 'https://www.moneybutton.com/oauth/v1/token' \
  --header 'content-type: application/x-www-form-urlencoded' \
  --data grant_type=authorization_code \
  --data client_id=<YOUR_APP_OAUTH_IDENTIFIER> \
  --data code=<YOUR_AUTHORIZATION_CODE> \
  --data 'redirect_uri=<same redirect uri that you used to get the auth code>'

で、そのままAPIを叩き続けます。続いてuser_identity APIです。これでマネボのユーザIDや名前が取得できます。
ここはGETになって、ヘッダーにアクセストークンを埋める必要があります。ここが少し癖があります。GETパラメータの方が楽なんですけどね...セキュリティの観点でしょうか...

curl --request GET \
  --url 'https://www.moneybutton.com/api/v1/auth/user_identity' \
  --header 'authorization: Bearer <YOUR_ACCESS_TOKEN>'

で、これだとマネボのメアドやサムネが手に入りません。いらないと言えばいらないんですが、折角なんで利用したいのであれば、ここでUser Profile APIです。

GETリクエストでscopeに"users.profiles:read"を指定します。headerにアクセストークンもいれます。ないと動かないと思う。試してないけど。

https://www.moneybutton.com/api/v1/users/{userId}/profile

これであとはこれらの取得データをセッションやら適所ユーザTBLにいれたらOAuthの完成です。
ログイン時間は1時間なので、延長させるためにアクセスの度に更新トークンを実施します。

curl --request POST \
  --url 'https://www.moneybutton.com/oauth/v1/token' \
  --header 'content-type: application/x-www-form-urlencoded' \
  --data grant_type=authorization_code \
  --data client_id=<YOUR_APP_OAUTH_IDENTIFIER> \
  --data code=<YOUR_AUTHORIZATION_CODE> \
  --data 'redirect_uri=<same redirect uri that you used to get the auth code>'

これがうまく行かない場合はerror jsonが返ってくるので、サーバ側でもログアウト処理をいれるとよいでしょう。

と、こんな感じで微妙にコーディング量はありますし、やけにAPIにアクセスするのでマネボの負荷が気になりますが、完成です。