ruanyifeng文章的摘要
http://www.ruanyifeng.com/blog/2019/04/oauth-grant-types.html?utm_source=tuicool&utm_medium=referral
oauth2是为了解决这个问题:用户访问A网站, 利用B网站账号登录(比如微信)
1.访问A
2.用户同意后,A将用户导向B
3.经过B认证成功后, 资源服务器向用户(浏览器or 手机APP)发一个token
4.后续A网站对资源服务器所有操作都带token(如果只是为了登录不需要)
根据用户获得token的方式不同,分为4种情况
1.授权码(authorization-code)
最常用,安全性最高, 使用于有前后端分离的web应用。前台申请授权码,后台换token。
页面上A跳转到B的时候, 直接请求授权码,
用户在B上同意, B根据请求中的redirect_uri回调,将AUTHORIZATION_CODE传回。
这样A后台就得到授权码, A后台根据授权码发请求向B申请token, 此时又传一个回调地址。
B根据授权码生成token, 再次回调A提供的redirect_uri,这里是发json格式数据。
2. 隐藏式
授权码模式的token存在A网站后台。如果A没有后台,只能存在前台,也就没必要授权码了。只能用于一些安全要求不高的场景,并且令牌的有效期必须非常短,一般就会话期间。
页面上A跳转到B的时候, 直接请求token,
用户在B上同意, B根据请求中的redirect_uri回调,将token传回。注意这里http格式是锚点(所以只是本页请求,不会发到后台)
https://a.com/callback#token=ACCESS_TOKEN
3.密码式
用户直接将B中账户和密码填到A上, A将账号密码发到B,B直接返回token。
必须用户高度信任A
4.凭证式
适用于没有前端的命令行应用。
A网站发送client_id和client_secret到B, B直接返回token。
这种方式是针对三方应用,不是针对最终用户的, 因为可能多个用户共享一个令牌。
网友评论