前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >3行代码快速实现Spring Boot Oauth2服务

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

作者头像
用户1737026
发布2018-05-17 17:12:14
1K0
发布2018-05-17 17:12:14
举报
文章被收录于专栏:五毛程序员五毛程序员

这里的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. 日志记录保存到文件,并按日归档;
  4. 数据库连接信息加密;
  5. 集成Druid数据库连接池。

使用流程

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+) 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) 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

成功示例:

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

失败示例(用户名或者密码错误)

代码语言:javascript
复制
{
    "error": "invalid_grant",
    "error_description": "Bad credentials"
}

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

成功示例

代码语言:javascript
复制
{
    "aud": [
        "oauth2-resource"
    ],
    "exp": 1524507296,
    "user_name": "jeesun",
    "authorities": [
        "ROLE_ADMIN",
        "ROLE_USER"
    ],
    "client_id": "clientIdPassword",
    "scope": [
        "read",
        "write",
        "trust"
    ]
}

失败示例(access_token已过期)

代码语言:javascript
复制
{
    "error": "invalid_token",
    "error_description": "Token was not recognised"
}

3、根据refresh_token获取新的access_token POST http://localhost:8182/oauth/token?grant_type=refresh_token&refresh_token=c24a6143-97c8-4642-88b9-d5c5b902b487

成功示例

代码语言:javascript
复制
{
    "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实践指南

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-04-24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • oauthserver
    • 简介
      • 使用流程
        • 1. 建表
      • app实践指南
      相关产品与服务
      数据库
      云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档