本文探讨如何在 Python Flask 框架中使用 GitHub Auth 做授权登录。即一个 Flask 应用,如何集成第三方的 GitHub 账号系统来做登录。
开始前,需要先「申请一个 GitHub Auth 应用」。申请完成后,记录好生成的 CLIENT_ID 和 CLIENT_SECRET。
GitHub Auth 应用申请页面如下图所示:
GitHub Auth 是标准的 OAuth2 认证实现,如下 Python Flask 程序使用了 Authlib 包。
该程序有四个页面,分别为:
首页(index)
根据 Session 信息,判断用户是否已登录,若已登录,则显示欢迎信息;未登录,则显示登录链接。
登录页面(login)
页面会跳转至 GitHub 认证页。
GitHub 回调页面(callback)
GitHub 登录并授权后,接收 Code 并获取 Token,然后根据 Token 请求用户信息并写入 Session,最后跳转至首页。
登出页面(logout)
清除 Session 信息。
from flask import Flask, url_for, redirect, session
from authlib.integrations.flask_client import OAuth
import os
app = Flask(__name__)
app.secret_key = '812848ea396c6aa794e6b6c9'
github = OAuth(app).register(
name='github',
client_id=os.getenv('CLIENT_ID'),
client_secret=os.getenv('CLIENT_SECRET'),
access_token_url='https://github.com/login/oauth/access_token',
access_token_params=None,
authorize_url='https://github.com/login/oauth/authorize',
authorize_params=None,
api_base_url='https://api.github.com/',
client_kwargs={'scope': 'user:email'},
)
@app.route('/')
def index():
user = session.get('user_email')
if user is None:
login_url = url_for('login', _external=True)
return f'<p><a href="{login_url}">Login</a></p>'
logout_url = url_for('logout', _external=True)
return f'<p>Welcome {user}! | <a href="{logout_url}">Logout</a></p>'
@app.route('/login')
def login():
callback_uri = url_for('callback', _external=True)
return github.authorize_redirect(callback_uri)
@app.route('/callback')
def callback():
token = github.authorize_access_token()
resp = github.get('user', token=token)
profile = resp.json()
session['user_email'] = profile['email']
return redirect('/')
@app.route('/logout')
def logout():
session.pop('user_email', None)
return redirect('/')
if '__main__' == __name__:
app.run(debug=True)
使用如下命令安装依赖包、指定 CLIENT_ID 和 CLIENT_SECRET 变量值并运行程序。
python3 -m pip install -r requirements.txt
export CLIENT_ID=XXX
export CLIENT_SECRET=XXX
python3 app.py
程序启动完成后,浏览器访问http://localhost:5000
。
登录过程如下图所示:
综上,本文探索了如何在 Python Flask 框架中集成 GitHub Auth 来做登录。示例程序代码已托管至本人 GitHub,欢迎关注和 Fork。
参考资料
[1] Flask Quickstart | Flask - flask.palletsprojects.com
[2] New OAuth Application | GitHub - github.com
[3] Authenticating to the REST API with an OAuth App | GitHub Docs - docs.github.com
[4] GitHub OAuth 第三方登录示例教程 | 阮一峰的网络日志 - www.ruanyifeng.com
[5] Authentication with Flask and GitHub | Dev Community - dev.to
[6] Authentication with Cookies and Sessions in Flask | Rithm School - www.rithmschool.com