1.ouath2+jwt+jdbc(spring data jpa)搭建和使用
一、简单的介绍一下OAuth2
是开放授权的一个标准,允许用户授权B应用不提供帐号密码的方式去访问该用户在A应用服务器上的某些特定资源。
说人话就是通过登录微信扫码方式来,登录到csdn而不想注册账号
这里使用我先前搭建好的项目环境(如果使用该代码记得改一下数据名和密码)
2.1OAuth2四种授权模式(简化模式请求token我就不演示了)
密码模式(resource owner password credentials)(为遗留系统设计)(支持refresh token)
授权码模式(authorization code)(正宗方式)(支持refresh token)
简化模式(implicit)(为web浏览器应用设计)(不支持refresh token)
客户端模式(client credentials)(为后台api服务消费者设计)(不支持refresh token)
大致流程:
1.用户进入的登录页面,点击微信的图标以微信账号登录系统,用户是自己在微信里信息的资源拥有者。 2、资源拥有者同意给客户端授权资源拥有者扫描二维码表示资源拥有者同意给客户端授权,微信会对资源拥有者的身份进行验证,
验证通过后,微信会询问用户是否给授权黑马程序员访问自己的微信数据,用户点击“确认登录”表示同意授权,微信认证服务器会颁发一个授权码,并重定向到黑马程序员的网站。
3、客户端获取到授权码,请求认证服务器申请令牌此过程用户看不到,客户端应用程序请求认证服务器,请求携带授权码。
4、认证服务器向客户端响应令牌认证服务器验证了客户端请求的授权码,如果合法则给客户端颁发令牌,令牌是客户端访问资源的通行证。此交互过程用户看不到,当客户端拿到令牌后,用户在黑马程序员看到已经登录成功。
5、客户端请求资源服务器的资源客户端携带令牌访问资源服务器的资源。再次访问该网站携带令牌请求访问微信服务器获取用户的基本信息。
6、资源服务器返回受保护资源资源服务器校验令牌的合法性,如果合法则向用户响应资源信息内容。
注意:资源服务器和认证服务器可以是一个服务也可以分开的服务,如果是分开的服务资源服务器通常要请求认证服务器来校验令牌的合法性。
-
授权码模式(启动码云上面的ouath项目,端口为1200)
授权码模式(authorization code)是功能最完整、流程最严密的授权模式,code保证了token的安全性,即使code被拦截,由于没有app_secret,也是无法通过code获得token的。
授权码授权流程如下:
1、客户端请求第三方授权 2、用户(资源拥有者)同意给客户端授权 3、客户端获取到授权码,请求认证服务器申请
令牌 4、认证服务器向客户端响应令牌 5、客户端请求资源服务器的资源,资源服务校验令牌合法性,完成授权
6、资源服务器返回受保护资源localhost:1200/oauth/authorize? client_id=client_3&response_type=code&scop=server&redirect_uri=https://blog.csdn.net/Violet_201903027
client_id:客户端id,和授权配置类中设置的客户端id一致。
response_type:授权码模式固定为code
scop:客户端范围,和授权配置类中设置的scop一致。
redirect_uri:跳转uri,当授权码申请成功后会跳转到此地址,并在后边带上code参数(授权码)。这里有一些注意事项,数据库中的web_server_redirect_uri要和请求路径的redirect_uri相同,你请求的client_id所对应的authorized_grant_types必须要有authorization_code(这个意味着这个客户端可以用授权码请求)
client_id:客户端id
resource_ids:资源id(暂时不用)
client_secret:客户端密码
scope:范围
access_token_validity:访问token的有效期(秒)
refresh_token_validity:刷新token的有效期(秒)
authorized_grant_type:授权类型,authorization_code,password,refresh_token,client_credentials
-
将上面的路径放入浏览器,将会自动转跳到登录页面,这时候随便输入数据库user表的账号和密码(默认为123456,因为ouath2的密码加密所以这里存的是密文。账号:user_1,密码: 123456)
-
然后点击Authorize授权
-
返回code,复制然后在postman里面请求
-
这样就拿到了jwt的token,授权码模式获取token就可以拿到了,注意这里的code只能用一次
2.2 客户端模式(直接使用客户端的账号密码获取,一般用在信任的应用上面)
2.3 密码模式(Resource Owner Password Credentials)
与授权码模式的区别是申请令牌不再使用授权码,而是直接
通过用户名和密码即可申请令牌。
由于请求表单有点多都这里给复制的东西
grant_type:password
client_id:client_2
client_secret:123456
scope:server
username:user_5
password:123456
验证一样token的有效性(启动项目时,你会发现这些东西url)
第一个/oauth/token已经使用过了
/ouath/check_token使用,解析token的使用,将token放到表单提交的parm上面,就会获取token封装的一些信息
刷新token
http://127.0.0.1:1200/oauth/token?refresh_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjb2RlIjoyMDAsInVzZXJfbmFtZSI6InVzZXJfMSIsInNjb3BlIjpbInNlcnZlciJdLCJhdGkiOiIwNWEzMjM4NS04Mzg4LTQxZTUtYTA5OS01YzU2ZmE3OWVkNWYiLCJleHAiOjE1OTM5MDg2MTMsImF1dGhvcml0aWVzIjpbIlVTRVIiXSwianRpIjoiMGYxMGVjZmItYWY0My00NDgzLTllZDItNmFhMmY0ZGZiYzg5IiwiY2xpZW50X2lkIjoiY2xpZW50XzIifQ.MZ0hMYhPAXbw6ULi2R5sBYHi5iF6BMr81gO9eMiUf7s&grant_type=refresh_token&client_id=client_2&client_secret=123456
jwt增强位置,可以自行修改封装
资源管理器验证(启动demo_resource,端口默认1300)
不携带token访问时,会发现没有权限,拿到刚刚获得的token携带过去就会发现