OAuth(Open Authorization,开放授权)是为用户资源的授权定义了一个安全、开放及简单的标准,第三方无需知道用户的账号及密码,就可获取到用户的授权信息。
OAuth在”客户端”与”服务提供商”之间,设置了一个授权层,”客户端”不能直接登录”服务提供商”,只能登录授权层,以此将用户与客户端区分开 来,”客户端”登录授权层是使用令牌(token),”客户端”登录授权层以后,”服务提供商”根据令牌的权限范围和有效期,向”客户端”开放用户储存的资料
实现机制(授权码)
在OAuth2的授权机制中有4个核心对象
1 | (1)Resource Owner(资源拥有者:用户) |
步骤:
1 | (1)用户在第三方应用上点击登录,应用向认证服务器发送请求,说有用户希望进行授权操作,同时说明自己是谁、用户授权完成后的回调url |
隐式授权模式/简化模式
和授权码模式类似,只不过少了获取code的步骤,是直接获取令牌token的,适用于公开的浏览器单页应用,令牌直接从授权服务器返回,不支持刷新令牌,且没有code安全保证,令牌容易因为被拦截窃听而泄露。
密码模式
使用用户名/密码作为授权方式从授权服务器上获取令牌,一般不支持刷新令牌。
客户端凭证模式
一般用于资源服务器是应用的一个后端模块,客户端向认证服务器验证身份来获取令牌。
为什么先获取code,再用code去获取access token
oauth2在获取access_token之前,一定要先获取code,主要是因为安全原因:
01,code需要设置过期时间,一般设置的过期时间非常短,如10分钟等,用户需要在短时间内通过code换取access_token,避免code被第三方拦截。当然,即便这种情况会发生,但因为code的过期时间非常短,也在一定程度上进行了保护,但这肯定不是完全安全的
02,授权成功后,code是会直接显示在浏览器上的,如果不通过code换取access_token,而是直接返回access_token,那access_token会被暴露出来,而code换取access_token是直接通过oauth服务器进行换取的,不依赖浏览器,access_token不会暴露出去。
前提是,你先在oauth服务器上进行了注册,得到了client_id和app_secret,请求时,不仅需要发送code,还需要发送client_id,oauth服务器会对client_id进行判断,是否已经进行了注册
当然,OAuth2还是允许直接返回access_token,而不经过code换取.oauth2一共有四种模式,有一种就是直接返回access_token的。
参考
OAuth2认证原理:https://blog.csdn.net/fsy9595887/article/details/85114508
OAuth2实现原理:https://www.cnblogs.com/chinanetwind/articles/9457842.html
OAuth2.0认证原理浅析:https://blog.csdn.net/tclzsn7456/article/details/79550249
CAS与OAuth2的区别:https://www.cnblogs.com/boboooo/p/9041355.html
理解OAuth 2.0:https://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html
身份认证系统OAuth2的四种模式:https://www.jianshu.com/p/90c8c75e3aad
为什么OAuth2里面在获取access token之前一定要先获取code,然后再用code去获取access token:https://www.cnblogs.com/askfb/p/11027366.html
认证鉴权系列
http认证鉴权01基本认证和摘要认证
http认证鉴权02同域SSO
http认证鉴权03跨域SSO之CAS
http认证鉴权04跨域SSO之OAuth2入门
http认证鉴权05CAS和OAuth2区别
http认证鉴权06CSRF跨站请求伪造