## spring-oauth-server
java config版本 Spring与OAuth2的整合示例. OIDC1.x + OAuth2.1 项目用Maven管理
Base on Spring-Boot 使用的主要技术与版本号
  1. JDK (openjdk 17)
  2. Spring Boot(3.1.2)
  3. Spring Core(6.0.11)
  4. spring-security-oauth2-authorization-server (1.1.1)
  5. thymeleaf (3.1.1.RELEASE)

授权协议

GPL-2.0

技术视频

  1. spring-oauth-server开源项目背景 2018-09-16
  2. 如何在本地运行spring-oauth-server(传统版本) 2018-09-17
  3. 如何在本地运行spring-oauth-server(config版本) 2018-10-08
  4. 在线测试环境的使用 2018-10-14
  5. spring-oauth-server v2.0.1更新内容简介 2019-08-05
> 注意:以上视频主要适用于v2.x版本 http://list.youku.com/albumlist/show/id_51900110.html (持续更新...)

1000 star Gitee奖杯: sos-1000-stars.jpg [2019年]


版本分支介绍

- MySQL版本请访问Branch: master - MongoDB版本请访问Branch: mongodb - Redis版本请访问Branch: config-redis

相关项目

1. OAuth2客户端项目请访问 spring-oauth-client 2. 在线测试访问地址 https://andaily.com/spring-oauth-server 3. Shiro与OLTU整合的OAuth2项目 https://gitee.com/mkk/oauth2-shiro (相比spring-oauth-server, 该项目入门门槛相对较低, 代码更加透明, 理解更容易,可扩展性更强, 且模块化开发)

如何使用?

1. 项目是Maven管理的, 需要本地安装Maven(开发用的maven版本号为3.6.0), 还有MySql(开发用的mysql版本号为5.7.22) 2. 下载(或clone)项目源码到本地 3. 创建MySQL数据库(默认数据库名oauth2_boot), 并运行相应的SQL脚本(脚本文件位于others/database目录), 运行脚本的顺序: initial_db.ddl -> oauth.ddl -> initial_data.ddl 4. 修改application.properties(位于src/main/resources目录)中的数据库连接信息(包括username, password等) 5. 将本地项目导入到IDE(如Intellij IDEA)中, 可直接运行SpringOauthServerApplication.java进行访问;或配置Tomcat(或类似的servlet运行服务器), 并启动Tomcat(默认端口为8080); 也可通过maven package命令将项目编译为jar文件(spring-oauth-server.jar), 使用命令java -jar启动访问. 若使用java -jar spring-oauth-server.jar启动, 建议使用参数spring.config.location指定配置文件, 如:java -jar spring-oauth-server.jar --spring.config.location=xxx.properties 6. 参考oauth_test.txt(位于others目录)的内容并测试之(也可在浏览器中访问相应的地址,如: http://localhost:8080/ 在界面上操作).

配置参数说明

说明配置文件application.properties中的主要变量。
参数名必须?默认值说明
spring.datasource.*-数据库连接相关配置
spring.mvc.*-Spring MVC相关配置
logging.level.rootINFO默认的日志级别
sos.token.storejwt可选值:jwt,jdbc;配置Token存储方式,v2.1.0增加
sos.token.store.jwt.keyIH6S2dhCEMwGr7uE4fBakSuDh9SoIrRasos.token.store为jwt时配置具体的jwt key(长度16位或32位)
sos.reuse.refresh-tokentrue可选值:true,false;true重复使用refresh_token值直到过期,false每次刷新时生成新的refresh_token值(类似session机制进行续期),v2.1.0增加

grant_type 介绍

说明OAuth2.1支持的grant_type(授权方式)与功能
  1. authorization_code -- 授权码模式(即先登录获取code,再获取token)
  2. authorization_code + PKCE -- 授权码模式+PKCE (即先登录获取code, 请求时增加参数code_challengecode_challenge_method; 再获取token,增加参数code_verifier)
  3. password -- 密码模式(将用户名,密码传过去,直接获取token) OAuth2.1不推荐使用
  4. refresh_token -- 刷新access_token
  5. device_code -- 适用于各类无输入键盘的物联网智能设备进行认证授权, 通过类似'扫码登录'形式完成整个流程 OAuth2.1新增
  6. client_credentials -- 客户端模式(无用户,用户向客户端注册,然后客户端以自己的名义向'服务端'获取资源)
> 注意:相比OAuth2.0,去掉了 **implicit** 模式

帮助与改进

  1. 与该项目相关的博客请访问 https://blog.csdn.net/monkeyking1987/article/details/16828059

  2. 如果在使用过程中遇到特殊的问题(如:如何将oauth_code存入数据库),请访问项目的 Wiki附件.
    我会把大家反馈的问题解决办法添加在这里.
    若在这两个地方没有找到解决办法的, 欢迎发邮件到sz@monkeyk.com一起讨论.

  3. 如果在使用项目的过程中发现任何的BUG或者更好的提议, 建议将其提交到项目的 Issues 中, 我会一直关注并不断改进项目.


功能扩展

  1. oauth_code存入数据库的配置, 请下载文件 oauth_code存入数据库的配置.jpg
  2. 改变token过期的时间的配置, 请下载文件改变token过期的时间的配置.jpg
  3. 自定义 grant_type, 默认情况支持的grant_type包括 [password,authorization_code,refresh_token,device_code], 若不需要其中的某些grant_type, 则可以修改 oauth_client_details 表中的 authorized_grant_types 字段的值;
  4. 如何刷新access_token(refresh_token), 在通过客户端(如移动设备)登录成功后返回的数据如下
    {"access_token":"eyJraWQiOiJteW9pZGMta2V5aWQiLCJhbGciOiJSUzI1...","token_type":"bearer","refresh_token":"UCFNxUj4ytr241KzwJJgnMno1RfmoLs0GKVxNWPjW5VZ7d4U4YsDM7...","expires_in":43199,"scope":"openid"}

    若需要刷新获取新的token(一般在 expires_in 有效期时间快到时), 请求的URL类似如下
    http://localhost:8080/oauth2/token?client_id=mobile-client&client_secret=mobile&grant_type=refresh_token&refresh_token=UCFNxUj4ytr241KzwJJgnMno1RfmoLs0GKVxNWPjW5VZ7

    注意: refresh_token 参数值必须与登录成功后获取的 refresh_token 一致, 且grant_type = refresh_token
    另: 刷新token 需要 ClientDetails 支持 refresh_token 类型的 grant_type (默认是支持的)

开发计划

从 0.3版本开始将项目的所有计划的开发内容列出来, 方便大家跟进, 也欢迎你加入.
项目的开发管理使用开源项目 andaily-developer.



数据库表字段说明

在0.3版本中添加了db_table_description.html文件(位于/others目录), 用来说明数据库脚本文件oauth.ddl中各表,各字段的用途及使用场合.
也可在线访问https://andaily.com/spring-oauth-server/db_table_description.html.


Project Log

  1. 2013-11-19 Initial project, start push code

  2. 2013-11-20 发布0.1版本

  3. 2015-05-06 发布0.2版本

  4. 2015-05-27 创建项目博客,访问地址 http://andaily.com/blog/?cat=19

  5. 2015-06-07 发布0.3版本

  6. 2015-06-16 添加github访问: https://github.com/monkeyk/spring-oauth-server, 以后的更新将同步github与gitosc.

  7. 2015-11-09 开始开发 0.4-beta 版本

  8. 2015-11-18 发布 0.4-beta 版本

  9. 2016-01-02 发布 0.4 版本

  10. 2016-02-19 Add 0.5 version development planning

  11. 2016-04-03 Add config branch

  12. 2016-04-14 Add mongodb branch

  13. 2018-04-21 使用spring-boot重构,增加2.0.0实现 2.0.0

  14. 2018-05-01 开始 2.0.1 分支开发

  15. 2019-07-04 Add Redis config branch

  16. 2019-08-04 发布 2.0.1 版本

  17. 2020-06-04 发布 2.0.2 版本

  18. 2022-05-01 发布 2.1.0 版本

  19. 2023-10-10 开始全新大版本 3.0.0 开发


更多资源

以下是在学习工作中收集的更多关于OAuth2的资源,对深入理解与运用OAuth2有帮助


与项目相关的技术文章请访问 http://andaily.com/blog/?cat=19 (不断更新与OAuth2相关的文章)
问答与讨论
与项目相关的,与OAuth2相关的问题与回答,以及各类讨论请访问
http://andaily.com/blog/?dwqa-question_category=oauth

使用案例

以下是已知的使用(或基于) spring-oauth-server 开源项目的各类商业项目(排名不分先后), 若你有案例希望添加, 请联系作者.


捐助

支付宝: monkeyking1987@126.com (**钊) - 快意江湖 -- 100元 - yufan -- 100元

其他...

关注更多开源项目请访问 https://andaily.com/my_projects.html

欢迎联系作者 sz@monkeyk.com 进行探讨