linRichielinRichie
前端
Python
Linux
ChatGPT
  • B 站
  • 500px
前端
Python
Linux
ChatGPT
  • B 站
  • 500px
    • Python学习指南
  • 快速开始

    • Python: 输入与输出 (I/O)
    • Python: 异常处理 try-except
    • Python: List深入概述
    • Python: 面向对象编程(OOP)
  • Python 语法库函数

    • 语法库目录
    • 库

      • library目录
      • argparse:解析命令行参数
      • difflib:比较序列并生成差异信息
      • dnspython: DNS处理库
      • IPy:IP地址处理库
      • logging:记录和管理日志信息
      • os:访问和操作操作系统
      • psutil:系统性能信息库
      • re:正则表达式库
      • smtplib:邮件发送库
    • 函数

      • function目录
      • any() 函数
      • input 函数
      • lambda 和 map 函数
      • reversed()函数
      • zip()函数
    • 语句

      • statement目录
      • import 语句
      • Try/Exception 异常
    • 概念

      • concept目录
      • 深拷贝与浅拷贝
      • 列表、字典与元组
      • 文件读写
      • IO: 输入与输出
      • 逻辑判断与条件语句
      • OOP 面向对象:class
      • OOP: 面向对象编程
  • SQLAlchemy

    • 获取insert或者update的id
  • Pandas

    • Pandas目录
    • Pandas:基础操作
    • Pandas:数据处理与转换
    • Pandas: 数据写入 excel 表格
  • Python前端框架

    • Flask

      • 1. Flask简介
      • 2. Flask程序基本结构
      • 3. Flask请求-响应循环
      • 4. flask案例: 框架网页查询IP
      • Python: Flask中的GitHub OAuth
    • Django

      • chapter-01:Django框架认识

        • 1.1 Django的产生背景
        • 1.2 MTV设计模式
        • 1.3 Django 主要功能模块
      • chapter-02:开发环境配置

        • 2.1 Python的安装与配置
        • 2.2 虚拟环境安装与配置
        • 2.3 Django安装与配置
        • 2.4 MySQL安装配置
      • chapter-03:项目框架搭建

        • 3.1 Django管理工具-创建项目骨架
        • 3.2 修改项目的默认配置
        • 3.3 初始化项目环境
      • chapter-04:ORM应用与原理剖析

        • 4.1 构建POST应用需要的数据集
        • 4.2 Model相关的概念和使用方法
        • 4.3 Model的查询操作API
        • 4.4 ORM实现原理
      • chapter-05:Django管理后台

        • 5.1 将Model注册到管理后台
        • 5.2 管理后台实现原理
      • chapter-06:视图

        • 6.1 视图基础
        • 6.2 视图的高级特性和快捷方法
        • 6.3 基于类的通用视图
      • chapter-07:模板系统

        • 7.1 模板系统基础
        • 7.2 模板语言
      • chapter-08:表单系统

        • 8.2 使用表单系统实现表单: ModelForm
      • chapter-09:用户认证系统

        • 9.1 用户与身份认证
        • 9.2 权限管理
        • 9.3 用户认证系统应用
      • chapter-10:Django路由系统

        • 10.1 路由系统基础
      • chapter-11:Django中间件

        • 11.1 中间件基础
  • Python例子

    • Python: Linux的Shell命令
    • Python: PEP8自动格式化代码
    • Python: pip操作
    • Python: 业务服务监控
    • Python: 从文件逐行读取数据
    • 将链表转换为字符串
    • Python: 检查URL是否能正常访问
    • Python: 爬取网易云音乐
    • Python: 读取目录下的所有内容
    • 案例研究:文本统计
  • Python爬虫

    • 数据解析工具:Xpath
  • 算法题

    • 02:两数相加
    • 09:回文数
    • 13:罗马数值转换为整数
    • 14:最长公共前缀

Python: Flask中的GitHub OAuth

  • 概述
  • 先决条件
  • 配置 GitHub OAuth
  • 入门
    • 安装依赖
    • 基础配置
  • 会话存储
    • 会话管理
  • GitHub OAuth 实现
    • 登录路由
    • 回调处理
    • 用户信息路由
    • 登录 github
    • 登出路由
  • 完整示例
  • 最佳实践
  • 参考资源

概述

本指南介绍如何在 Flask 应用中集成 GitHub OAuth2.0 认证,实现以下功能:

  • 使用 GitHub 账号登录
  • 处理 OAuth 回调
  • 管理用户会话

先决条件

  • Flask 2.3.3+
  • Python 3.7+
  • GitHub 账号
  • 基本的 Flask 开发经验

配置 GitHub OAuth

  1. 登录 GitHub,进入 Settings -> Developer settings -> OAuth Apps
  2. 点击 "New OAuth App"
  3. 填写应用信息:
    • Application name: 你的应用名称
    • Homepage URL: 应用首页地址
    • Authorization callback URL: 回调地址(如 http://localhost:5000/callback)
  4. 创建后获取 Client ID 和 Client Secret

入门

安装依赖

pip install flask requests

基础配置

from flask import Flask, redirect, request, session
import requests
import os

app = Flask(__name__)
app.secret_key = os.urandom(24)

# GitHub OAuth 配置
GITHUB_CLIENT_ID = "your_client_id"
GITHUB_CLIENT_SECRET = "your_client_secret"
GITHUB_REDIRECT_URI = "http://localhost:5000/callback"

会话存储

会话管理

def get_user_from_session():
    """从会话中获取用户信息"""
    return session.get('user')

def store_user_in_session(user_data):
    """存储用户信息到会话"""
    session['user'] = user_data

def clear_session():
    """清除会话"""
    session.clear()

GitHub OAuth 实现

登录路由

@app.route('/login')
def login():
    """重定向到 GitHub 授权页面"""
    return redirect(
        f'https://github.com/login/oauth/authorize?'
        f'client_id={GITHUB_CLIENT_ID}&'
        f'redirect_uri={GITHUB_REDIRECT_URI}'
    )

回调处理

@app.route('/callback')
def callback():
    """处理 GitHub 回调"""
    # 获取授权码
    code = request.args.get('code')
    if not code:
        return 'Error: No code provided', 400
    
    # 使用授权码获取访问令牌
    response = requests.post(
        'https://github.com/login/oauth/access_token',
        data={
            'client_id': GITHUB_CLIENT_ID,
            'client_secret': GITHUB_CLIENT_SECRET,
            'code': code
        },
        headers={'Accept': 'application/json'}
    )
    
    # 获取用户信息
    access_token = response.json().get('access_token')
    if access_token:
        user_data = requests.get(
            'https://api.github.com/user',
            headers={'Authorization': f'token {access_token}'}
        ).json()
        
        # 存储用户信息
        store_user_in_session(user_data)
        return redirect('/')
    
    return 'Error: Failed to get access token', 400

用户信息路由

@app.route('/user')
def user():
    """获取当前登录用户信息"""
    user_data = get_user_from_session()
    if user_data:
        return user_data
    return 'Not logged in', 401

登录 github

import supabase
# 登录 github
@app.route("/signin/github")
def signin_with_github():
 res = supabase.auth.sign_in_with_oauth(
    {
    provider": "github",
    "options": {
    "redirect_to": f"{request.host_url}callback"
    },
    }
 )
 return redirect(res.url)

登出路由

@app.route('/logout')
def logout():
    """清除用户会话"""
    clear_session()
    return redirect('/')

完整示例

from flask import Flask, redirect, request, session
import requests
import os

app = Flask(__name__)
app.secret_key = os.urandom(24)

# GitHub OAuth 配置
GITHUB_CLIENT_ID = os.getenv("GITHUB_CLIENT_ID")
GITHUB_CLIENT_SECRET = os.getenv("GITHUB_CLIENT_SECRET")
GITHUB_REDIRECT_URI = "http://localhost:5000/callback"

# ... 其他路由代码 ...

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

最佳实践

  1. 安全性

    • 使用环境变量存储敏感信息
    • 实现 CSRF 保护
    • 使用 HTTPS
  2. 错误处理

    • 处理所有可能的错误情况
    • 提供友好的错误信息
    • 记录错误日志
  3. 用户体验

    • 添加加载状态
    • 实现记住登录状态
    • 提供清晰的提示信息

注意:

  • 妥善保管 Client Secret
  • 注意 API 访问限制
  • 定期刷新 token
  • 处理会话过期

参考资源

  • GitHub OAuth 文档
  • Flask 文档
  • OAuth 2.0 规范
Prev
4. flask案例: 框架网页查询IP