QiitaAPI という Qiita を扱うのに便利な API があります。 https://qiita.com/api/v2/docs
これを Django で使ってみるサンプルです。
Oauth のみをこの記事では取り扱います(それ以外は単純にリクエスト送るだけなので、、)
以下の URL からアプリケーションを登録します。 https://qiita.com/settings/applications
Client ID
と Client Secret
が手に入ります。
認証周り
GET /api/v2/oauth/authorize
ユーザーに対して認可画面を表示します。
ユーザーが認可すると、上記のアプリケーション登録で指定した CallbackURL に code
が付与されます。
他に scope
と state
をパラメータで指定します。
スコープに関してはこちら
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_id
と client_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 が正しいかを確認しています。
完成!