OAuth 2.0 授权流程详解与 FastAPI 实现

news2024/9/23 5:15:15

在现代网络应用中,OAuth 2.0 已成为授权和认证的标准协议。它允许用户将访问权限授予第三方应用,而无需暴露自己的用户名和密码。本文将详细介绍 OAuth 2.0 的常见授权流程,并展示如何在 FastAPI 中实现这些流程。
在这里插入图片描述

OAuth 2.0 简介

OAuth 2.0 是一个授权框架,它定义了多种授权流程,允许用户将权限授予第三方应用。这些流程包括:

  1. 授权码流程:适用于 Web 应用,通过授权码交换访问令牌。
  2. 密码凭据流程:适用于能够安全存储用户凭证的应用。
  3. 客户端凭据流程:适用于服务器到服务器的通信。
  4. 简化授权流程:适用于纯前端应用,如 JavaScript 应用。
  5. 设备授权流程:适用于输入受限的设备,如智能电视。

OAuth 2.0 授权流程详解

1. 授权码流程

适用场景:Web 应用。

流程

  • 用户访问客户端应用并请求授权。
  • 客户端重定向用户到授权服务器。
  • 用户登录并授权客户端应用。
  • 授权服务器返回授权码给客户端。
  • 客户端使用授权码请求访问令牌。

2. 密码凭据流程

适用场景:命令行工具、移动应用。

流程

  • 用户向客户端提供用户名和密码。
  • 客户端使用这些凭证直接请求访问令牌。

3. 客户端凭据流程

适用场景:服务器到服务器的通信。

流程

  • 客户端直接向授权服务器进行身份验证。
  • 授权服务器返回访问令牌给客户端。

4. 简化授权流程

适用场景:纯前端应用。

流程

  • 用户被重定向到授权服务器进行认证。
  • 授权服务器直接返回访问令牌给客户端。

5. 设备授权流程

适用场景:输入受限的设备。

流程

  • 设备请求授权码。
  • 用户在另一个设备上输入授权码进行授权。
  • 设备使用授权码请求访问令牌。

FastAPI 中的 OAuth 2.0 实现

FastAPI 提供了与 OAuth 2.0 无缝集成的支持。以下是如何在 FastAPI 中实现 OAuth 2.0 授权流程的示例。

1. 环境准备

首先,安装必要的库:

pip install fastapi[all] python-jose[cryptography] passlib[bcrypt]

2. 代码实现

from fastapi import FastAPI, Depends, HTTPException, status
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
from jose import jwt, JWTError
from pydantic import BaseModel
from datetime import datetime, timedelta
from typing import Optional

app = FastAPI()

SECRET_KEY = "your_secret_key"
ALGORITHM = "HS256"

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")

class User(BaseModel):
    username: str
    password: str

fake_users_db = {
    "johndoe": {
        "username": "johndoe",
        "full_name": "John Doe",
        "email": "johndoe@example.com",
        "hashed_password": "fakehashedsecret",
        "disabled": False,
    }
}

def authenticate_user(username: str, password: str):
    user = fake_users_db.get(username)
    if not user:
        return False
    if user["disabled"]:
        return False
    if password != user["hashed_password"]:
        return False
    return user

def create_access_token(data: dict, expires_delta: Optional[timedelta] = None):
    to_encode = data.copy()
    if expires_delta:
        expire = datetime.utcnow() + expires_delta
    else:
        expire = datetime.utcnow() + timedelta(minutes=15)
    to_encode.update({"exp": expire})
    encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)
    return encoded_jwt

@app.post("/token")
async def login_for_access_token(form_data: OAuth2PasswordRequestForm = Depends()):
    user = authenticate_user(form_data.username, form_data.password)
    if not user:
        raise HTTPException(
            status_code=status.HTTP_401_UNAUTHORIZED,
            detail="Incorrect username or password",
            headers={"WWW-Authenticate": "Bearer"},
        )
    access_token = create_access_token(data={"sub": user["username"]})
    return {"access_token": access_token, "token_type": "bearer"}

@app.get("/items/")
async def get_items(token: str = Depends(oauth2_scheme)):
    credentials_exception = HTTPException(
        status_code=status.HTTP_401_UNAUTHORIZED,
        detail="Could not validate credentials",
        headers={"WWW-Authenticate": "Bearer"},
    )
    try:
        payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
        username: str = payload.get("sub")
        if username is None:
            raise credentials_exception
    except JWTError:
        raise credentials_exception
    user = fake_users_db.get(username)
    if user is None:
        raise credentials_exception
    return {"username": user["username"], "items": ["item1", "item2"]}

@app.get("/token/fake")
async def fake_token():
    return create_access_token(data={"sub": "fake_user"})

3. 测试

使用 curl 测试 FastAPI 应用:

# 获取访问令牌
curl -X POST http://localhost:8000/token -d "username=johndoe&password=fakehashedsecret" -s

# 使用访问令牌访问受保护的端点
curl http://localhost:8000/items/ -H "Authorization: Bearer <ACCESS_TOKEN>"

替换 <ACCESS_TOKEN> 为你从 /token 端点获得的实际令牌。

总结

OAuth 2.0 提供了灵活的授权流程,适用于各种应用场景。FastAPI 通过内置的支持,使得实现 OAuth 2.0 变得简单。通过本文的示例,你可以快速在你的应用中集成 OAuth 2.0 授权流程。

作为博主,我一直致力于创作高质量的技术内容,如果你觉得这篇文章对你有帮助,希望你能点赞、转发、收藏,给予我更多的支持和鼓励。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2122342.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数字化转型不是终点,数字技术服务平台如何陪伴企业持续进化?

数字化转型确实不是终点&#xff0c;而是一个持续的过程&#xff0c;它要求企业不断适应变化、优化流程、创新业务模式。数字技术服务平台在陪伴企业持续进化方面扮演着至关重要的角色&#xff0c;具体体现在以下几个方面&#xff1a; 灵活性与可扩展性&#xff1a;数字技术服…

误删文件后的数据救赎实战恢复指南

误删文件的痛与思 在数字化时代&#xff0c;数据已成为我们生活与工作中不可或缺的一部分。无论是个人用户保存的家庭照片、工作文档&#xff0c;还是企业用户存储的财务数据、客户资料&#xff0c;都承载着无法估量的价值。然而&#xff0c;误删文件这一简单却致命的操作&…

【数组与广义表】(基本概念与思路)

1.数组的定义及特点 数组&#xff1a;按一定格式排列起来的&#xff0c;具有相同类型的数据元素的集合。 1.1一维数组 若线性表中的数据元素为非结构的简单元素&#xff0c;则称为一维数组。一维数组的逻辑结构:线性结构&#xff0c;定长的线性表声明格式:数据类型 变量名称…

仪表板展示丨DataEase看中国:中国月饼行业消费趋势报告

中秋节是中国最重要的传统节日之一&#xff0c;月饼是具有浓厚节日特色的传统美食。近年来&#xff0c;月饼市场呈现出诸多新趋势和消费特点。在本文中&#xff0c;我们使用DataEase开源BI工具&#xff08;http://github.com/dataease&#xff09;对中国月饼行业的消费趋势进行…

敏捷开发方法例题

答案&#xff1a;B 敏捷方法 特点 极限编程XP 4大价值观&#xff0c;5大原则&#xff0c;12个最佳实践 水晶法 认为每一个不同的项目都需要一套不同的策略&#xff0c;约定和方法论&#xff0c;认为人对软件质量有重要影响&#xff0c;因此随着项目质量和开发人员须知的提…

洛谷 P7391 「TOCO Round 1」自适应 PVZ

原题链接t 题目来源于&#xff1a;洛谷 题目本质&#xff1a;贪心&#xff0c;排序&#xff0c;平衡树 题目思路&#xff1a;把僵尸出现时刻和走进房子时刻想成左端点和右端点&#xff0c;按照右端点从小到大排序。第二对于同样可以使用的豌豆射手&#xff0c;我们一定选择上…

在 HKCR 新增项和值

; 1. Win11 HKCR 根键默认是 System 所有, Win10 HKCR 根键默认是 Administrators 所有。 ; 2. 以 System、管理员 还是 普通用户 登录系统&#xff1f; ; 在注册表里&#xff0c;操作 HKCR 行为与以上两项无关&#xff0c;都统一如下: ; 项 查权限所有者 当…

QT5实现https的post请求(QNetworkAccessManager、QNetworkRequest和QNetworkReply)

QT5实现https的post请求 前言一、一定要有sslErrors处理1、问题经过2、代码示例 二、要利用抓包工具1、问题经过2、wireshark的使用3、利用wireshark查看服务器地址4、利用wireshark查看自己构建的请求报文 三、返回数据只能读一次1、问题描述2、部分代码 总结 前言 QNetworkA…

单片机-STM32 看门狗(八)

目录 一、看门狗概念 1、定义&#xff1a; 二、单片机中的看门狗 1、功能描述&#xff1a; 2、看门狗设置部分 预分频寄存器(IWDG_PR) 3、窗口看门狗 特性&#xff1a; 4、看门狗配置&#xff1a; 一、看门狗概念 看门狗--定时器&#xff08;不属于基本定时器、通用定…

HTTP 协议和 APACHE 服务

WEB 服务基础 Internet 因特网 因特网是 Internet 的中文译名 在 20 世纪 60 年代&#xff08;冷战时期&#xff09;&#xff0c;美国国防部高等研究计划署&#xff08;ARPA&#xff09;出于军事上的目的&#xff0c;建立了 ARPA 网络&#xff0c;该网络由四个分布在不同地方…

FreeRTOS基础入门——FreeRTOS互斥信号量(十六)

个人名片&#xff1a; &#x1f393;作者简介&#xff1a;嵌入式领域优质创作者&#x1f310;个人主页&#xff1a;妄北y &#x1f4de;个人QQ&#xff1a;2061314755 &#x1f48c;个人邮箱&#xff1a;[mailto:2061314755qq.com] &#x1f4f1;个人微信&#xff1a;Vir2025WB…

本地部署Llama 3.1大模型

Meta推出的Llama 3.1系列包括80亿、700亿、4050亿参数版本&#xff0c;上下文长度扩展至12.8万tokens&#xff0c;并增加了对八种语言的支持。 部署模型需要用到Ollama的一个工具&#xff0c;访问官方网站https://ollama.com 点击下载&#xff0c;选择下载你对应的操作系统下…

opencv图像透视处理

引言 在图像处理与计算机视觉领域&#xff0c;透视变换&#xff08;Perspective Transformation&#xff09;是一种重要的图像校正技术&#xff0c;它允许我们根据图像中已知的四个点&#xff08;通常是矩形的四个角&#xff09;和目标位置的四个点&#xff0c;将图像从一个视…

2024.9.10 作业

代码&#xff1a; /*******************************************/ 文件名&#xff1a;widget.h /*******************************************/ #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QLabel> #include <QTimeEdit> #includ…

opencv学习:信用卡卡号识别

该代码用于从信用卡图像中自动识别和提取数字信息。该系统将识别信用卡类型&#xff0c;并输出信用卡上的数字序列。 1.创建命令行参数 数字模板 信用卡 # 创建命令行参数解析器 ap argparse.ArgumentParser() # 添加命令行参数 -i/--image&#xff0c;指定输入图像路径 ap.…

破局DRG/DIP亏损,医院应该怎么做

DRG/DIP付费实施后&#xff0c;医院各临床科室可结合前期数据积累&#xff0c;根据DRG/DIP专科病组/病种四级手术占比与医疗收入占比之间的变化关系、建立DRG/DIP战略分布象限图&#xff0c;将病组分为优势病组&#xff08;病种&#xff09;、潜力病组&#xff08;病种&#xf…

线程(Thread)

目录 线程&#xff08;Thread&#xff09; 线程的创建方式 实现方式 Runnable和Callable的区别 线程的命名和优先级 线程的六种状态 线程的插队 线程的中断 线程的让出 守护线程 设置线程为守护线程 sleep()和wait()的区别 线程的同步synchronized锁 语法格式 实现…

在线动漫信息平台

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;Spring Boot框架 工具&#xff1a;IDEA/Eclipse、Navicat、Maven 系统展示 首页 会员后台 管理员…

day-52 下一个排列

思路 从后向前遍历数组&#xff0c;把遍历过的元素加入一个有序链表&#xff0c;没变里一个元素判断链表中是否有元素大于当前遍历元素&#xff0c;如果有&#xff0c;把链表中大于当前遍历元素的元素集合中最小的那一个元素赋给当前元素&#xff0c;然后将链表中剩余元素依次赋…

建造者模式builder

此篇为学习笔记&#xff0c;原文链接 https://refactoringguru.cn/design-patterns/builder 能够分步骤创建复杂对象。 该模式允许你使用相同的创建代码生成不同类型和形式的对象