天天看点

OAuth2.0概念

​​https://tools.ietf.org/html/rfc6749​​

OAuth2.0授权框架使得第三方可以获取对用户资源的访问(有限访问或完全访问);如,通过你的允许,bilibili可以去微信服务器获取你的头像、昵称、openid等;

传统授权,用户和第三方共享密码,缺点如下:

1、未来可能持续需要访问各种受限资源,所以第三方要存储用户密码,一般情况密码是明文,显然不安全;

2、第三方将可以访问所有的资源,而实际上它只应当有权限访问部分资源;

3、用户不能撤销单个第三方的访问权限,改密码,所有第三方都会失效;

术语:

专业称呼 通俗叫法
资源所有者 用户
资源服务器 保存用户信息的服务器并且能够验证令牌是否合法,如微信服务器,保存你的微信头像等
客户端 第三方应用程序,如bilibili
授权服务器 发送令牌给第三方的服务器(可以和资源服务器是同一个)

四种模式:

Authorization Code Grant授权码模式

适用前后端分离,最常用的模式,微信、QQ、Github登陆第三方网站就是这种模式,优点前后端分离,避免令牌泄露;

1、bilibili提供一个微信登陆的链接,用户点击跳转到微信授权服务器;

2、用户根据微信授权服务器提示登陆微信,并确认授权给bilibili;

3、微信授权服务器返回用户代理(浏览器)一个授权码;

4、用户代理(浏览器)把这个授权码给bilibili;

5、bilibili凭借授权码向微信授权服务器请求令牌;

6、微信授权服务器发送令牌给bilibili;

7、之后bilibili就可带着令牌去微信资源服务器读取用户资料;

为什么要授权码?防止令牌泄露

为什么要重定向?用户需要与授权服务器交互,这个过程是必须的

授权码为什么不直接返回给bilibili?如果授权服务器接收多个用户请求,再将授权码返回给bilibili,那么bilibili将不能区分授权码是哪个用户的,所以授权码先返回给用户代理,再由用户代理传给bilibili

隐式模式(不推荐使用)

适合没有后台的第三方,此处的bilibili只有前端没有后端;

1、bilibili提供一个微信登陆的链接,用户点击跳转到微信授权服务器;

2、用户根据微信授权服务器提示登陆微信并确认授权给bilibili;

3、微信授权服务器发送令牌给bilibili;

​https://weixin.com/oauth/authorize?response_type=token&client_id=xxx&​

redirect_uri=http://bilibili.com/callback&

scope=read

密码模式

适合用户极其信任第三方;

1、bilibili使用用户给的微信登陆账号和密码直接向微信授权服务器索引令牌;

2、微信授权服务器发送令牌给bilibili;

​​https://weixin.com/token?grant_type=password&username=test&password=testxxx&client_id=xxx​​

客户端模式

适合没有前端的第三方,整个过程没有用户参与;

场景:bilibili向用户发送通知网站改版等;

1、bilibili向微信授权服务器请求令牌;

2、微信授权服务器发送令牌给bilibili;

3、通过access_token请求到微信公众平台的粉丝的openid,进而发消息;

​​https://weixin.com/token?grant_type=client_credentials&client_id=xxx&client_secret=xxxx​​

继续阅读