当前位置: 首页 > article >正文

「码动四季·开源同行」go语言:统一认证与授权如何保障服务安全

认证与授权对于当前的互联网应用是非常重要的基础功能认证用于验证当前用户的身份而授权意味着用户在认证成功后会被系统授予访问系统资源的权限。只有具备相应身份和权限的人才能访问系统中的相应资源比如在购物网站中你只能支付你自己购物车内的商品这就保护了用户和系统的信息安全。微服务架构不同于单体应用的架构单体应用的认证和授权非常集中但是当服务被拆分之后对各个微服务的认证与授权就会变得非常分散因此在微服务架构中就将集成统一认证与授权的功能作为横切关注点为应用服务提供信息安全保障。微服务安全的挑战和现状在单体应用中开发者可以通过简单的拦截器以及 Session 机制对用户的访问进行控制和记录。但是在目前微服务盛行的架构体系下服务的数量在业务分解后急剧增加其中每个微服务都需要对用户的行为进行认证和许可明确当前访问用户的身份与权限级别。与此同时整个系统可能还需对外提供一定的服务比如第三方登录授权等。在这种情况下如果要求每个微服务都实现各自的用户信息管理系统那不仅增加了开发的工作量而且出错的概率也会大大增加。对此而言统一的认证与授权就显得尤为必要和有效了。目前主流的统一认证和授权方式有 OAuth2、分布式 Session 和 JWT 等其中又以 OAuth2 方案使用最为广泛已经成为当前授权的行业标准。由于统一认证与授权方案会将用户信息进行统一管理和使用这就很可能出现系统性能瓶颈的问题甚至在认证和授权服务宕机后整个系统将无法正常运行。与此同时整合当前系统中各个服务的用户信息管理系统也存在一定的难度所以在实践时需要根据项目的现状理智选择统一认证与授权方案。常见的认证与授权方案有 OAuth2、分布式 Session 和JWT 等下面我们就来分别介绍这 3 种方案看看这些方案是如何保障微服务安全的。当前行业授权标准OAuth2OAuth 协议目前已经发展到OAuth2 版本之前的OAuth1由于不被 OAuth2 兼容且签名逻辑过于复杂和授权流程过于单一所以这里我们就不过多讨论它。下面我们重点关注的是 OAuth2认证流程它是当前Web应用中的主流授权流程。OAuth2是当前授权的行业标准其重点在于为Web应用程序、桌面应用程序、移动设备以及室内设备的授权流程提供简单的客户端开发方式。它为第三方应用提供对HTTP服务的有限访问既可以是资源拥有者通过授权允许第三方应用获取HTTP服务也可以是第三方应用以自己的名义获取访问权限。接下来我们会首先介绍OAuth2 协议的参与角色然后阐述OAuth2 协议认证授权的基本流程最后再对OAuth2中客户端授权类型进行讲解1.角色OAuth2中主要分为了4种角色如下表所示在多数情况下资源服务器和授权服务器是合二为一的在授权交互时是授权服务器在请求资源交互时是资源服务器。当授权服务器是单独的实体时它可以发出被多个资源服务器接受的访问令牌。2.协议流程我们来看一张OAuth2的流程图如下这是一张关于OAuth2角色的抽象交互流程图主要包含以下6个步骤。①客户端请求资源所有者的授权。②资源所有者同意授权返回授权许可AuthorizationGrant这代表了资源所有者的授权凭证。③客户端携带授权许可要求授权服务器进行认证请求访问令牌。④授权服务器会同时验证客户端身份和认证客户端携带的授权许可的有效性如果有效则返回访问令牌。⑤客户端获取到授权服务器颁发的访问令牌后就可以携带访问令牌访问资源服务器中受保护的资源。⑥资源服务器验证访问令牌如果有效则接受访问请求返回受保护资源。3.客户端授权类型客户端只有在获取到资源所有者的授权许可后才能向授权服务器请求访问令牌。OAuth2 默认定义了4 种授权类型当然也提供了用于定义额外的授权类型的扩展机制。默认的4种授权类型如下表所示:其中经常使用的授权类型为授权码类型和密码类型。简化类型是由于省略了授权码类型流程中的授权码步骤而得名而客户端类型是客户端以自己的名义直接向授权服务器请求访问令牌不需要用户授权即可请求访问令牌。我们接下来就只对常用的授权码类型和密码类型的流程做详细的介绍。1授权码类型授权码类型是 OAuth2 默认授权类型中功能最完整、流程最严密的授权类型。授权码类型要求客户端能够与资源所有者的代理如Web 浏览器等进行交互它通过重定向资源所有者的代理让资源所有者与授权服务器直接交互授权避免资源所有者的信息被泄漏并将授权通过后生成的授权码以重定向的方式返回给客户端。其授权流程图如下图所示:结合该流程图我们来分析一下授权码类型的整个工作流程。①客户端将资源所有者的代理重定向到授权服务器的端点客户端会在重定向的地址中提交自身的客户端标识、请求范围、本地状态和用于接收授权码的重定向地址等信息。②资源所有者通过代理与授权服务器直接交互授权服务器认证资源所有者的身份并确认资源所有者同意还是拒绝访问授权。③在资源所有者同意授予客户端访问权限后授权服务器会回调客户端在第一步中提交的重定向地址并在重定向地址中携带生成的授权码和原先提交的本地状态。否则直接返回资源所有者拒绝授权。④获取到授权码的客户端可以携带授权码和用于获取授权码的重定向地址向授权服务器请求访问令牌。授权服务器会对客户端身份和授权码同时进行认证。⑤授权服务器认证客户端身份和授权码并对客户端提交的重定向地址和获取授权码的重定向地址进行匹配。如果信息一致则返回访问令牌并有可能同时返回刷新令牌。(2密码类型在密码类型中资源所有者会将自身的密码凭证直接交予客户端客户端通过自己持有的信息直接从授权服务器获取授权。在这种情况下需要资源所有者对客户端高度信任同时客户端不允许保存密码凭证。这种授权类型适用于能够获取资源所有者凭证如用户名和密码的客户端。授权流程图如下所示同样我们还结合授权流程图来分析一下密码类型的授权流程。①资源所有者向客户端提供其用户名和密码等凭证。②客户端携带资源所有者的凭证用户名和密码向授权服务器请求访问令牌。③授权服务器认证客户端身份和携带的资源所有者凭证如果有效则返回访问令牌并可能同时返回刷新令牌。(3刷新令牌以上两种类型中你可能也注意到了响应结果中可能会同时返回刷新令牌。那什么是刷新令牌呢刷新令牌是授权服务器提供给客户端在访问令牌失效时重新向授权服务器申请访问令牌的凭证。客户端从授权服务器中获取的访问令牌一般是具备时效性的在访问令牌过期的情况下持有有效用户凭证的客户端可以再次向授权服务器请求访问令牌而持有刷新令牌的客户端也可以向授权服务器请求新的访问令牌也就是令牌刷新操作。数据共享的分布式Session在Web服务盛行的当下我们一般会通过 Session 和 Cookie 来维护访问用户的登录状态。同时随着分布式系统的快速发展原本在单个服务器上的 Session 管理也逐渐发展为分布式 Session 管理。接下来我们就来介绍会话跟踪技术 Session 和 Cookie以及分布式 Session 的作用和相关实现方案。1.会话跟踪技术 Session 和 Cookie会话是指用户登录网站后的一系列操作比如查看列表、收藏商品和购买商品等。一次会话中一般会存在多次的HTTP请求。而HTTP 协议作为一种无状态协议在连接关闭之后服务器就无法继续跟踪用户的会话从而丢失了用户操作的上下文信息。对此我们需要会话跟踪技术管理和跟踪用户的整个会话在多次HTP操作中将用户与用户关联起来。而Session 和Cookie就是最常用的会话跟踪技术。Session 和Cookie 是一种记录用户状态信息的机制它们分别被保存在服务器端和客户端浏览器中。当客户端浏览器访问服务器的时候服务器会把当前的用户信息以某种形式记录在服务器上这就是Session。客户端浏览器在访问时可以通过 Session 查找该用户的状态。Cookie 实际上是在客户端浏览器请求服务器时如果服务器需要记录当前用户的状态就会在响应中向客户端浏览器颁发一小段的文本信息用于标记当前的用户状态这段文本信息与服务器中的 Session一一对应被称为Cookie。当浏览器再次请求该网站时会把请求的网址连同该Cookie 提交给服务器。服务器根据 Cookie 中的信息查找 Session从 Session中获取用户信息以此来辨认用户状态。服务器还可以根据需要修改 Cookie 中的内容。简单来说Cookie 被用在客户端中记录用户身份信息而 Session 被用在服务器端中记录用户身份信息。2.分布式 Session 的作用在单体应用时代应用部署在同一个Web 服务器上可以使用同一个Web服务器对 Session 进行管理。随着系统架构的演进在分布式架构或者微服务架构中会存在多个Web 服务器用户的请求根据负载均衡转发到不同的机器上这就有可能导致Session 丢失的情况出现。比如一开始用户在A机器上登录并发起请求后来由于负载均衡请求被转发到B机器上那这时会出现什么问题呢因为用户的 Session保存在A机器的Web服务器上在B 机器的Web服务器上是无法查找到的所以导致Β机器认为用户没有登录返回了用户末登录的异常引起了用户的费解。因此在分布式架构或微服务架构下就需要保证在一个Web 服务器上保存 Session后其他 Web服务器可以同步或共享这个 Session达到用户一次登录、多处可访问的效果。这就是分布式 Session 要做的事。3.分布式Session的实现方案分布式 Session 有如下几种实现方式如下表所示:综合对比这4种方式相对来说集中式管理更加可靠也是应用最广泛的。安全传输对象JWTJWTJSONWebToken作为一个开放的标准通过紧凑快速传输体积小并且自包含有效负载中包含用户所需的所有信息避免了对数据库的多次查询的方式定义了用于在各方之间发送的安全JSON对象。JWT可以很好地充当 OAuth2 的访问令牌和刷新令牌的载体这是 Web 双方之间进行安全传输信息的良好方式。当只有授权服务器持有签发和验证 jJWT的 secret时也就只有授权服务器能验证 JWT的有效性以及签发带有签名的JWT这就保证了以JWT为载体的Token的有效性和安全性。JWT格式一般如下:eyJhbGcioiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYWl1IjoiY2FuZyB3dSIsImV4cCI6MTUxODA1MTE1NywidXN1ck1kIjoiMTIzNDU2In0.IV4XZ0y0nMpmMX9orv0gqsEMOxXXNQOE680CKkkPQcs它由 3 部分组成每部分通过.分隔开分别是Header头部、Payload有效负载和Signature签名。接下来我们就对每一部分进行详细的介绍。1.Header(头部)头部通常由两部分组成。typ类型一般为JWT。alg加密算法通常是 HMAC SHA256 或者 RSA。一个简单的头部例子如下{ alg : HS256 typ : JwT }这部分JSON 数据会使用 Base64Url 编码后用于构成JWT的第一部分如下所示:eyJhbGcioiJIUzI1NiIsInR5cCI6IkpXVCJ92. Playload(有效负载)有效负载是JⅧT的第二部分是用来携带有效信息的载体主要是关于用户实体和附加元数据的声明由以下3部分组成。Registered claims注册声明。它是jWT预定的声明但通常不要求强制使用。主要包含issJWT 签发者、expJWT过期时间、subJWT 面向的用户、aud接受jWT的一方)等属性信息。Public claims公开声明。在公开声明中可以添加任何信息一般是用户信息或者业务扩展信息等。Private claims私有声明。它是由jWT提供者和消费者共同定义的声明既不属于注册声明也不属于公开声明。Base64 对称解密的方式很容易使得加密信息被还原所以一般不建议在 Payload 中添加任何的敏感信息。一个简单的有效负载例子如下{ sub: 1234567890, name: xuan, exp: 1518051157 }这部分JSON 会使用 Base64Url 编码后用于构成JWT的第二部分如下所示:eyJzdwIioiIxMjMONTY3oDkwIiwibmFtZSI6Inh1YW4iLCJ1eHAiojE1MTgwNTExNTd93. Signature (签名)要创建签名就必须要有被编码后的头部、被编码后的有效负载以及一个 secret最后通过在头部定义的加密算法 alg 加密生成签名。生成签名的伪代码如下HMACSHA256( base64urlEncode(header) . base64urlEncode(payload) , secret)上述伪代码中使用的加密算法为HMACSHA256。Secret作为签发密钥用于验证JWT以及签发JWT所以只能由服务端持有不该泄漏出去。一个简单的签名如下这就是WT的第三部分。X36pDQoYydHv7KDCi1tTBKcQbt-iIT-jFgmUjkTSCxE如上所述的三个部分通过.分割就组成最终的WT。小结在本文中我们围绕统一认证与授权如何去保障服务安全依次介绍了OAuth2、分布式 Session 和JMT等认证与授权方案这其中以OAuth2方案最为标准和完备。希望通过本文的学习能够帮助你建立对微服务架构下统一认证和授权方案的宏观认知。在接下来我们将采用Go语言并基于OAuth2 协议和JWT实现一个简单的认证和授权系统让你熟练掌握如何在微服务架构中对用户的资源进行保护。

相关文章:

「码动四季·开源同行」go语言:统一认证与授权如何保障服务安全

认证与授权对于当前的互联网应用是非常重要的基础功能:认证用于验证当前用户的身份,而授权意味着用户在认证成功后,会被系统授予访问系统资源的权限。只有具备相应身份和权限的人才能访问系统中的相应资源,比如在购物网站中你只能…...

DVB-S系统设计:从理论到FPGA实现的完整指南

1. DVB-S系统概述:卫星数字电视的核心技术 DVB-S(Digital Video Broadcasting - Satellite)是卫星数字电视广播的国际标准,它定义了从信号编码、调制到传输的完整技术规范。我第一次接触DVB-S系统是在2015年参与一个卫星接收机项目…...

MXene基单原子催化剂在电催化CO2还原中的电子结构调控与性能优化

1. MXene基单原子催化剂为何能成为CO2还原的"黑马"? 在碳中和背景下,电催化CO2还原技术就像一位"化学魔术师",能把温室气体变废为宝。而MXene材料凭借其独特的层状结构和导电性,正成为这场魔术表演的明星道具…...

单机变联机:Nucleus Co-Op如何让你的电脑实现4人同屏游戏

单机变联机:Nucleus Co-Op如何让你的电脑实现4人同屏游戏 【免费下载链接】nucleuscoop Starts multiple instances of a game for split-screen multiplayer gaming! 项目地址: https://gitcode.com/gh_mirrors/nu/nucleuscoop 你是否曾想过,用一…...

为什么90%的词库转换都会失败?输入法词库迁移的终极解决方案:全方位指南

为什么90%的词库转换都会失败?输入法词库迁移的终极解决方案:全方位指南 【免费下载链接】imewlconverter ”深蓝词库转换“ 一款开源免费的输入法词库转换程序 项目地址: https://gitcode.com/gh_mirrors/im/imewlconverter 在数字化时代&#x…...

解锁5大跨平台无线控制能力:QtScrcpy全方位使用指南

解锁5大跨平台无线控制能力:QtScrcpy全方位使用指南 【免费下载链接】QtScrcpy Android实时投屏软件,此应用程序提供USB(或通过TCP/IP)连接的Android设备的显示和控制。它不需要任何root访问权限 项目地址: https://gitcode.com/barry-ran/QtScrcpy …...

springboot+vue基于web的高校学生宿舍报修系统

目录同行可拿货,招校园代理 ,本人源头供货商高校学生宿舍报修系统功能分析(SpringBootVue)系统角色划分核心功能模块学生端功能维修端功能管理端功能系统管理功能技术实现要点扩展功能建议数据安全考虑项目技术支持源码获取详细视频演示 :文章…...

颠覆级植物大战僵尸修改工具:一站式资源管理与战局掌控解决方案

颠覆级植物大战僵尸修改工具:一站式资源管理与战局掌控解决方案 【免费下载链接】pvztoolkit 植物大战僵尸 PC 版综合修改器 项目地址: https://gitcode.com/gh_mirrors/pv/pvztoolkit 还在为植物大战僵尸中阳光不足而焦虑吗?面对海量僵尸浪潮却束…...

5分钟掌握ViGEmBus:Windows虚拟手柄驱动的完整指南

5分钟掌握ViGEmBus:Windows虚拟手柄驱动的完整指南 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus ViGEmBus是一款专业的Windows内核级虚拟游戏手…...

广告发光字全科普

广告发光字全科普:从原理到类型,一篇看懂门头招牌的发光逻辑走在城市街头,从连锁品牌门头到商场导视、楼宇标识,随处可见夜晚自动亮起的广告发光字。它早已不是简单的霓虹灯,而是融合材料、工艺、光学与工程的成熟标识…...

ruoyi-vue-pro源码部署实战:如何选择稳定版本并快速搭建开发环境

RuoYi-Vue-Pro 稳定版部署指南:从版本选择到开发环境搭建全解析 第一次接触 RuoYi-Vue-Pro 这个 Java 快速开发框架时,我像大多数开发者一样直接克隆了 master 分支,结果编译阶段就遭遇了各种依赖冲突和接口报错。后来才发现,这个…...

系统托盘管理效率革命:让你的Windows桌面空间重获自由

系统托盘管理效率革命:让你的Windows桌面空间重获自由 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 当你的任务栏堆叠着12个窗口图标,每点击一次…...

CTF实战:手把手教你用fastcoll工具复现MD5碰撞攻击(附Python验证脚本)

CTF实战:手把手教你用fastcoll工具复现MD5碰撞攻击(附Python验证脚本) 在网络安全竞赛和渗透测试中,MD5碰撞攻击是一个经典且实用的技术点。本文将带你从零开始,完整复现MD5碰撞攻击的全过程,包括工具使用、…...

WinForm项目中的并发控制

引言 在编写WinForm应用程序时,处理并发问题是一个常见的挑战,尤其是在涉及数据库操作的场景中。本文将讨论如何在C#的WinForm项目中,通过SQL数据库的操作来避免并发问题,并介绍一种使用原子操作的解决方案。 问题描述 假设有一个WinForm项目,其中包含一个功能模块,需…...

Java应用内存泄漏排查实战:MAT工具从入门到精通(附常见问题解析)

Java应用内存泄漏排查实战:MAT工具从入门到精通 引言:为什么我们需要关注内存泄漏? 记得去年我们团队接手的一个电商项目吗?上线三个月后,系统开始频繁出现OOM(OutOfMemoryError)错误。每次重启…...

深入解析Python中ort.InferenceSession的底层实现与性能优化

1. 揭开ort.InferenceSession的神秘面纱 第一次接触ort.InferenceSession时,我完全被它的性能震惊了。作为一个用Python加载ONNX模型的标准入口,它看起来就是个普通的类实例化操作,但背后却隐藏着C和Python的完美协作。这种设计让开发者既能享…...

RIFE帧插值技术:视频增强领域的智能插帧解决方案

RIFE帧插值技术:视频增强领域的智能插帧解决方案 【免费下载链接】video2x A machine learning-based video super resolution and frame interpolation framework. Est. Hack the Valley II, 2018. 项目地址: https://gitcode.com/GitHub_Trending/vi/video2x …...

用ZYNQ PS-SPI给Flash测个速:华邦W25Q80在25MHz时钟下的真实读写性能报告

ZYNQ PS-SPI Flash性能深度评测:华邦W25Q80在25MHz时钟下的极限挖掘 当我们需要在嵌入式系统中选择一款Flash存储器时,数据手册上的理论参数往往无法反映真实应用场景下的性能表现。本文将基于Xilinx ZYNQ平台的PS-SPI接口,对华邦W25Q80 Flas…...

SenseVoice-small实战教程:导出SRT/VTT字幕文件用于Premiere剪辑

SenseVoice-small实战教程:导出SRT/VTT字幕文件用于Premiere剪辑 你是不是经常遇到这样的烦恼?录了一段视频,或者拿到一段会议录音,想要给它配上精准的字幕,却发现自己要花几个小时去听写、校对、打时间轴&#xff1f…...

3步搞定B站4K视频下载:开源工具bilibili-downloader终极指南

3步搞定B站4K视频下载:开源工具bilibili-downloader终极指南 【免费下载链接】bilibili-downloader B站视频下载,支持下载大会员清晰度4K,持续更新中 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader 想要免费下载…...

西门子1200控制下的单部11层电梯仿真系统:完全电脑操作、清单与组态HMI界面解析

.单部11层电梯,基于西门子1200 不用实物即可仿真,仅需一台电脑,欢迎学习 清单:plc程序HMI组态画面wincc编写电气接线图硬件框架图io表报告 备需要报告的另加,主讲图纸不会细讲搞电梯仿真这事儿吧,说难也不…...

免费开源:如何用LiteDB.Studio高效管理嵌入式数据库?

免费开源:如何用LiteDB.Studio高效管理嵌入式数据库? 【免费下载链接】LiteDB.Studio A GUI tool for viewing and editing documents for LiteDB v5 项目地址: https://gitcode.com/gh_mirrors/li/LiteDB.Studio 在嵌入式数据库管理领域&#xf…...

Rocky Linux 9.4 Minimal安装后必做的10件事:安全加固、性能优化与开发环境搭建

Rocky Linux 9.4 Minimal安装后必做的10件事:安全加固、性能优化与开发环境搭建 当你完成Rocky Linux 9.4 Minimal的安装,面对那个极简的命令行界面时,可能会感到一丝茫然。这个"裸"系统虽然轻量,但距离生产环境或高效开…...

AI风口来袭!转型LLM应用开发工程师,非常详细收藏我这一篇就够了

一、引言:AI时代下的新职业机遇 近年来,随着人工智能技术的快速发展,尤其是大语言模型(Large Language Models, LLM)的突破,软件行业正在经历深刻变革。以GPT系列模型为代表的技术,使自然语言理…...

League-Toolkit:3大核心价值的英雄联盟智能辅助工具

League-Toolkit:3大核心价值的英雄联盟智能辅助工具 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League-Toolkit 是一款基于英雄…...

Stable-Diffusion-v1-5-archive多风格生成效果:复古海报/科技感UI/手绘插画实拍

Stable Diffusion v1.5 Archive多风格生成效果:复古海报/科技感UI/手绘插画实拍 1. 模型介绍与核心能力 Stable Diffusion v1.5 Archive是经典SD1.5文生图模型的归档版本,作为AI图像生成领域的"常青树",它依然保持着强大的通用图…...

Ostrakon-VL-8B惊艳效果:同一界面内对比原始图/热力图/标注图三视图

Ostrakon-VL-8B惊艳效果:同一界面内对比原始图/热力图/标注图三视图 1. 像素特工终端:重新定义零售视觉分析 想象一下,当你走进一家零售店铺,能瞬间"扫描"出所有商品的位置、价格标签和货架状态。这正是Ostrakon-VL-8…...

飞机上吸烟还叫嚣“憋得难受”?

坐飞机最怕遇到什么?不是延误,也不是颠簸,而是那种不拿一飞机人性命当回事的“巨婴”旅客。就在昨天(3月29日),四川航空一架从成都飞往尼泊尔加德满都的航班上,就出了这么一档子事儿。一位“老烟…...

从RAG到Agentic RAG 的进化之路

何为Agentic RAG? RAG系统, 为大模型补充了数据, 无论是实时数据还是私域数据. Agentic RAG系统, 更近一步, 为RAG系统添加了Agent的智能, 让AI不光只作用在查询这个阶段, 而是充分利用, Agent的计划(Plan), 自省(reflect), 工具调用(tools use), 编排(orchestrate)等等能力,…...

iOSDeviceSupport:解决设备调试兼容性问题的高效管理工具

iOSDeviceSupport:解决设备调试兼容性问题的高效管理工具 【免费下载链接】iOSDeviceSupport All versions of iOS Device Support 项目地址: https://gitcode.com/gh_mirrors/ios/iOSDeviceSupport 问题场景:当新系统遇见旧Xcode "连接失败…...