3行代码快速实现Spring Boot Oauth2 Server服务

这里的3行代码并非指真的只须要写3行代码,而是基于我已经写好的一个Spring Boot Oauth2服务。仅仅须要修改3行数据库配置信息,便可获得一个Spring Boot Oauth2服务。html

项目地址https://github.com/jeesun/oauthserverjava

oauthserver

简介

oauthserver是一个基于Spring Boot Oauth2的完整的独立的Oauth微服务。仅仅须要建立相关数据表,修改数据库的链接信息,你就能够获得一个Oauth微服务。mysql

支持的关系型数据库:git

  • PostgreSQL
  • MySQL

已实现的功能:github

  1. 集成Spring Boot Oauth2,实现Oauth服务;
  2. token保存到关系型数据库;
  3. 获取token时,username容许传用户名、手机号或者邮箱;
  4. 日志记录保存到文件,并按日归档;
  5. 数据库链接信息加密;
  6. 集成Druid数据库链接池;
  7. 自定义Oauth2Exception异常返回的json信息。

更新日志

v1.1.0(2018-06-01)

  • 自定义Oauth2Exception异常返回的json信息。spring

    v1.0.3

  • bug修复。sql

    v1.0.1

  • 获取token时,username容许传用户名、手机号或者邮箱。数据库

    v1.0.0

  • 完成基础Oauth服务。json

使用流程

1. 建表

  • PostgreSQL
    请执行src/main/resources/schema-pg.sql,完成数据表的建立和测试数据的导入。
  • MySQL
    请执行src/main/resources/schema-mysql.sql,完成数据表的建立和测试数据的导入。oracle

    2. 修改数据库链接信息

    在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+) #明文postgres
    password: ENC(abdq6LyOspryFQHCqzEMTxRozyJVjIA4) #明文19961120
  • 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==) #明文root
    password: ENC(9oaIJkFgGSDFaHH3OXY63RHWQ+amDmiJ) #明文19941017

3. 运行

如今,一切已准备就绪。运行项目,当程序成功启动时,即代表你已配置成功。

4. 测试

在建表时,我已经向表添加了测试数据。如下请求参数的值,均是测试数据,在数据表中能够找获得。请根据需求到数据表中修改对应的值。
在表oauth_client_details表中,已有一条测试数据。列client_idclient_secret的值,分别对应Basic Oauth的请求参数usernamepassword的值。而列access_token_validity和列refresh_token_validity,分别表明access_token和refresh_token的有效期时间,以秒为单位。测试数据7200和5184000,分别表明2个小时和2个月(60天)。这是一个比较合理的有效期时间的设置,能够参考。

token相关的接口,都须要进行Basic Oauth认证。
以下图所示:
输入图片说明

一、根据用户名和密码获取access_token

POST http://localhost:8182/oauth/token?grant_type=password&username=jeesun&password=1234567890c

成功示例
status=200,返回的json数据:

{
    "access_token": "ca582cd1-be6c-4a5a-82ec-10af7a8e06eb",
    "token_type": "bearer",
    "refresh_token": "c24a6143-97c8-4642-88b9-d5c5b902b487",
    "expires_in": 3824,
    "scope": "read write trust"
}

失败示例

  1. 用户名错误
    status=400,返回的json数据:
{
    "code": 400,
    "message": "用户名不存在",
    "data": null
}
  1. 密码错误
    status=400,返回的json数据:
{
    "code": 400,
    "message": "密码错误",
    "data": null
}
  1. 帐号被封enabled=false
    status=400,返回的json数据:
{
    "code": 400,
    "message": "您已被封号",
    "data": null
}

二、检查access_token

GET http://localhost:8182/oauth/check_token?token=ca582cd1-be6c-4a5a-82ec-10af7a8e06eb

成功示例
即便用户被封enabled=false,access_token未过时仍然可用。
status=200,返回的json数据:

{
    "aud": [
        "oauth2-resource"
    ],
    "exp": 1524507296,
    "user_name": "jeesun",
    "authorities": [
        "ROLE_ADMIN",
        "ROLE_USER"
    ],
    "client_id": "clientIdPassword",
    "scope": [
        "read",
        "write",
        "trust"
    ]
}

失败示例
access_token已过时
status=400,返回的json数据:

{
    "code": 400,
    "message": "Token was not recognised",
    "data": null
}

三、根据refresh_token获取新的access_token

POST http://localhost:8182/oauth/token?grant_type=refresh_token&refresh_token=c24a6143-97c8-4642-88b9-d5c5b902b487

成功示例
status=200,返回的json数据:

{
    "access_token": "690ecd7d-f2b7-4faa-ac45-5b7a319478e8",
    "token_type": "bearer",
    "refresh_token": "c24a6143-97c8-4642-88b9-d5c5b902b487",
    "expires_in": 7199,
    "scope": "read write trust"
}

失败示例
用户被封enabled=false
status=401,返回的json数据:

{
    "code": 401,
    "msg": "用户已失效",
    "data": null
}

app实践指南

app获取到token信息后,须要保存token信息和请求时间。在传access_token以前,须要检查access_token是否过时。为了减小后台压力,检查access_token是否过时应该是在app本地完成。经过token的keyexpires_in(剩余有效期)的值,以及本地记录的请求时间,和当前时间作对比,能够很方便地判断出access_token是否过时。若是过时了,须要经过refresh_token获取新的access_token。由于access_token的有效期只有2个小时,这个验证是必须的。 refresh_token同理。

相关文章
相关标签/搜索