#서론
많은 서비스를 사용하면서 "카카오톡으로 로그인하기", "구글로 로그인하기" 이런것들을 많이 보셨을거에요! 이런것들이 OAuth2(Open Authorization 2.0)예요. 쉽게 말해서, 디스코드를 사용하는 유저의 정보를 수집할수 있는 서비스예요.
이번에는 디스코드, 카카오톡, 구글, 페이스북 등등 많은 서비스에서 지원하는 OAuth2를 사용해볼거예요.
#본론
우선, Discord OAuth2를 사용하기 위해서 문서를 참고해볼게요.
https://discord.com/developers/docs/topics/oauth2#authorization-code-grant-authorization-url-example
Discord Developer Portal — API Docs for Bots and Developers
Integrate your service with Discord — whether it's a bot or a game or whatever your wildest imagination can come up with.
discord.com
여기서부터 확인해보자면,
https://discord.com/api/oauth2/authorize?response_type=code&client_id=157730590492196864&scope=identify%20guilds.join&state=15773059ghq9183habn&redirect_uri=https%3A%2F%2Fnicememe.website&prompt=consent
파라미터로 response_type, client_id, scope, state, redirect_uri, prompt를 받는거 같습니다.
여기서 response_type은 code 로 고정되어있습니다. 또한 state와 prompt는 선택사항이니 이건 비워두셔도 됩니다.
필수 매개변수는 response_type, client_id, scope, redirect_uri 입니다. 딱 봐도 client_id는 봇 아이디 같으니 테스트봇을 생성해주도록 하겠습니다.
대충 생성해주고 CLIENT ID 복사해주겠습니다. 그리고 scope는 https://discord.com/developers/docs/topics/oauth2#shared-resources-oauth2-scopes
Discord Developer Portal — API Docs for Bots and Developers
Integrate your service with Discord — whether it's a bot or a game or whatever your wildest imagination can come up with.
discord.com
여기서 참고하시면 됩니다. 우리는 제일 기본적인 정보를 받아올것이기 때문에 identify 값을 사용해주겠습니다.
대충 Flask로 서버를 만들어주도록 하겠습니다. 모듈은 pip install flask 로 설치해주세요.
저는 run.py라고 이름을 짓겠습니다.
from flask import Flask, redirect
app = Flask(__name__)
CLIENT_ID = "891992167617290250"
REDIRECT_URI = "http://localhost:3000/callback"
@app.route("/")
def root():
return redirect(
f"https://discord.com/api/oauth2/authorize?response_type=code&client_id={CLIENT_ID}&scope=identify&redirect_uri={REDIRECT_URI}"
)
app.run(host='0.0.0.0', port=3000)
3000 포트로 웹서버를 열어주도록 하겠습니다. 이대로 python run.py 를 실행하고
http://localhost:3000/ 로 가보도록 할게요.
제대로 리다이렉트는 되지만, 올바르지 않은 OAuth2 리다이렉트 URI라고 하네요. 클라이언트 설정에서
리다이렉트 URI를 설정해주도록 하겠습니다.
Add Redirect 를 눌러주고, 우리가 아까 설정한 http://localhost:3000/callback 로 설정해줄게요.
이제 다시 http://localhost:3000/ 로 가볼게요.
정상적으로 되네요! Authorize를 눌러볼게요.
/callback 라우터를 만들어주지 않아 오류가 났군요.. 서버를 바로 업데이트 해볼게요. 인가 코드를 받았기 때문에 이젠 토큰을 얻을 차례입니다.
Discord Developer Portal — API Docs for Bots and Developers
Integrate your service with Discord — whether it's a bot or a game or whatever your wildest imagination can come up with.
discord.com
이걸 참고하도록 합시다.
import requests
from flask import Flask, redirect, request
app = Flask(__name__)
CLIENT_ID = "891992167617290250"
CLIENT_SECRET = "myk4qJaTG5oyx_bLal83IFmEbgOxuy14"
REDIRECT_URI = "http://localhost:3000/callback"
@app.route("/")
def root():
return redirect(
f"https://discord.com/api/oauth2/authorize?response_type=code&client_id={CLIENT_ID}&scope=identify&redirect_uri={REDIRECT_URI}"
)
@app.route("/callback")
def callback():
code = request.args.get("code")
r = requests.post(
"https://discord.com/api/v9/oauth2/token",
data={
"client_id": CLIENT_ID,
"client_secret": CLIENT_SECRET,
"grant_type": "authorization_code",
"code": code,
"redirect_uri": REDIRECT_URI,
},
headers={"Content-Type": "application/x-www-form-urlencoded"},
).json()
return r
app.run(host="0.0.0.0", port=3000)
토큰이 잘 돌아오네요! 우리는 access_token 값만 사용하면 됩니다. 이제 유저 정보를
조회할수 있는 코드를 작성할게요.
https://discord.com/developers/docs/resources/user#get-current-user
Discord Developer Portal — API Docs for Bots and Developers
Integrate your service with Discord — whether it's a bot or a game or whatever your wildest imagination can come up with.
discord.com
import requests
from flask import Flask, redirect, request
app = Flask(__name__)
CLIENT_ID = "891992167617290250"
CLIENT_SECRET = "myk4qJaTG5oyx_bLal83IFmEbgOxuy14"
REDIRECT_URI = "http://localhost:3000/callback"
@app.route("/")
def root():
return redirect(
f"https://discord.com/api/oauth2/authorize?response_type=code&client_id={CLIENT_ID}&scope=identify&redirect_uri={REDIRECT_URI}"
)
@app.route("/callback")
def callback():
code = request.args.get("code")
token = requests.post(
"https://discord.com/api/v9/oauth2/token",
data={
"client_id": CLIENT_ID,
"client_secret": CLIENT_SECRET,
"grant_type": "authorization_code",
"code": code,
"redirect_uri": REDIRECT_URI,
},
headers={"Content-Type": "application/x-www-form-urlencoded"},
).json()["access_token"]
user = requests.get(
"https://discord.com/api/v9/users/@me",
headers={
"Content-Type": "application/x-www-form-urlencoded",
"Authorization": f"Bearer {token}",
},
).json()
return user
app.run(host="0.0.0.0", port=3000)
잘 작동하네요!
#결론
처음 글 작성해보는거라 잘 작성했는지 모르겠네요 ㅎㅎ;
이번 글에서 불편했던점이나, 강의 추천도 얼마든지 환영입니다!