简介
本篇文章以 GitHub 为示例, 展示一个使用OAuth 实现第三方登录的简单 Demo, 后台使用 Flask
注册
注册 OAuth Apps, 在 GitHub 的 setting/Developer setting 界面, 选择新增 OAuth App

在 Demo 阶段, URL 设为本机地址

之后添加一个 client secret, 后边会使用 client id 和 client secret 以及 跳转地址 “http://127.0.0.1:5000/oauth/redirect”
后台
保存全局参数
oauth_info = {
"client_id": "d1c8a036b4daf17d110d",
"client_secret": "d33da54871cd978b9e4203ed373ceb62c20063d3",
"redirect_uri": "http://127.0.0.1:5000/oauth/redirect"
}
BASE_URL = "https://github.com/login/oauth/"
client_id 和 client_secret 可以修改为自己申请的参数
主页视图
向 GitHub 发送授权请求
相应地址为:
https://github.com/login/oauth/authorize?client_id=7e015d8ce32370079895&redirect_uri=http://localhost:8080/oauth/redirect
import urllib.parse
# 主页视图
@app.route('/', methods=['GET'])
def index():
q_string = urllib.parse.urlencode({
"client_id": oauth_info["client_id"],
"redirect_uri": oauth_info["redirect_uri"]
})
# 组装授权申请地址
oauth_url = BASE_URL + "/authorize?" + q_string
return f"<h3><a href='{oauth_url}'>Login</a></h3>"
主页很简单, 就一个登录链接

点击后跳转授权界面

登录 GitHub 后将跳转到 “http://127.0.0.1:5000/oauth/redirect?code=1a20d2be4bc9d7f74fbb”, 并附带一个授权码, 这样我们就得处理这个视图
跳转页面视图
得到授权码后, 下一步就是获取令牌, 再由令牌获取 GitHub 用户信息
import requests
@app.route("/oauth/redirect")
def oauth():
token_url = BASE_URL + "/access_token"
# 获取授权码
auth_code = request.args.get("code")
params = {
"client_id": oauth_info["client_id"],
"client_secret": oauth_info["client_secret"],
"code": auth_code
}
headers = {
"accept": "application/json",
}
# 请求令牌
res = requests.post(token_url, params=params, headers=headers)
# 获取令牌
token = res.json().get("access_token")
# 带上令牌
headers["Authorization"] = "token " + token
# 获取用户信息, API 地址为 https://api.github.com/user
res = requests.get("https://api.github.com/user", headers=headers)
return f"<h3>{res.json().get('name')}</h3>"
该视图处理的结果为展示 GitHub 用户名

整个代码
import urllib.parse
import requests
from flask import Flask, request
app = Flask(__name__)
BASE_URL = "https://github.com/login/oauth/"
oauth_info = {
"client_id": "d1c8a036b4daf17d110d",
"client_secret": "d33da54871cd978b9e4203ed373ceb62c20063d3",
"redirect_uri": "http://127.0.0.1:5000/oauth/redirect"
}
# 主页视图
@app.route('/', methods=['GET'])
def index():
q_string = urllib.parse.urlencode({
"client_id": oauth_info["client_id"],
"redirect_uri": oauth_info["redirect_uri"]
})
# 组装授权申请地址
oauth_url = BASE_URL + "/authorize?" + q_string
return f"<h3><a href='{oauth_url}'>Login</a></h3>"
# 跳转页面视图
@app.route("/oauth/redirect")
def oauth():
token_url = BASE_URL + "/access_token"
# 获取授权码
auth_code = request.args.get("code")
params = {
"client_id": oauth_info["client_id"],
"client_secret": oauth_info["client_secret"],
"code": auth_code
}
headers = {
"accept": "application/json",
}
# 请求令牌
res = requests.post(token_url, params=params, headers=headers)
# 获取令牌
token = res.json().get("access_token")
# 带上令牌
headers["Authorization"] = "token " + token
# 获取用户信息, API 地址为 https://api.github.com/user
res = requests.get("https://api.github.com/user", headers=headers)
return f"<h3>{res.json().get('name')}</h3>"
if __name__ == '__main__':
app.run(debug=True)