作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO
联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬
学习必须往深处挖,挖的越深,基础越扎实!
阶段1、深入多线程
阶段2、深入多线程设计模式
阶段3、深入juc源码解析
码哥源码部分
码哥讲源码-原理源码篇【2024年最新大厂关于线程池使用的场景题】
码哥讲源码-原理源码篇【揭秘join方法的唤醒本质上决定于jvm的底层析构函数】
码哥源码-原理源码篇【Doug Lea为什么要将成员变量赋值给局部变量后再操作?】
码哥讲源码【谁再说Spring不支持多线程事务,你给我抽他!】
打脸系列【020-3小时讲解MESI协议和volatile之间的关系,那些将x86下的验证结果当作最终结果的水货们请闭嘴】
OAuth2 集成
目前很多开放平台如新浪微博开放平台都在使用提供开放 API 接口供开发者使用,随之带来了第三方应用要到开放平台进行授权的问题,OAuth 就是干这个的,OAuth2 是 OAuth 协议的下一个版本,相比 OAuth1,OAuth2 整个授权流程更简单安全了,但不兼容 OAuth1,具体可以到 OAuth2 官网 OAuth 2.0 — OAuth 查看,OAuth2 协议规范可以参考 RFC 6749 - The OAuth 2.0 Authorization Framework。目前有好多参考实现供选择,可以到其官网查看下载。
本文使用 [Apache Oltu](),其之前的名字叫 Apache Amber ,是 Java 版的参考实现。使用文档可参考 Documentation - Apache Oltu - Apache Software Foundation。
OAuth 角色
资源拥有者(resource owner) :能授权访问受保护资源的一个实体,可以是一个人,那我们称之为最终用户;如新浪微博用户 zhangsan;
资源服务器(resource server) :存储受保护资源,客户端通过 access token 请求资源,资源服务器响应受保护资源给客户端;存储着用户 zhangsan 的微博等信息。
授权服务器(authorization server) :成功验证资源拥有者并获取授权之后,授权服务器颁发授权令牌(Access Token)给客户端。
客户端(client) :如新浪微博客户端 weico、微格等第三方应用,也可以是它自己的官方应用;其本身不存储资源,而是资源拥有者授权通过后,使用它的授权(授权令牌)访问受保护资源,然后客户端把相应的数据展示出来 / 提交到服务器。“客户端” 术语不代表任何特定实现(如应用运行在一台服务器、桌面、手机或其他设备)。
- 客户端从资源拥有者那请求授权。授权请求可以直接发给资源拥有者,或间接的通过授权服务器这种中介,后者更可取。
- 客户端收到一个授权许可,代表资源服务器提供的授权。
- 客户端使用它自己的私有证书及授权许可到授权服务器验证。
- 如果验证成功,则下发一个访问令牌。
- 客户端使用访问令牌向资源服务器请求受保护资源。
- 资源服务器会验证访问令牌的有效性,如果成功则下发受保护资源。
更多流程的解释请参考 OAuth2 的协议规范 RFC 6749 - The OAuth 2.0 Authorization Framework。
服务器端
本文把授权服务器和资源服务器整合在一起实现。
POM 依赖
此处我们使用 apache oltu oauth2 服务端实现,需要引入 authzserver(授权服务器依赖)和 resourceserver(资源服务器依赖)。
<dependency>
<groupId>org.apache.oltu.oauth2</groupId>
<artifactId>org.apache.oltu.oauth2.authzserver</artifactId>
<version>0.31</version>
</dependency>
<dependency>
<groupId>org.apache.oltu.oauth2</groupId>
<artifactId>org.apache.oltu.oauth2.resourceserver</artifactId>
<version>0.31</version>
</dependency>
其他的请参考 pom.xml。
数据字典
用户 (oauth2_user)
名称 | 类型 | 长度 | 描述 |
---|---|---|---|
名称 | 类型 | 长度 | 描述 |
id | bigint | 10 | 编号 主键 |
username | varchar | 100 | 用户名 |
password | varchar | 100 | 密码 |
salt | varchar | 50 | 盐 |
客户端 (oauth2_client)
名称 | 类型 | 长度 | 描述 |
---|---|---|---|
名称 | 类型 | 长度 | 描述 |
id | bigint | 10 | 编号 主键 |
client_name | varchar | 100 | 客户端名称 |
client_id | varchar | 100 | 客户端id |
client_secret | varchar | 100 | 客户端安全key |
用户表存储着认证 / 资源服务器的用户信息,即资源拥有者;比如用户名 / 密码;客户端表存储客户端的的客户端 id 及客户端安全 key;在进行授权时使用。
表及数据 SQL
具体请参考
- sql/ shir