如何通过代码生成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/