OAuth 2.0基础

1,718 阅读3分钟

OAuth 2.0简介

OAuth2.0是一种授权协议,保证第三方只有在授权后,才能进一步访问授权者的数据,授权的核心就是颁发访问令牌,使用访问令牌
在OAuth2.0体系里面有四种角色:资源拥有者,第三方软件,授权服务,受保护资源,比如用户小明通过一个第三方软件小兔去查询自己在京东上的订单,在这个流程中,资源拥有者是小明,第三方软件是小兔,授权服务是京东开放平台的授权服务,受保护资源是小明在京东上的订单
通常有四种授权类型:

授权码许可

最常用且最安全的是授权码许可,grant_type=authorization_code

为什么需要授权码code?
1.第5重定向会把code赋在浏览器上,如果直接返回token,直接将令牌暴露在浏览器上,面临令牌失窃的风险
2.用户通过小兔软件引导到京东的授权服务,此时用户与小兔软件的连接就中断了,通过重定向的方式让小明重新和小兔软件连接起来

授权服务的工作过程

1.小兔在京东开发平台注册,生成app_id,app_secret,还有回调地址
2.引导用户到授权服务

3.准备工作先验证基本信息:app_id,app_secret,回调地址是否合法等;第一次验证权限范围:小兔申请时的scope,看是否越权; 生成授权页面; 4.第二次验证权限范围,rscope,用户选择的权限,看是否越权
5.验证通过后生成授权码,与app_id和用户做一个映射
与权限范围做一个映射

设置授权码有效期5分钟
6. 重定向至第三方软件,第三方软件再携带code请求
7. 验证第三方软件;验证code;验证通过后立刻删除code,防止失窃code访问;生成access_token

8.生成access_token的同时会生成refresh_token
9.refresh_token存活时间比access_token长,access_token失效后拿着refresh_token去重新请求拿到新的access_token,推荐重新生成而不是延长时间,然后废弃刷新令牌,重新颁发一个(过期时间不会变)

JWt

结构化封装token,使token可以含有更多含义,比如可以把用户信息,权限信息封装进来
结构化体分为HEADER(头部),PAYLOAD(数据体),SIGNATURE(签名)三部分,通过.分隔

授权服务颁发令牌,受保护资源服务就要检验令牌,一般查询数据库或者调用授权服务提供的接口,但有了JWT之后,受保护资源服务就可以直接解析令牌中的信息了
JWT在传输过程中需要BASE64编码防止乱码,也需要进行加密,一般通过JJWT开源工具
为什么要是用JWt?
1.用计算代替存储
2.强调加密
3.增强系统的可用性和可伸缩性,无状态服务
缺点是没办法修改已颁发令牌的状态,一种颁发是一个用户一个秘钥,需要单独的秘钥管理系统,还有一种是将用户密码作为秘钥
令牌对于第三方软件是不透明的,需要关心令牌的是授权服务和受保护资源服务
如何构建第三方软件?

如何构建受保护资源系统?

资源拥有者凭据许可

比如小兔是京东官方的一个软件,相当于没有第三方这个概念了,直接根据用户名和密码换取令牌,grant_type=password,这个时候流程:

客户端凭证许可

没有明确的资源拥有者,比如小兔去访问京东上的商品图片,直接根据app_id和app_secret获取领票,grant_type=client_credentials

隐式许可

比如小兔内嵌到浏览器中,这时候对于浏览器就没有什么隐私可言了,直接根据app_id获取token