QiitaAPIのOauthをDjangoでやる

January 12, 2020

QiitaAPI という Qiita を扱うのに便利な API があります。 https://qiita.com/api/v2/docs

これを Django で使ってみるサンプルです。

Oauth のみをこの記事では取り扱います(それ以外は単純にリクエスト送るだけなので、、)

以下の URL からアプリケーションを登録します。 https://qiita.com/settings/applications

Client IDClient Secret が手に入ります。

認証周り

GET /api/v2/oauth/authorize

ユーザーに対して認可画面を表示します。 ユーザーが認可すると、上記のアプリケーション登録で指定した CallbackURL に code が付与されます。

他に scopestate をパラメータで指定します。

スコープに関してはこちら

state は CSRF 対策のためにリダイレクトする URL のクエリに含まれる値を指定できるというものです。

state = random.randint(1,100000)
request.session['qiita_state'] = state
return redirect(QIITA_OAUTH_URL + '?client_id=' + QIITA_CLIENT_ID + '&state=' + str(state) + '&scope=read_qiita+write_qiita')

stateはランダムな値でなければ意味がないのでランダムに生成してセッションに一旦保存しておきます。

POST /api/v2/access_tokens

これでアクセストークンが手に入ります。 先ほどの GET /api/v2/oauth/authorize で手に入った code を使用します。

また、同時にアプリケーションの登録で手に入った client_idclient_secret も使用します。

@csrf_exempt
def qiita_oauth(request):
    if request.method == 'GET':
        state = request.session['qiita_state']
        if state == int(request.GET.get("state")):
            if "code" in request.GET:
                code = request.GET.get("code")
                body = {
                        'client_id': QIITA_CLIENT_ID,
                        'client_secret': QIITA_CLIENT_SECRET,
                        'code': code
                        }
                header = {
                        'Content-Type': 'application/json',
                        }
                req = urllib.request.Request(QIITA_ACCESSTOKEN_URL, json.dumps(body).encode(), header)
                try:
                    with urllib.request.urlopen(req) as res:
                        #成功後の処理
                except urllib.error.HTTPError as err:
                    #リクエスト失敗後の処理
                except urllib.error.URLError as err:
                    #リクエスト失敗後の処理
            else:
                #state認証失敗後の処理

if state == int(request.GET.get("state")):で state が正しいかを確認しています。

完成!

このエントリーをはてなブックマークに追加