spring-oauth-server 2.0.2 发布,扩展 OAuth2 Server

spring-oauth-server在2020-06-04更新发布了2.0.2版本,spring-oauth-server是Spring与Oauth2整合示例。

此版本更新内容如下:

1.Fix CVE-2019-3778, use spring-security-oauth 2.3.5.RELEASE

2.解决数据库多条 access_token问题,增加唯一约束

3.升级Spring-Boot版本为2.1.4.RELEASE

 

2.0.2版本release链接: https://gitee.com/shengzhao/spring-oauth-server/releases

 

MyOIDC v1.1.1 发布,基于 OIDC 协议的参考实现,根据各类库提供实现参考

MyOIDC  –基于OIDC协议的参考实现,根据各类库提供实现参考 。正式版本v1.1.1发布,主要更新内容:

  1. 修改启动方法为jar直接运行
  2. 更新How-To-Use.txt
  3. AccessToken使用时允许获取更详细用户信息
  4. 增加 JWKS test与使用说明示例
  5. jose4j升级使用0.7.1版本

openid

GitHub:   https://github.com/monkeyk/MyOIDC/tree/v1.1.1

Gitee:  https://gitee.com/mkk/MyOIDC/tree/v1.1.1

MyOIDC v1.1.0 发布–基于OIDC协议的参考实现,根据各类库提供实现参考

MyOIDC  –基于OIDC协议的参考实现,根据各类库提供实现参考 。第1个正式版本v1.1.0发布,主要更新内容:

  1. 实现OIDC协议的主要流程,包括 DiscoveryEndpoint等各类Endpoint提供实现参考;实现OIDC中主要的认证授权流程;JWKS API实现等。
  2. 实现myoidc-server, myoidc-client 两模块的各类功能细节,能实际使用,形成操作闭环。
  3. openid

V1.1.0 代码库链接:

GitHub:  https://github.com/monkeyk/MyOIDC/tree/v1.1.0

Gitee: https://gitee.com/mkk/MyOIDC/tree/v1.1.0/

 

解决oauth_access_token表出现一个UserName有多条数据异常

在spring-oauth-server的ISSUE #IAI2E#IP5N9中提到的oauth_access_token表会出现多条相同username的数据的异常情况,

解决办法如下:

1.对 oauth_access_token 表的authentication_id 字段增加唯一索引,创建索引SQL如下:

ALTER TABLE oauth_access_token ADD UNIQUE INDEX authentication_id_unique_index(authentication_id);

若是新建数据库,则直接按照 spring-oauth-server开发要求运行SQL文件(initial_db.ddl)即可(创建表的SQL中已经加了唯一索引)

 

2.推荐使用将access token 数据存入redis来提升性能与解决此问题,详细请访问 http://andaily.com/blog/?p=19776

 

spring-oauth-server 2.0.1 发布,基于Spring-Boot2.x实现,向微服务靠拢

spring-oauth-server在2019-08-04更新发布了2.0.1版本,

此版本是使用Spring Boot重构实现后的第2个发布版本(2.0.0是第1个),更新内容如下:

  1. 将项目用视频方式讲解出来,更直观学习与掌握,视频链接http://list.youku.com/albumlist/show/id_51900110.html(不断更新中)
  2. Fix issue #IJO9R /oauth/rest_token 接口 client_secret字段没有校验
  3. Use spring-boot version to :   2.0.2.RELEASE
  4. 修改ROLE的错误配置
  5. 升级Spring Security OAuth版本为2.3.4.RELEASE
  6. 增加将AccessToken存入Redis的配置参考,提高读写性能
  7. 增加使用代码生成AccessToken功能

 

2.0.1分支链接:https://gitee.com/shengzhao/spring-oauth-server/tree/2.0.1/

spring-oauth-server

 

 

历史更新

 

如何通过代码生成AccessToken

在默认的OAuth2场景中,需要发送请求到 /oauth/token 响应AccessToken,这能满足大部分的需求;但在更复杂的场景中,比如在请求时需要传递更多的信息,如deviceId(设备ID),tenantId(租户ID)等,这时默认的实现就不满足要求,需要另写API来实现(同时传递OAuth2需要的参数,如client_id),在后台代码实现中,需要通过代码来生成AccessToken。

在spring-oauth-server的2.0.1版本中,增加了通过代码生成AccessToken的JAVA类,具体如下:

token-code

 

InlineAccessTokenInvoker.java  — 生成AccessToken的抽象类,提供许多公共方法实现;

ClientCredentialsInlineAccessTokenInvoker.java  — 生成grant_type=client_credentials 时的AccessToken类;

PasswordInlineAccessTokenInvoker.java  — 生成grant_type=password 时的AccessToken类;

RefreshTokenInlineAccessTokenInvoker.java — 生成grant_type=refresh_token 时的AccessToken类;

 

具体的使用示例可查看每个类的单元测试代码。一个示例如下:

demo-token-get

 

调用成功返回 AccessTokenDto 对象,若失败则会抛出OAuth2中的异常对象,如:InvalidGrantException。

 

相关阅读

处理/oauth/token与/oauth/authorize的Endpoint

 

spring-oauth-server

在spring-oauth-server中将AccessToken存入Redis的配置

为了满足高性能的要求,spring-oauth-server中增加了使用redis存储 AccessToken的功能,以达到更高的性能要求。

以下配置是将AccessToken存入Redis的参考步骤。

前提:使用spring-oauth-server的config分支,并已经安装Redis服务

 

1.pom.xml中增加spring-boot的redis dependency.

redis-pom

 

2.application.properties中增加redis的配置属性

redis-prop

 

3.配置OAuth2中TokenStore的Redis实现:RedisTokenStore

config

(prefix值 可根据实际需要进行修改;默认的实现使用JdbcTokenStore)

 

在以上配置完成后,启动redis服务,并将spring-oauth-server重启后,即完成了将AccessToken配置存入Redis的功能,

测试获取AccessToken后,可在redis中查看到对应的数据,如下所示:

redis-log

 

spring-oauth-server的redis配置代码分支:https://gitee.com/shengzhao/spring-oauth-server/tree/config-redis/

 

 

spring-oauth-server 2.0.0 发布,使用Spring-Boot2.0实现

经过一年多的时间后,我们发布了 spring-oauth-server 2.0.0版本.

使用Spring-Boot 2.0版本重构, 进入模块化,零配置时代. 更符合技术发展与实际需要.

相比之前的版本(1.0及之前版本), 更新如下:

1. 全新的 Spring-Boot风格

2.ClientDetails中的 client_secret 字段加密保存

3.密码加密方式由MD5变成 BCrypt

4.增加CSRF机制支持

5.resourceId变为可选(但建议使用固定的resourceId)

https://gitee.com/shengzhao/spring-oauth-server/tree/2.0.0/

MyOIDC – 基于OIDC协议的开源项目

在之前的博客文章中, 曾不止一次介绍了OIDC协议及相关知识(详细访问: https://andaily.com/blog/?s=OIDC)

现在,开始一个新的开源项目: MyOIDC (https://git.oschina.net/mkk/MyOIDC), 将其相关的知识与实现给代码化,

我们将着重提供比OAuth2实现更好,更安全的认证与授权 安全框架实现.

 

顺便传播OIDC, 使用OIDC, 拥抱OIDC…

欢迎你的关注与支持…

 

https://git.oschina.net/mkk/MyOIDC

openid

spring-oauth-server 如何扩展使用其他数据存储方式

spring-oauth-server项目默认提供了MYSQL数据库进行数据存储, 另一个branch: mongodb 使用了MongoDB进行数据存储.

但如果你想在使用时用其他的数据存储方式(如ORACLE,SQL SERVER, REDIS),该如何办呢? 以下给出一些思路, 希望能帮上你.

理论准备:

spring-oauth-server项目实际是一个基于Spring框架的, 而Spring的核心思想是什么——面向接口编程, 而面向接口编程带来的好处就是扩展性很强(不是一般的强), 以此为出发点来思考.

同时想想默认的spring-oauth-server使用MYSQL时有哪些数据进行了存储, 就寻找这些存储相关的类进行扩展.

具体实现:

(以mongodb 分支为例)

1.扩展接口TokenStore.java, 写自己的TokenStore实现类, 参见MongoTokenStore.java类. 同时在security.xml中配置tokenStore时使用自己扩展的类,如下图:

tokenStore

2.扩展接口ClientDetailsService.java,写自己的ClientDetailsService实现类, 参见MongoClientDetailsService.java类,同时在security.mxl中配置clientDetailsService时使用自己扩展的类,如下图:

clientDetailsService

3.扩展接口AuthorizationCodeServices.java,写自己的AuthorizationCodeServices实现类, 参见MongoAuthorizationCodeServices.java类,同时在security.xml中配置authorizationCodeServices时使用自己扩展的类,如下图:

authCode

 

OK, 在实现上面3个步骤后, 扩展实现数据存储方式就差不多了(当然,写一些辅助类是不错的,如MongoTokenStore实现时注入使用了AccessTokenRepository; 这能带来代码结构清晰,维护方便 ,扩展性强等好处), 以上的3个接口都有些抽象的或默认的实现类,如TokenStore默认时使用的实现类为InMemoryTokenStore.java, 借助强大的IDE工具去查看各个接口已有的实现类, 仿照或参考去扩展实现自己需要的实现类并配置即可, 比如可以继承一些已有的实现类进行覆盖扩展也是不错的主意.

 

编程之艺在于融会贯通,周而复始; 在于一种思想思考—面向期望编程!!!