这是我参与8月更文挑战的第1天,活动详情查看:8月更文挑战
OAuth定义
OAuth协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是OAuth的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此OAuth是安全的。OAuth是Open Authorization的简写。
使用场景
为什么会使用OAuth2.0
假设不使用OAuth2.0授权登录的话,最传统的方法是让用户直接在游戏中输入用户名和密码,这样做可能会有很多问题:
- 你的用户名和密码都得先经过一次王者荣耀(三方),那么你的用户名和密码就会不安全
- 当王者荣耀(三方)获取了你的用户名密码,那么就相当于拥有了用户在QQ/微信的所有权限,包括删除好友、发消息给好友、改密、支付等等危险操作。
- 只有用户修改密码,才能收回王者荣耀的权限。但是王者荣耀(三方)这个时候就会失效,下一次需要你重新提供。
- 只要有一个第三方应用程序被破解,就会导致用户名和密码泄露,以至于所有的数据泄露
为了解决以上的问题,OAuth协议营运而生了
腾讯游戏现在的登录基本都是基于QQ/微信去授权登录的,这个时候就会出现授权访问的问题,OAuth2.0就是在这种时候使用的。
授权过程
QQ/微信作为一个服务提供商,拥有用户的头像、昵称等信息,王者荣耀希望获取用户的头像和昵称等信息。
- 王者荣耀对QQ/微信说:我想要用户A的信息(使用QQ/微信登录)。
- QQ/微信回王者荣耀:你需要用户A信息的可以提供,但是我得先去征求用户A的同意,不同意我们不能提供(微信给用户A跳转到一个确认授权的页面)
- 用户A: 确认登录,QQ/微信产生一个授权的凭证,给王者荣耀,然后可以通过这个凭证来获取用户A的信息(这个凭证一般情况下,是有时间限制的,王者荣耀隔一段时间就会让我们重新登录一次)
- 王者荣耀: 使用用户A的凭证拿到了用户A的信息。
以上是 OAuth 认证的大概流程。在使用QQ/微信授权之前,王者荣耀需要现在QQ/微信的开放平台上注册应用,填写自己的名称、logo、用途、redirect_uri(用户授权后的回调地址)等信息,开放平台颁发给王者荣耀一个APP ID 和叫 APP Secret 的密钥,在实际对接中,会使用到这两个参数。
获取凭证的具体流程
sequenceDiagram
王者荣耀->>用户: ①请求认证
用户-->>王者荣耀: ②用户同意,返回code
王者荣耀->>QQ/微信: ③使用code换取token
QQ/微信-->>王者荣耀: ④返回token
王者荣耀->>QQ/微信: ⑤携带token请求资源
QQ/微信-->>王者荣耀: ⑥返回资源
- 用户点击
确认登录按钮 - 页面自动跳转到初始参数中的
redirect_uri定义的URL,并自动在URL末尾添加一个code参数 - 王者荣耀通过上一步的
code发送请求换取token(token就是前面说的凭证),请求包含以下参数:client_id/app_id:在开发平台申请的APP IDclient_secret/app_secret:在开放平台申请的APP Secretgrant_type: 需要填写authorization_codecode: 上一步获取的coderedirect_uri: 需要与第一步的redirect_uri一致
- 通过第三步请求,接口返回
token和相关数据(过期时间和用户ID等) - 使用第四步中获取的
token,使用它,就可以获取用户资源了 - 最后一步,微信返回用户信息,王者荣耀正常处理,整个流程结束。
OAuth2.0思路
OAuth在"客户端"与"服务提供商"之间,设置了一个授权层(authorization layer)。"客户端"不能直接登录"服务提供商",只能登录授权层,以此将用户与客户端区分开来。"客户端"登录授权层所用的令牌(token),与用户的密码不同。用户可以在登录的时候,指定授权层令牌的权限范围和有效期。
"客户端"登录授权层以后,"服务提供商"根据令牌的权限范围和有效期,向"客户端"开放用户储存的资料。