API DocumentにあるOAuth2.0でaccess tokenを取得するための例がpasswordを使うもので, authorization_codeでやりとりするにはどうすればいいのかぱっと見わからなかったので, 色々漁ってみた備忘録.
client_id と client_secretの取得
まずはclient_idとclient_secretを貰います. "https://$YOUR_MASTODON_HOST/api/v1/apps" にPOSTメソッドでパラメータと共にリクエスト投げて返ってくるjsonにclient_idとclient_secretがあるのでそれを保持.
パラメータは以下
- client_name: クライアント名. 多分好きな名前を入れていいと思います.
- redirect_uri: リダイレクト先. 特になければ urn:ietf:wg:oauth:2.0:oob を指定しておきます.
- scopes: アクセス範囲. read write followがあるらしい.
curlで叩くと以下のような雰囲気.
# YOUR_MASTODON_HOSTにはご自分がアクセスしたいMastodonインスタンスを指定してください(mstdn.jp等)
# YOUR_CLIENT_NAMEには自分が使いたいクライアント名を入れてください
curl -X POST -sS https://$YOUR_MASTODON_HOST/api/v1/apps -F "client_name=YOUR_CLIENT_NAME" -F "redirect_uris=urn:ietf:wg:oauth:2.0:oob" -F "scopes=read write follow"
ただしくレスポンスが返ると以下のようなjsonがやってきます.
// id, client_id, client_secretは伏せ字です.
{"id":xxxxx,
"redirect_uri":"urn:ietf:wg:oauth:2.0:oob",
"client_id":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"client_secret":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}
idはそのリクエストのidで数値です. これ同じリクエスト投げ続けるとidがどんどん変わっていくし, client_id, client_secretもその都度変わります.
authorization_codeの取得
取得したclient_idを使って, authorization_codeを取得します.
- client_id: 先程取得したclient_id
- response_type: code
- redirect_uri: リダイレクト先. 特になければ urn:ietf:wg:oauth:2.0:oob を指定しておきます.
- scopes: アクセス範囲. 先程指定したものと同じ物を指定.
上記のパラメータをurl encodeした物を, "https://$YOUR_MASTODON_HOST/oauth/authorize?" にくっつけてブラウザ上で叩きます.
# macOSのターミナルから指定のURLを既定のブラウザを開く
open https://$YOUR_MASTODON_HOST/oauth/authorize?client_id=xxxxxxxxxxxxxxxxxxxxxxxx&response_type=code&redirect_uri=urn:ietf:wg:oauth:2.0:oob&scope=read%20write%20follow
ブラウザ上で承認すると, authorization_codeが表示されるので, それを保持します.
access tokenの取得
ここまでで, client_id, client_secret, authorization_codeが揃っているので, grant_type=authorization_codeでaccess_tokenを取得できるようになりました. /oauth/token APIに対してPOSTメソッドでリクエストしてaccess tokenを取得しましょう.
POSTメソッドに渡すパラメータは以下の通り
- grant_type: authorization_code を指定
- redirect_uri: リダイレクト先. 特になければ urn:ietf:wg:oauth:2.0:oob を指定しておきます.
- client_id: 取得したclient_id
- client_secret: 取得したclient_secret
- code: 取得したauthorization_code
curlで叩くと以下のような雰囲気になります.
curl -X POST -sS https://$YOUR_MASTODON_HOST/oauth/token -F "grant_type=authorization_code" -F "redirect_uri=urn:ietf:wg:oauth:2.0:oob" -F "client_id=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" -F "client_secret=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" -F "code=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
うまくいくと以下のようなレスポンスが返ります.
{"access_token":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"token_type":"bearer",
"scope":"read write follow",
"created_at":1234567890}