认证开发+Oauth2(授权码)模式+Spring Security+网关解说
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了认证开发+Oauth2(授权码)模式+Spring Security+网关解说相关的知识,希望对你有一定的参考价值。
参考技术A 用户看到登录的页面就可以输入账号密码进行登录,当用户点击登录就会发送一个请求http:localhost:8001/api/oauth/login登录请求,网关放行(UrlFilter包含了需要放行的请求)将用户输入的用户名和密码发送到login的controller中,这时如果输入为空直接 返回错误信息
然后去调用申请令牌的service中的exchange方法传入客户端id和客户端密码和用户输入的用户名和密码.在申请令牌的时候,通过用户传来的用户名去工具类中用过feign的远程调用user服务,查询用户信息客,通过Spring Security框架去校验用户传来的密码和查询出来的密码比对,通过客户端id和客户端密码,自动查询oauth_client_details表,通过后,生成最终的jwt令牌,它包含了6部分数据:
拿到令牌后我们会在方法中取出jwt令牌的值,存储到redis中,设置它的过期时间
然后返回令牌,在controller层拿到令牌后 取出jti短令牌存储到cookie中
到这里,用户就登录成功了提示用户,也可以跳转相关页面.
这时用户就能够访问我们受保护的资源了,用户会发起请求路径到相关服务层,会经过网关过滤器,不是登录请求不放行,然后校验cookie中有没有短令牌,如果有判断redis中有没有存储jwt令牌信息(存在过期),不满足条件返回401权限不足: return response.setComplete();
都满足条件,对这次用户请求头进行增强操作:
用户请求到达服务层后,认证服务会自动对jwt令牌进行校验解析,解析通过后访问被保护的资源,
解析不通过返回权限不足错误.解析通过我们还会在每一个服务的方法上加@PreAuthorize权限注解,判断是否满足权限条件,不满足则跳转到登录页面
身份认证系统 OAuth2的四种模式
OAuth2标准为了应对不同的场景,设计了四种不同的标准模式。
1、授权码模式
授权码模式是四种模式中最繁琐也是最安全的一种模式。
client向资源服务器请求资源,被重定向到授权服务器(AuthorizationServer)
浏览器向资源拥有者索要授权,之后将用户授权发送给授权服务器
授权服务器将授权码(AuthorizationCode)转经浏览器发送给client
client拿着授权码向授权服务器索要访问令牌
授权服务器返回Access Token和Refresh Token给cilent
这种模式是四种模式中最安全的一种模式。一般用于client是Web服务器端应用或第三方的原生App调用资源服务的时候。因为在这种模式中AccessToken不会经过浏览器或移动端的App,而是直接从服务端去交换,这样就最大限度的减小了AccessToken泄漏的风险。
2、简化模式
简化模式相对于授权码模式省略了,提供授权码,然后通过服务端发送授权码换取AccessToken的过程。
client请求资源被浏览器转发至授权服务器
浏览器向资源拥有者索要授权,之后将用户授权发送给授权服务器
授权服务器将AccessToken以Hash的形式存放在重定向uri的fargment中发送给浏览器
浏览器访问重定向URI
资源服务器返回一个脚本,用以解析Hash中的AccessToken
浏览器将Access Token解析出来
将解析出的Access Token发送给client
一般简化模式用于没有服务器端的第三方单页面应用,因为没有服务器端就无法使用授权码模式。
3、密码模式
密码模式是用户直接将自己的用户名密码交给client,client用用户的用户名密码直接换取AccessToken。
用户将认证密码发送给client
client拿着用户的密码向授权服务器请求Access Token
授权服务器将Access Token和Refresh Token发送给client
这种模式十分简单,但是却意味着直接将用户敏感信息泄漏给了client,因此这就说明这种模式只能用于client是我们自己开发的情况下。因此密码模式一般用于我们自己开发的,第一方原生App或第一方单页面应用。
4、客户端模式
这是一种最简单的模式,只要client请求,我们就将AccessToken发送给它。
client向授权服务器发送自己的身份信息,并请求AccessToken
确认client信息无误后,将AccessToken发送给client
这种模式是最方便但最不安全的模式。因此这就要求我们对client完全的信任,而client本身也是安全的。因此这种模式一般用来提供给我们完全信任的服务器端服务。在这个过程中不需要用户的参与。
我们来总结一下四种模式的应用场景:
1、授权码模式:第三方Web服务器端应用与第三方原生App
2、简化模式:第三方单页面应用
3、密码模式:第一方单页应用与第一方原生App
4、客户端模式:没有用户参与的,完全信任的服务器端服务
以上是关于认证开发+Oauth2(授权码)模式+Spring Security+网关解说的主要内容,如果未能解决你的问题,请参考以下文章
使用Spring Security登录认证,通过Oauth2.0开发第三方授授权访问资源项目详解
Springboot2.0 + OAuth2.0之授权码模式