zoukankan      html  css  js  c++  java
  • 3行代码快速实现Spring Boot Oauth2 Server服务

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

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

    oauthserver

    简介

    oauthserver是一个基于Spring Boot Oauth2的完整的独立的Oauth微服务。仅仅需要创建相关数据表,修改数据库的连接信息,你就可以得到一个Oauth微服务。

    支持的关系型数据库:

    • PostgreSQL
    • MySQL

    已实现的功能:

    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信息。

    v1.0.3

    • bug修复。

    v1.0.1

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

    v1.0.0

    • 完成基础Oauth服务。

    使用流程

    1. 建表

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

    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认证。
    如下图所示:
    输入图片说明

    1、根据用户名和密码获取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
    }
    

    2、检查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
    }
    

    3、根据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同理。

  • 相关阅读:
    Emacs 安装 jedi
    PHP+ MongoDB
    Debian 7 安装 Emacs 24.3
    在Code first中使用数据库里的视图
    Emacs安装auto-complete
    Debian 7.4 中配置PHP环境
    ASP.NET MVC 下载列表
    JDicom使用指南
    Windows常用的DOS命令
    Entity Framework问题总结
  • 原文地址:https://www.cnblogs.com/rainmer/p/8926991.html
Copyright © 2011-2022 走看看