19
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

mastodonのaccess tokenをauthorization_codeで取得する例

Last updated at Posted at 2017-04-19

はじめに

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ヘッダに使用する。

ソースコード

参考

19
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?