はじめに
mastodonのAPIを使用するために必要なaccess tokenの取得について書いた記事です。
oauth2でaccess tokenを取得する方法はgrant_typeによっていろいろな方法がありますが、よく見かける記事は grant_type="password"
のものが多かったので grant_type="authorization_code"
で取得するPythonでの例です。
環境
- Python3.6
- 外部ライブラリはreqeustsパッケージだけ使用
実行結果
$ python mastodon_auth_example.py
client id: XXXXXXXXXX...
client secret: YYYYYYYYYY...
open browser https://mstdn.jp/oauth/authorize?scope=read+write+follow&client_id=XXXXXXXXXXXXXXXXX&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&response_type=code
input code > ZZZZZZZZZ....
access token : ****************************************************************
解説
クライアントIDの取得
認証済みアプリとして登録するために、クライアントIDを取得する。Twitterではdev.twitter.comでMyAppsで登録したような操作。mastodonではWebインターフェースがないのでREST APIで取得する。
client_id と client_secretが得られる。
res = requests.post('https://mstdn.jp/api/v1/apps',
dict(client_name=CLIENT_NAME,
redirect_uris="urn:ietf:wg:oauth:2.0:oob",
scopes="read write follow")).json()
return res["client_id"], res["client_secret"]
redirect_urisは実際にはリダイレクトせずにコンソール上に表示させるためにこのuriを使用するよう。
scopeはこのアプリがユーザーに要求する権限です。アプリが必要とする権限だけ要求すべき。
クライアントIDの発行はアプリごとに作成するため、例ではファイルに保存してそれを再利用する形にしている。
権限承認用URLを作成
クライアントIDを使用して権限承認用のURLを生成する。ユーザーはこれをブラウザで開き、(必要ならばログイン後に)アプリが要求する権限を確認した上で承認する。
承認後はアプリが要求するURLへリダイレクトしてアプリ側で認証コードを受け取る流れだが、リダイレクトを受け付けるかたちにするにはサーバプログラムでhttpsでアクセスできなければならない(Webサービスはそのように作るべき)
ここでは認証コードをブラウザ上で表示してユーザーにコピペしてもらう形式をとる。ブラウザではないデスクトップクライアントなどはこのような形式をとる。
ユーザーがブラウザ上で承認することで認証コードが得られる。
params = urlencode(dict(
client_id=client_id,
response_type="code",
redirect_uri="urn:ietf:wg:oauth:2.0:oob", # ブラウザ上にcode表示
scope=SCOPE
))
return 'https://mstdn.jp/oauth/authorize?'+params
アクセストークンの取得
認証コード、client_id, client_secretの3つを使用してアクセストークンの発行を行う。
res = requests.post('https://mstdn.jp/oauth/token', dict(
grant_type="authorization_code",
redirect_uri="urn:ietf:wg:oauth:2.0:oob",
client_id=client_id,
client_secret=client_secret,
code=code
)).json()
return res["access_token"]
アクセストークンが得られるのでこれを利用してAPIのAuthorizationヘッダに使用する。