Spring Security Oauth2 JWT

server:
  port: 9200
spring:
  application:
    name: user-auth
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/shop_oauth?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true&serverTimezone=UTC
    username: root
    password: 332502
  main:
    allow-bean-definition-overriding: true
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
auth:
  ttl: 3600  #token存储到redis的过期时间
  clientId: accp
  clientSecret: accp
  cookieDomain: localhost
  cookieMaxAge: -1
encrypt:
  key-store:
    location: classpath:/wfshop.jks
    secret: wfshop
    alias: wfshop
    password: wfshop

 application.yml配置

Oauth2有以下授权模式:

1.授权码模式(Authorization Code)2.隐式授权模式(Implicit) 3.密码模式(Resource Owner Password Credentials) 4.客户端模式(Client Credentials) 

申请授权码

请求认证服务获取授权码列子

QQ服务器给KGC专门申请的账号
https://graph.qq.com/oauth2.0/show?which=Login&display=pc&response_type=code&client_id=101242566&redirect_uri=http://www.ekgc.cn/vendors/qq/callback?urlType=1&state=8c7939d966d2c60b47e2a0d90b94390e&scope=get_user_info

     

参数列表如下:

client_id:客户端id,和授权配置类中设置的客户端id一致。 
response_type:授权码模式固定为code 
scop:客户端范围,和授权配置类中设置的scop一致。 
redirect_uri:跳转uri,当授权码申请成功后会跳转到此地址,并在后边带上code参数(授权码)

输入账号和密码,点击Login。 Spring Security接收到请求会调用UserDetailsService接口的loadUserByUsername方法查询用户正确的密码。 当前导入的基础工程中客户端ID为xzzb,秘钥也为xzzb即可认证通过。

接下来进入授权页面:

点击Authorize,接下来返回授权码: 认证服务携带授权码跳转redirect_uri,code=nHsW9U就是返回的授权码

 

(2)申请令牌

拿到授权码后,申请令牌。 Post请求:http://localhost:7004/oauth/token 参数如下:

grant_type:授权类型,填写authorization_code,表示授权码模式 
code:授权码,就是刚刚获取的授权码,注意:授权码只使用一次就无效了,需要重新申请。 
redirect_uri:申请授权码时的跳转url,一定和申请授权码时用的redirect_uri一致。 

此链接需要使用 http Basic认证。 什么是http Basic认证? http协议定义的一种认证方式,将客户端id和客户端密码按照“客户端ID:客户端密码”的格式拼接,并用base64编 码,放在header中请求服务端,一个例子: Authorization:Basic WGNXZWJBcHA6WGNXZWJBcHA=WGNXZWJBcHA6WGNXZWJBcHA= 是用户名:密码的base64编码。 认证失败服务端返回 401 Unauthorized。

以上测试使用postman完成:

http basic认证:

 

 

客户端Id和客户端密码会匹配数据库oauth_client_details表中的客户端id及客户端密码。

点击发送: 申请令牌成功

 

返回信如下:

access_token:访问令牌,携带此令牌访问资源 
token_type:有MAC Token与Bearer Token两种类型,两种的校验算法不同,RFC 6750建议Oauth2采用 Bearer Token(http://www.rfcreader.com/#rfc6750)。 
refresh_token:刷新令牌,使用此令牌可以延长访问令牌的过期时间。 
expires_in:过期时间,单位为秒。 
scope:范围,与定义的客户端范围一致。    
jti:当前token的唯一标识

这边使用postman进行测试

Spring Security Oauth2提供校验令牌的端点

Get: http://localhost:7004/oauth/check_token?token= [access_token]

 

后面的例子都是在自己的测试类上金进行