构建简单的OAuth受保护资源

如何在FastAPI中轻松实现OAuth2认证并保护你的API? title: 如何在FastAPI中轻松实现OAuth2认证并保护你的API?author:excerpt:OAuth2 是现代应用程序实现安全认证的行业标准协议,通过令牌而非直接使用用户凭证进行授权。FastAPI 提供类支持密码授权模式,流程包括用户提交凭证、服务器验证、生成访问令牌及验证令牌有效性。配置安全模块需安装依赖库并创建,包含密码哈希、验证及 JWT 令牌生成功能。用户认证通过模拟数据库实现,提供登录接口和受保护路由。安全路由保护机制依赖函数验证令牌。 阅读详情

构建简单的OAuth受保护资源

资源服务器需要从传入的HTTP请求中解析出OAuth令牌,验证令牌,并确定它能用于那些请求

解析HTTP请求中的OAuth令牌

    var getAccessToken = function(req, res, next){
        var inToken = null;
        var auth = req.headers['authorization'];
        if(auth && auth.toLowerCase().indexOf('bearer') == 0){
            inToken = auth.slice('bearer'.length);
        } else if(req.body && req.body.access_token){
            inToken = req.body.access_token;
        } else if(req.query && req.query.access_token){
            inToken = req.query.access_token;
        }
    };

存储验证令牌

令牌存储方式:

  • 共享数据库

  • 令牌内省Web协议,由授权服务器提供接口,让资源服务器能够在运行时检查令牌状态

  • 令牌内包含受保护资源能直接解析并理解的信息,JWT就是这样一种数据结构,可以使用受加密的JSON对象携带声明信息

验证令牌

    var getAccessToken = function(req, res, next){
        var inToken = null;
        var auth = req.headers['authorization'];
        if(auth && auth.toLowerCase().indexOf('bearer') == 0){
            inToken = auth.slice('bearer'.length);
        } else if(req.body && req.body.access_token){
            inToken = req.body.access_token;
        } else if(req.query && req.query.access_token){
            inToken = req.query.access_token
        }
        console.log('Incoming token: %s', inToken);
        nosql.one(function(token){
            if(token.access_token == inToken){
                return token;
            }
        }, function(err, token){
            if(token){
                console.log('We found a matching token: %s', inToken);
            } else {
                console.log('No matching token was found.');
            }
            req.access_token = token;
            next();
            return;
        })
    };

根据令牌提供内容

    var requireAccessToken = function(req, res, next){
        if(req.access_token){
            next();
        } else {
            res.status(401).end();
        }
    };

不同权限范围对应不同操作

    app.get('/words', getAccessToken, requireAccessToken, function(req, res){
        if(__.contains(req.access_token.scope, 'read')){
            res.json({words: savedWords.join(' '), timestamp: Data.now()});
        } else {
            res.set('WWW-Authenticate', 'Bearer realm=localhost:9002, error = "insufficient_scope", scope = "read"');
            res.status(403);
        }
    });

    app.post('/words', getAccessToken, requireAccessToken, function(req, res){
        if(__.contains(req.access_token.scope, 'write')){
            if(req.body.word){
                savedWords.push(req.body.word);
            }
            res.stastus(201).end();
        } else {
            res.set('WWW-Authenticate', 'Bearer realm = localhost:9002, error = "insufficient_scope", scope = "write"')
            res.status(403);
        }
    });

    app.delete('/words', getAccessToken, requireAccessToken, function(req, res){
        if(__.contains(req.access_token.scope, 'delete')){
            savedWord.pop();
            res.status(204).end();
        } else {
            res.set('WWW-Authenticate', 'Bearer realm = location:9002, error = "insufficient_scope", scope = "delete"')
        }
    });

不同权限范围对应不同数据结果

    app.get('/produce', getAccessToken, requireAccessToken, function(req, res){
        var produce =  {fruit: [], veggies: [], meats: []};
        if(__.contains(req.access_token.scope, 'fruit')){
            produce.fruit = ['apple', 'banana', 'kiwi'];
        }
        if(__.contains(req.access_token.scope, 'veggies')){
            produce.veggies = ['lettuce', 'onion', 'potato'];
        }
        if(__.contains(req.access_token.scope, 'meats')){
            produce.meats = ['bacon', 'steak', 'chicken breast'];
        }
    });

不同用户对应不同数据结果

    app.get('/favorites', getAccessToke, requireAccessToken, function(req, res){
       if(req.access_token.user == 'alice'){
           res.json({user: 'Alice', favorites: aliceFavorites});
       } else if(req.access_token.user == 'bob'){
           res.json({user: 'Bob', favorites: bobFavorites});
       } else {
           var unknow = {user: 'Unknown', favorites: {movies:[], foods: [], music: []}};
           res.json(unknown);
       }
    });
8、构建简单的OAuth客户端与受保护资源 本文详细介绍了如何构建一个简单的OAuth客户端与受保护资源。内容涵盖获取和刷新访问令牌的步骤,解析和验证OAuth令牌的方法,以及根据作用域和资源所有者对请求进行差异化处理的策略。同时,还包括错误处理建议和系统优化方法,帮助开发者构建安全可靠的OAuth系统。 阅读详情

相关推荐

8、构建简单的 OAuth 客户端与受保护资源

本文详细介绍了如何构建一个简单的 OAuth 客户端与受保护资源。重点讲解了 OAuth 2.0 中访问令牌的刷新机制,包括如何处理令牌过期、刷新令牌的使用以及失败处理。同时,还展示了如何创建一个受保护资源,解析和验证 OAuth 令牌,并基于令牌的有效性处理请求。最后,总结了客户端和受保护资源的实现要点,并探讨了实际应用中的安全性、性能优化和扩展性问题,以及常见问题的解决方案。通过本文,读者可以掌握构建安全、高效的 OAuth 认证系统的关键步骤和技术。

d6e7f8g9h的博客 41

SpringSecurity的OAuth2的授权服务器配置

SpringSecurity Oauth2 授权服务器

Xjzzon的博客 1846

使用Spring Boot实现OAuth资源保护的前端

您可以使用Spring Initializr(https://start.spring.io/)来生成一个空的Spring Boot项目,然后将所需的依赖项添加到您的构建文件中。OAuth是一种常用的身份验证和授权协议,它允许用户使用他们在第三方身份提供者(如Google、Facebook等)上的凭据来访问您的应用程序。现在,您的Spring Boot应用程序中的OAuth资源保护前端已经准备好了。上述代码配置了一个简单的安全规则,允许所有用户访问应用程序的首页(“/”),但要求对其他所有请求进行认证。

EipGemms的博客 77

linux安装完docker之后,执行systemctl start docker启动docker报Unknown operation ‘start docker‘错误

我的linux操作系统是CentOS 7.3 64位,安装完docker之后,执行systemctl start docker启动docker报Unknown operation 'start docker'错误 于是我用systemctl start docker.service命令就能正常启动docker。 我用systemctl stopdocker也是同样报Unknown operation"stop docker",后面改用service docker stop就能正常关闭docker了. .

qq_34046046的博客 1万+

7、构建简单 OAuth 客户端指南

本文详细介绍了如何构建一个简单的OAuth客户端,涵盖OAuth 2.0协议的核心流程,包括客户端注册、使用授权码授予类型获取访问令牌、通过访问令牌访问受保护资源、刷新令牌机制,以及不同客户端类型和授权类型的适用场景。同时,还讨论了在实现OAuth时需要注意的关键安全性问题,如保护客户端密钥、使用HTTPS、验证重定向URI、防止CSRF攻击和保护刷新令牌等。通过本文,开发者可以掌握构建安全高效的OAuth客户端的基本步骤和实践方法。

d6e7f8g9h的博客 54

QMI8658姿态传感器实战:从校准到自检的完整避坑指南

本文详细解析了QMI8658姿态传感器的校准与自检流程,提供了从硬件环境搭建到高级功能开发的完整避坑指南。通过真实案例揭示电源设计、接口优化、温度补偿等关键细节,帮助开发者提升传感器精度和可靠性,适用于工业级应用场景。

weixin_29184075的博客 457

OAuth2授权客户端访问资源服务

OAuth客户端访问资源服务 一、简介 在单点登录一文,我们是通过注解@EnableOAuth2Sso实现单点登录的,我们了解到OAuth2获取token的方式是通过OAuth2RestOperations请求授权服务获取授权码的模式实现的,当授权服务认证通过事后携带code转发到重定向地址(如客户端服务器的/login地址),客户端获取到code之后,在通过code交换到token。最后通过token的权限鉴定用户是否能否访问对应资源; @EnableOAuth2Sso实现的原理是通过OAuth2Rest

lixiang987654321的专栏 2490

2024.6.15丨基于VFDB数据库的致病菌毒力因子注释实战指南

本文提供了一份基于VFDB数据库进行致病菌毒力因子本地化注释的实战指南。详细介绍了从环境准备、DIAMOND工具安装、VFDB数据库选择与构建,到核心比对操作及结果解读与过滤的全流程。重点阐述了本地化分析相较于在线工具在速度、稳定性和批量处理上的优势,旨在帮助微生物基因组研究人员高效、精准地识别致病菌的关键毒力因子。

weixin_29220405的博客 276

OAuth--资源服务配置、测试

资源服务配置 @EnableResourceServer 注解到一个 @Configuration 配置类上,并且必须使用 ResourceServerConfigurer 这个 配置对象来进行配置(可以选择继承自 ResourceServerConfigurerAdapter 然后覆写其中的方法,参数就是这个 对象的实例),下面是一些可以配置的属性: ResourceServerSecurity...

吴声子夜歌的博客 785

LTspice introduction - 2 LTspice的界面

LTspice的界面主要有两个:Schematic Capture和Waveform Viewer Schematic Capture 它主要是用来画电路图的,画完电路图之后,添加一些dot 命令同时选择一些仿真的参数,点击执行(Run)Waveform Viewer 如果你的仿真不是op point的话,一个都会打开它,在它里面你可以画图相应的图形。 有两种方式可以在Viewer

贾亮的专栏 3223

ABAP HANA BP主数据批导

SAPhana官方推荐的创建bp主数据的类是CL_MD_BP_MAINTAIN 客户的创建具体示例代码如下: DATA: LT_RETURN_MAP TYPE MDG_BS_BP_MSGMAP_T. DATA: LS_RETURN_MAP TYPE MDG_BS_BP_MSGMAP. DATA: LS_MESSAGE_MAP TYPE MDG_BS_BP_MSGMAP_KEY. DATA: LT_DATA TYPE CVIS_EI_EXTERN_.

IamRunjiang的博客 4145

apache启动报错原因和解决方案

一. 现象 今天项目搭建测试环境时,启动apache报错,错误日志如下: [code="java"][wolf@ccbudev150133x bin]$ ./startws Start server copy ...... OK! Start JBoss configuration copy ...... OK! [color=red](13)Permission denied:[...

自由的天空 2911

手把手教你用运放搭建方波三角波发生器(附Multisim仿真文件)

本文详细解析了使用运算放大器搭建方波和三角波发生器的核心原理与设计步骤。通过剖析迟滞比较器与积分器的联动机制,指导读者进行电路设计、元件选型,并借助Multisim仿真进行参数调优与波形优化。文章提供了从理论分析、虚拟仿真到实物焊接调试的完整实践指南,并附有仿真文件,帮助硬件爱好者与初学者深入掌握这一经典模拟电路设计。

weixin_29165725的博客 642

如何通过PKCE模式访问受Oauth2保护的资源

本文用来说明vue如何使用PKCE模式访问受oauth2保护的资源。所用技术栈包括spring boot, spring security和vue.

weixin_44058446的博客 6417

SIwave仿真手册——信号完整性仿真之S参数的提取(二)

上一篇简单了讲述了软件的各个操作界面,本次博客更新关于的仿真,因为第二章完整的内容比较多,所以分成好几篇博客进行分享。

luohuo9844的博客 1万+

【全部更新】2025金地杯E题山西省大学生数学建模思路代码文章教学:高速铁路牵引供电系统能耗优化

问题四将列车的运行速度与发车时间同时作为优化变量,建立联合优化模型,目标是在考虑电价机制和调度均衡性的前提下,使牵引供电系统一天内的总电费支出最小。问题三在考虑分时电价机制的基础上,基于遗传算法优化列车速度组合,使牵引供电系统一天内的总电费支出最小。然而,在实际运营中,不同时段的电价差异显著,合理安排列车的运行时间与运行速度,可有效降低系统的总电费支出。本研究聚焦于高速铁路牵引供电系统的能耗与电费优化问题,针对列车运行速度、发车时间与分时电价的综合影响,提出一系列数学模型,以实现系统能耗与电费的最小化。

xb459149247的博客 5289

Spring Security OAuth2资源服务器实战:构建受保护的RESTful API

OAuth2作为一种行业标准的授权协议,其核心原理在于通过颁发访问令牌(Token)来代表资源拥有者的授权,允许客户端在无需暴露用户凭证的情况下访问受保护的资源。这一机制为现代分布式系统和微服务架构提供了安全、标准化的身份验证与授权解决方案,其技术价值在于实现了安全的API访问控制和权限委派。在典型的应用场景中,如前后端分离应用、第三方应用集成或微服务间的服务调用,OAuth2协议确保了资源访问的安全性与可控性。本文聚焦于OAuth2体系中的资源服务器(Resource Server)实现,详细阐述了如何基

weixin_30338497的博客 425

如何快速上手spring-rest-service-oauth:5分钟搭建OAuth保护的REST API

spring-rest-service-oauth是一个使用Spring Boot和Spring Security OAuth构建的简单OAuth保护REST服务,能帮助开发者快速实现安全的API访问控制。本文将带你5分钟内完成环境搭建与基础使用,让你轻松掌握OAuth保护的REST API开发。 ## 📋 准备工作:环境与依赖 在开始前,请确保你的开发环境已安装: - JDK 8或更高版本

gitblog_00832的博客 630

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

spring cloud以客户端授权模式访问受oauth2保护的资源

1. 依赖 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-oauth2</artifactId> </dependency> 2. 配置 application.yml security: oauth2: client: client-id: client-id

路过君的博客 898

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

使用带有OAuth的Spring Security保护资源

1.简介 在本教程中,我们将研究如何使用Spring Security和OAuth来基于路径模式( / api / ** )保护服务器上的管理资源。 我们配置的另一个路径模式( / oauth / token )将帮助已配置的授权服务器生成访问令牌。 请注意,我们将在此演示应用程序中使用“ 密码授予类型” 。 在继续实施之前,让我们回顾一下与该授予类型有关的事件。 2.资源所有者密码凭...

最佳 Java 编程 207

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

OAuth2资源服务器

OAuth2资源服务器1 说明2 资源服务器实现2.1 创建工程2.2 资源服务器配置类2.3 用户资源请求入口类2.4 用户资源获取服务接口2.5 用户资源获取服务实现类2.6 主启动类2.7 其它配置3 测试3.1 获取令牌3.2 请求资源4 总结 1 说明 授权服务器主要是提供用户认证、授权、颁发令牌等功能,而资源服务器主要是保护用户资源。授权服务器先给合法的用户颁发令牌,用户再使用获得的令...

Java大数据联盟 4852

OAuth2 图解

本文简单的描述出了 OAuth2 工作背景,看完后可以轻松理解 OAuth2 是用来解决什么问题的。 1. 用户有自己的数据 2. 有一个服务器,负责管理用户的数据。这个服务器被称为”Resource Server(资源服务器)“ 3. 有一个客户端应用,想要使用用户的数据 4. 资源服务器需要准备一个 API 接口,用来传递用户的数据 5. 客户端应用请求 API 接口,想要用户的数据 6. 资源服务器返回用户数据 7. 如果某个客户端应用心术不正怎么办? 8. 坏客户端应用也请求资源服务器

5354

保护资源服务器安全:OAuth 2 in Action Code 中的令牌验证实践

OAuth 2 in Action Code 是一个专注于 OAuth 2.0 协议实现的开源项目,提供了丰富的代码示例来帮助开发者理解和应用 OAuth 2.0 认证授权流程。在 OAuth 2.0 架构中,资源服务器的安全是至关重要的一环,而令牌验证则是保护资源服务器的核心机制。本文将深入探讨 OAuth 2 in Action Code 中资源服务器的令牌验证实践,帮助开发者掌握保护资源安全

gitblog_01199的博客 904

在 Bluemix 中使用 Oauth2 保护资源

Bluemix提供了App User Registry 服务用来保护应用程序资源,该服务是Oauth2.0的实现,使用该服务可以在Bluemix中创建Oauth应用,进行资源的保护和认证。 中文版本:《 使用 Bluemix App User Registry 保护资源》 英文版本: 《Protect your resources with the Bluemix App User

BLUE NIGHT 960
上一篇: 构建OAuth客户端
下一篇: 构建简单OAuth授权服务器
炒栗子不加糖
博客等级 码龄10年 68粉丝 123原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值