0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Flaskを使ってDiscordのOAuth2認証をする

Last updated at Posted at 2025-04-27

OAuth2認証とは?

インターネット上で安全にアクセス権を委譲するための認可フレームワーク。あるアプリがユーザーのGoogleアカウントの一部の情報(メールアドレスなど)にアクセスしたい場合に、ユーザーのパスワードを教えずにそのアクセスを許可するための仕組み。Googleでログインなどの機能がこれにあたる。
内部的にはサービス側にパスワードを教えることなく認証にも使うことができるので安全である。

OAuth2認証をしてみよう

文章で理解するよりも実際に手を動かしたほうが理解力が高まると思うので実際にコードを書いてみましょう。
今回使用するフレームワークはFlaskです。似たようなフレームワークにDjangoというものがありますがあちらは高性能高機能に対し、Flaskは軽量手軽なことがメリットとしてあげられる。ここではPythonのインストールが終わっていてpipが利用できることを想定する

OAuth2認証に必要なclient secretとclient idを入手しよう

https://discord.com/developers/applications にアクセスし、ログインをしたあとに左上のNew Applicationを押す
2025-04-24_00h59_58.png

By clicking Create, you agree to the Discord にチェックを入れてアプリケーションの名前を作る。ここでは例としてtestAppと名付ける。
2025-04-24_01h01_41.png
この画面が出たら成功だ。
次に画面左のOAuth2を押す。ここでClient informationに書いてあるClient IDをコピーしテキストエディタ等にメモしておく、その後Reset Secretを押すと下のようにでるのでYes do it!を押したあとDiscordをログインするときのパスワードを入力する。
2025-04-24_01h03_28.png

2025-04-24_01h04_27.png
その後Client secretも見れる状態になっていると思うのでこれもメモしておく。

callbackのurlを設定しよう

色々なサービスでGoogleにログインするときなど、ログインした後に自動でログインしたいサービスのURLへリダイレクトされると思うがここではDiscordでログインした後にリダイレクトされるURLを設定する。OAuth2の仕様上、ここのURLへ、リクエストクエリが追加されてFlaskに情報が渡される。詳しくは後で見る。
上のclient idとclient secretを取得した画面のまま、画面下部までスクロールすると以下のようなものがあるはずだ
2025-04-24_01h11_04.png
ここでリダイレクトされるurlを設定することができる。
2025-04-24_01h09_55.png
ここでは開発用にhttp://localhost:5100/callback と設定する。これは複数追加することができ、リダイレクトするURLその中から選択することもできる。

PythonでFlaskのプログラムを作ってみよう

今回はFlaskを使うのでまず、Flaskをインストールする。また、Discordサーバーと通信するためにrequestsと呼ばれる超定番ライブラリもインストールする。

pip install flask requests

これでインストールは完了となる。

ここまででclient id、client secretをメモしてあるはずだ。これをPythonのプログラム内では変数としてCLIENT_SECRET、CLIENT_IDとする。

app.py
from flask import Flask, redirect, request
import requests
import os

app = Flask(__name__)

CLIENT_ID = '自分のメモを参照する'
CLIENT_SECRET = '自分のメモを参照する'
REDIRECT_URI = 'http://localhost:5100/callback'
OAUTH_SCOPE = 'identify email'

DISCORD_AUTH_URL = 'https://discord.com/api/oauth2/authorize'
DISCORD_TOKEN_URL = 'https://discord.com/api/oauth2/token'
DISCORD_API_URL = 'https://discord.com/api/users/@me'

@app.route('/')
def login():
    return redirect(
        f"{DISCORD_AUTH_URL}?client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&response_type=code&scope={OAUTH_SCOPE}"
    )

@app.route('/callback')
def callback():
    code = request.args.get('code')
    data = {
        'client_id': CLIENT_ID,
        'client_secret': CLIENT_SECRET,
        'grant_type': 'authorization_code',
        'code': code,
        'redirect_uri': REDIRECT_URI,
        'scope': OAUTH_SCOPE,
    }
    headers = {
        'Content-Type': 'application/x-www-form-urlencoded'
    }

    # トークン取得
    response = requests.post(DISCORD_TOKEN_URL, data=data, headers=headers)
    response.raise_for_status()
    access_token = response.json()['access_token']

    # ユーザー情報取得
    user_info = requests.get(
        DISCORD_API_URL,
        headers={
            'Authorization': f'Bearer {access_token}'
        }
    ).json()

    return f"<pre>{user_info}</pre>"

if __name__ == '__main__':
    app.run(debug=True,port=5100)

ここまでプログラムを入力したら

python3 app.py

と入力するとflaskが起動する。
その後、http://localhost:5100/callback にアクセスするとDiscordのログインが求められ認証すると取得したユーザー情報が確認できる。

0
1
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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?