oauthserver是一个基于Spring Boot Oauth2的完整的独立的Oauth服务器。仅仅需要创建相关数据表,修改数据库的连接信息,你就可以得到一个Oauth服务器。
支持的关系型数据库:
- PostgreSQL
- MySQL
已实现的功能:
- 集成Spring Boot Oauth2,实现Oauth服务;
- token保存到关系型数据库;
- 日志记录保存到文件,并按日归档;
- 数据库连接信息加密;
- 集成Druid数据库连接池。
- PostgreSQL
请执行
src/main/resources/schema-pg.sql
,完成数据表的创建和测试数据的导入。 - MySQL
请执行
src/main/resources/schema-mysql.sql
,完成数据表的创建和测试数据的导入。
在application.yml中,配置着数据库的连接信息。其中,配置项username和password是要经过jasypt加密的,不能直接填明文。加密密钥由jasypt.encryptor.password
配置。你需要使用test目录下的UtilTests工具得到加密字符串。
- PostgreSQL
# PostgreSQL连接信息
driver-class-name: org.postgresql.Driver
url: jdbc:postgresql://127.0.0.1:5432/thymelte?useUnicode=true&characterEncoding=UTF-8
username: ENC(hTpbG9fq+7P3SntmXuNtDxbtWDqRuPV+)
password: ENC(abdq6LyOspryFQHCqzEMTxRozyJVjIA4)
- MySQL
# MySQL连接信息
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: ENC(YiYjVwTulDGN//YaB3KbuA==)
password: ENC(9oaIJkFgGSDFaHH3OXY63RHWQ+amDmiJ)
现在,一切已准备就绪。运行项目,当程序成功启动时,即表明你已配置成功。
在建表时,我已经向表添加了测试数据。以下请求参数的值,均是测试数据,在数据表中可以找得到。请根据需求到数据表中修改对应的值。
在表oauth_client_details
表中,已有一条测试数据。列client_id
和client_secret
的值,分别对应Basic Oauth的请求参数username
和password
的值。而列access_token_validity
和列refresh_token_validity
,分别代表access_token和refresh_token的有效期时间,以秒为单位。测试数据7200和5184000,分别代表2个小时和2个月(60天)。这是一个比较合理的有效期时间的设置,可以参考。
token相关的接口,都需要进行Basic Oauth认证。
1、根据用户名和密码获取access_token
POST http://localhost:8182/oauth/token?grant_type=password&username=jeesun&password=1234567890c
成功示例:
{
"access_token": "ca582cd1-be6c-4a5a-82ec-10af7a8e06eb",
"token_type": "bearer",
"refresh_token": "c24a6143-97c8-4642-88b9-d5c5b902b487",
"expires_in": 3824,
"scope": "read write trust"
}
失败示例(用户名或者密码错误)
{
"error": "invalid_grant",
"error_description": "Bad credentials"
}
2、检查access_token
GET http://localhost:8182/oauth/check_token?token=ca582cd1-be6c-4a5a-82ec-10af7a8e06eb
成功示例
{
"aud": [
"oauth2-resource"
],
"exp": 1524507296,
"user_name": "jeesun",
"authorities": [
"ROLE_ADMIN",
"ROLE_USER"
],
"client_id": "clientIdPassword",
"scope": [
"read",
"write",
"trust"
]
}
失败示例(access_token已过期)
{
"error": "invalid_token",
"error_description": "Token was not recognised"
}
3、根据refresh_token获取新的access_token
成功示例
{
"access_token": "690ecd7d-f2b7-4faa-ac45-5b7a319478e8",
"token_type": "bearer",
"refresh_token": "c24a6143-97c8-4642-88b9-d5c5b902b487",
"expires_in": 7199,
"scope": "read write trust"
}
app获取到token信息后,需要保存token信息和请求时间。在传access_token之前,需要检查access_token是否过期。为了减少后台压力,检查access_token是否过期应该是在app本地完成。通过token的keyexpires_in
(剩余有效期)的值,以及本地记录的请求时间,和当前时间做对比,可以很方便地判断出access_token是否过期。如果过期了,需要通过refresh_token获取新的access_token。因为access_token的有效期只有2个小时,这个验证是必须的。refresh_token同理。