jwt、oauth2和oidc等认证授权技术的理解
前言
jwt、oauth2、oidc等,都是和认证授权相关的规范或者解决方案,因此要理解他们,就需要从业务场景的适用性一步步的分析和认识。
一、认证授权业务场景理解
就个人目前的理解来看,一个好的软件系统的构成可能需要包含但不限于以下几个方面:
功能
性能
拓展
安全
不论是从公司或者项目角度而言,还是从个人开发者的角度而言,有相当大一部分可能都只在功能部分停留。
何谓功能,我的理解就是实现业务需求里的要求,满足需求文档需要的效果,流程走通、可交付使用。因此这里说的功能,和仅仅是流程走通还是有一定区别的。
在功能的基础上,有的客户可能在需求里就对一些性能有要求,或者有些公司的项目团队有一定追求,那么可能就更进一步,会在功能的基础上再注重性能。
那么这里的性能就会涉及到整个架构的设计、技术的选型以及代码的规范和调优。
至于拓展性,实际上和上边一条就有些类似了,不论是动机还是处理方式都差不多。
只不过在分布式、微服务和容器盛行的今天,很多项目的第一选择就是这两个,那么在架构层面来说,其实一开始就具备了一定的拓展性。
而说到安全,很多人第一时间想到的可能是用户名密码这些,这也是最常见到的安全里的内容。
但是实际上软件的安全远远不止用户名密码的管理和校验,还包含数据传输的安全、资源权限的安全等。
而标题所说的认证授权,也正是安全范畴里的内容,更确切的说,应该是资源权限控制的范畴。
二、token的理解
token这个词,很多做开发的应该都知道,比较常见的就是在用户名密码登陆后,后台生成一个token,然后客户端保存token。
客户端只有获取了正确的token后,在发起业务请求时携带这个token,才能正常进行后续的业务处理。
那么这个token既然是为了保证安全、用来校验用户是否登录的,token本身的安全自然也是需要注意的,所以一般的token就有了签名加密的处理。
而至于token里的内容定义以及格式定义,理论上讲只需要客户端和服务端协商一致即可。
但是考虑到token的通用性和广泛性,因此慢慢的就有了一些token定义的规范,一个目前比较通用的token规范就是jwt。
三、jwt的理解
jwt是json web token的简称,标准的jwt格式token包含了三段,分别是token头、token主题和token签名,三部分以点符号分割。
jwt作为一种规范,也可以说一种解决方案,本身就可以拿出来做很多的解读,更多jwt的知识可以参考阮一峰的博客:
http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html
对于认证授权来说,只需要先了解到这个jwt是一种通用规范和格式的数据,安全、通用就好。
jwt是一种token规范,那么在用户登录的时候,就可以生成这种规范的token,这样在后续解码、签名验签、数据处理等需求上就可以减少很多的沟通成本。
但是jwt只是处理token规范的问题,却不处理其他token规范之外业务的问题,比如token如何能方便刷新的问题,比如究竟是简单地登录业务,还是涉及到第三方服务的授权业务,还是带有授权和认证的业务等等。
而这个问题,就引申出了oauth2。
四、认证和授权的理解
要想弄清oauth2,实际上必须先弄清认证和授权这两个概念。
从英语单词来看,认证和授权其实非常的像,分别是 authentication 和 authorization,在实际开发中,很多人也不太能分清楚。
即使是我自己,虽然近段时间有一定的理解,却不敢保证就是对的,只能说现阶段我觉得是这样。
我理解的认证,从字面意思说,就是身份的认证;而授权,则是资源的授权。
借用网络上别人写的:认证解决的是你是谁,而授权解决的是可以给你什么。
那么从这个角度来说,一个常规的登录获取token,之后在其他业务中校验token,其实只能算是认证的一个范畴,因为这个token的作用只是校验访问者的身份以及是否检验过这个身份,只要身份验证通过,所有资源都可以用。
假如在服务端的接口中涉及到了不同的权限问题,然后能够从token中获取到这些权限,并根据这些权限确定是否要处理该请求的资源,那么这里才算是真的涉及到了授权。
需要注意的是,这里的权限是资源的权限,而不是用户的角色权限这些,这是两个概念。
更多认证授权的理解,也可以参考其他的博客,例如:
https://www.cnblogs.com/jinhengyu/p/10257792.html
五、oauth2的理解
和jwt一样,oauth2也是一种规范,因为规范,就逐渐的形成了一些特定的解决方案,例如spring的oauth2。在认证和授权的业务中,oauth2解决的就是授权规范的问题。
在业务交互的过程中,oauth2授权直观的提现,也是通过token。
标准的oauth2的token同样是遵循jwt标准,不同的是,在普通jwt的token基础上加入了更多的内容。
oauth2标准的token有两个:access_token和refresh_token。
access_token用来访问资源时授权,包含基础授权信息,refresh_token的作用是在access_token失效后直接续签access_token,即上边说的如何方便刷新和续签token的问题。
同时,oauth2中的授权分为客户端模式、授权模式、简化模式、密码模式四种,可以根据不同的业务场景。
和上边用户名密码登陆不同的是,oauth2中解决的更多是涉及到第三方服务的业务。
对于oauth2的详细理解和四种授权模式,可以参考后边链接中的内容,不过有些地方可能需要参考更多其他博客,不见得都对。
http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html
六、oidc
大多数系统,实际上用到oauth2就已经足够了,因为即使说服务涉及到了第三方,但是大多数时候这些第三方资源可能都是公司内,或者一个大的团队内。
但是随着互联网的发展,越来越多的系统或应用会集成外部的第三方,例如支付宝等第三方支付、例如QQ等第三方登录。
因此,openid这个技术和规范就应运而生,这个技术解决的就是外部第三方交互时的一个身份认证问题。
结合上边所说,认证和授权分别属于不同的范畴,解决的也都是不同的问题,因此在这种涉及到第三方,如果再涉及到资源权限的系统中,就会引入一个新的规范,即oidc。
OIDC=(Identity, Authentication) + oauth2,我的理解就是openid+oauth2。
具体的用法和实现上就是,OIDC在oauth2的基础上又加了一个token,叫做id_token。
id_token同样的遵循jwt规范,只不过里边的内容是能够体现用户身份的信息。
因此,OIDC里就会有三个token:access_token、refresh_token和id_token。
对于实际使用来说,理解到这里应该就差不多能够明白为什么的有的应用会一次返回三个token,不知道究竟该使用那个了。
若想了解OIDC更多的内容,可以参考下边的博客:
https://www.cnblogs.com/linianhui/p/openid-connect-extension.html
jwt、oauth2和oidc等认证授权技术的理解的更多相关文章
- [Spring Cloud实战 | 第六篇:Spring Cloud Gateway+Spring Security OAuth2+JWT实现微服务统一认证授权
一. 前言 本篇实战案例基于 youlai-mall 项目.项目使用的是当前主流和最新版本的技术和解决方案,自己不会太多华丽的言辞去描述,只希望能勾起大家对编程的一点喜欢.所以有兴趣的朋友可以进入 g ...
- 【Spring Cloud & Alibaba 实战 | 总结篇】Spring Cloud Gateway + Spring Security OAuth2 + JWT 实现微服务统一认证授权和鉴权
一. 前言 hi,大家好~ 好久没更文了,期间主要致力于项目的功能升级和问题修复中,经过一年时间的打磨,[有来]终于迎来v2.0版本,相较于v1.x版本主要完善了OAuth2认证授权.鉴权的逻辑,结合 ...
- SpringCloud微服务实战——搭建企业级开发框架(二十三):Gateway+OAuth2+JWT实现微服务统一认证授权
OAuth2是一个关于授权的开放标准,核心思路是通过各类认证手段(具体什么手段OAuth2不关心)认证用户身份,并颁发token(令牌),使得第三方应用可以使用该token(令牌)在限定时间.限定 ...
- Spring Cloud实战 | 最终篇:Spring Cloud Gateway+Spring Security OAuth2集成统一认证授权平台下实现注销使JWT失效方案
一. 前言 在上一篇文章介绍 youlai-mall 项目中,通过整合Spring Cloud Gateway.Spring Security OAuth2.JWT等技术实现了微服务下统一认证授权平台 ...
- Spring Security OAuth2 微服务认证中心自定义授权模式扩展以及常见登录认证场景下的应用实战
一. 前言 [APP 移动端]Spring Security OAuth2 手机短信验证码模式 [微信小程序]Spring Security OAuth2 微信授权模式 [管理系统]Spring Se ...
- Owin中间件搭建OAuth2.0认证授权服务体会
继两篇转载的Owin搭建OAuth 2.0的文章,使用Owin中间件搭建OAuth2.0认证授权服务器和理解OAuth 2.0之后,我想把最近整理的资料做一下总结. 前两篇主要是介绍概念和一个基本的D ...
- 实战!spring Boot security+JWT 前后端分离架构认证登录!
大家好,我是不才陈某~ 认证.授权是实战项目中必不可少的部分,而Spring Security则将作为首选安全组件,因此陈某新开了 <Spring Security 进阶> 这个专栏,写一 ...
- 基于.NetCore3.1系列 ——认证授权方案之Swagger加锁
一.前言 在之前的使用Swagger做Api文档中,我们已经使用Swagger进行开发接口文档,以及更加方便的使用.这一转换,让更多的接口可以以通俗易懂的方式展现给开发人员.而在后续的内容中,为了对a ...
- [认证授权] 2.OAuth2授权(续) & JWT(JSON Web Token)
1 RFC6749还有哪些可以完善的? 1.1 撤销Token 在上篇[认证授权] 1.OAuth2授权中介绍到了OAuth2可以帮我们解决第三方Client访问受保护资源的问题,但是只提供了如何获得 ...
随机推荐
- (转)OpenFire源码学习之四:openfire的启动流程
转:http://blog.csdn.net/huwenfeng_2011/article/details/43413233 openfire启动 ServerStarter 启动流程图: 启动的总入 ...
- HDU-4825 Xor Sum(字典树求异或最大值)
题目链接:点此 我的github地址:点此 Problem Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包含了N个正整 ...
- golang 读取 ini配置信息
package main //BY: 29295842@qq.com//这个有一定问题 如果配置信息里有中文就不行//[Server] ;MYSQL配置//Server=localhost ...
- Ubuntu下安装Samba服务器
闲来无聊尝试自己安装下Samba服务器,使本机和虚拟机可以无障碍传输文件(虽然用VMwaretools可传,但总感觉麻烦,而且速度欠佳) 首先,同安装qemu一样,在安装之前要确定你的系统apt列表已 ...
- 2、获取APP CPU占用率
前面已经介绍过如何获取包名和主活动名.这里不再过多赘述.我们依旧采取两种方案实现APP CPU占有率 Windows下获取APP CPU占用率 adb shell "dumpsys cpui ...
- 拾遗:Vim 批量删除匹配到的行
删除包含特定字符的行 g/pattern/d (全局删除匹配行) ,5g/pattern/d (删除第1-5行里的匹配行) 删除不包含指定字符的行 v/pattern/d g!/pattern/d ( ...
- MySQL慢查询日志分割
mysql> set global slow_query_log=0; Query OK, 0 rows affected (0.00 sec) mysql> set global s ...
- linux 上挂载硬盘或者读取u盘数据
查看服务器上有哪些设备 df -hl查询挂载 硬盘后或者插上u盘后sda 的变化,新增的就是我们添加上的. fdisk -ls /dev/sda
- [已解决]windows安装docker的问题
windows下载安装docker出现的问题 进入powershell后输入docker --version报错: could not read CA certificate "C:\\Us ...
- 天道神诀---FTP服务
FTP 2种模式 主动模式(默认) 客户端以1024-65535之间某一端口发送指令到服务端的21端口,并建立连接.服务端接受到以后,以20端口去连接客户端,建立一条新的链接并传输数据 被动模式 客户 ...