如何理解OAuth2.0
OAuth2.0的产生主要是为了安全
简单理解:
启动流程
我们现在要通过QQ登录一个网站,但不希望告知QQ用户名以及密码,同意给予部分信息(头像,性别等)
https://graph.qq.com/oauth2.0/show?which=Login&display=pc&client_id=1688888&redirect_uri=https%3A%2F%2Fcas.bugly.qq.com%2Fdcf%2FloginBack%3Ftype%3D9%26sn%3D50532928-5fc3-4896-b48d-4d81ccef1358&response_type=code&state=5fe604e4cb30646c3a2f45258a659e22&scope=get_user_info,add_topic,add_one_blog,add_album,upload_pic,list_album,add_share,check_page_fans,add_t,add_pic_t,del_t,get_repost_list,get_info,get_other_info,get_fanslist,get_idollist,add_idol,del_ido,get_tenpay_addr
当点击使用QQ登录的按钮时候,我们重定向到QQ OAuth Server 提供的登录页面,我们可以看到,上面包含 - client_id=101487884 从OAuth Server获得 通常是跟服务端注册时候获得 - redirect_uri=https%3A%2F%http://2Fcas.bugly.qq.com 你重定向的位置 - scope=巴拉巴拉 都是你同意他访问的范围以及权限级别等
打开 QQ (OAuth Client) ,QQ 要求你给予对应授权
给与同意
QQ (OAuth Client)根据上一步获得的授权,像后台认证服务器申请令牌(asscess key)
回调
如果用户成功登录并授权,则会跳转到指定的回调地址,并给与授权代码(Authorization Code)
获取访问令牌(ak)
通过Authorization Code获取Access Token(匹配密文,常规校验游览器头,重定向,客户端app sk等 如果两个密文匹配会给予asscess key)
https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&client_id=[YOUR_APP_ID]&,client_secret=[YOUR_APP_Key]&code=[The_AUTHORIZATION_CODE]&redirect_uri=[YOUR_REDIRECT_URI]
可以看到,QQ 是通过 Access Token,client_id,client_secret,redirect_uri 计算hash发放AK
数据访问
收到的访问令牌用于获取应用程序所需的数据,例子中的QQ就可以访问昵称,性别,头像等 - 客户端使用令牌,向资源服务器申请获取资源(也就是常规通过ak 获取token) - 资源服务确认无误后,同意发放资源 (根据token,后台返回数据)
术语 (面试的时候交流的)
资源拥有者: 用户期望只通过一个应用完成登录,同时不愿意完全公开自己全部信息
Client: 一个应用如(QQ ,facebook,微信)
授权服务(Authorization server):服务器在成功验证资源所有者并获得授权后向客户端发出Access Key。
资源服务(Resource server):托管受保护资源的服务器,能够使用访问令牌接受和响应受保护资源请求。
Redirect Uri: 在给出权限时用户被重定向到的位置 Access Key: 用应用程序请求的访问级别。
授权服务器可以基于授权服务器策略或资源所有者的指令完全或部分地忽略客户端请求的范围
抽象来说如图所示