前言
第三方登录是应用开发中的常用功能,通过第三方登录,我们可以更加容易使用户登录我们的应用或者网站。
很多网站都提供了第三方登录的功能,在他们的官网中,都提供了如何接入第三方登录的文档。但是,假如不同的网站文档差别极大,那么对于不了解第三方登录的新手来说,实现一个支持多网站第三方登录的功能可以说是极其痛苦。
实际上,大多数网站提供的第三方登录都遵循OAuth协议,虽然大多数网站的细节处理都是不一致的,甚至会基于OAuth协议进行扩展,但大体上其流程是一定的。
本篇文章以微信网页授权来介绍OAuth2.0中最经典最常用的一种授权模式:授权码模式
OAuth是什么?
OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。
允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据。每一个令牌授权一个特定的网站(例如,视频编辑网站)在特定的时段(例如,接下来的2小时内)内访问特定的资源(例如仅仅是某一相册中的视频)。这样,OAuth允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要分享他们的访问许可或他们数据的所有内容。
OAuth2.0官方文档为:https://tools.ietf.org/html/rfc6749
为什么是OAuth2.0呢?其实是有1和1.1版本的,只是因为1和1.1版本流程比较复杂,应用不是很广泛。
授权码模式流程
授权码模式(authorization code)是功能最完整、流程最严密的授权模式。它的特点就是通过客户端的后台服务器,与 "服务提供商" 的认证服务器进行互动。
整体大致过程如下:

OAuth2.0应用场景
我们这里主要模拟在微信公众号中使用OAuth2.0进行授权,获取用户的基本信息的过程。
第1步:引导用户进行授权:
当用户希望使用第三方登录进行登录时,第三方应用会通过类似下图的方式将用户引导至授权页面URL。

如:需要获取微信用户信息时,需要引导用户点击请求如下授权页面URL。
//open.weixin.qq.com/
请求参数详细介绍如下
参数 | 必须 | 说明 |
---|---|---|
appid | 是 | 公众号的唯一标识 |
redirect_uri | 是 | 授权后重定向的回调链接地址, 请使用 urlEncode 对链接进行处理 |
response_type | 是 | 返回类型,只能填写code |
scope | 是 | 应用授权作用域 snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid) snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地等。并且即使在未关注的情况下,只要用户授权,也能获取其信息 ) |
state | 否 | 重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节 |
#wechat_redirect | 是 | 无论直接打开还是做页面302重定向时候,必须带此参数 |
第2步:用户授权
当我们点击授权页面URL时,会出现以下授权页面

该页面由认证服务器提供,认证服务器会告诉用户该第三方在认证服务器中提交的相关信息,以及授权后第三方应用能够获取哪些资源。在微信中,最基础的认证可以访问用户的公共信息。
第3步:返回用户授权码(Code)
当用户同意授权后,认证服务器将生成一个用户授权码(Code),此时认证服务器如何将用户授权码(Code)传递给第三方应用呢?
当我们向认证服务器提交应用信息时,通常需要填写一个redirect_uri,在微信公众号的接口权限中

点击修改(授权回调域名配置规范为全域名并且不带http)

在第1步中,当我们引导用户进入授权页面时,也会附带一个redirect_uri的信息。当认证服务器验证两个域名一致或在该域名的子域名下,便会通知浏览器跳转到redirect_uri,同时会在后面附加用户授权码(code)的相关信息。授权后访问的redirect_uri如下:
//xxx.com/oauth2?code=0217LHck2XfL3D0sbVfk2cFIck27LHcB&state=
注意:code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期。
第4步:换取网页授权access_token
要拿到认证服务器的授权,大致都需要以下几个信息:
client_id 标识第三方应用的id,由认证服务器(微信)在第三方应用提交时颁发给第三方应用
client_secret 第三方应用和认证服务器之间的安全凭证,由认证服务器(微信)在第三方应用提交时颁发的
code 第3步中认证服务器返回的授权码
state 由开发者给出的随机码,可选项
在微信中请求方法为
https:/
当认证服务器拿到上述中的所有信息,验证通过后,会将access_token返回给第三方应用。
注意:由于微信公众号的secret和获取到的access_token安全级别都非常高,必须只保存在服务器,不允许传给客户端。后续刷新access_token、通过access_token获取用户信息等步骤,也必须从服务器发起。
第5步:请求访问用户资源
拿到网页授权验证凭证(access_token)后,剩下的事情就很简单了,资源服务器会提供一系列关于用户资源的API,拿验证凭证(access_token)访问相应的API即可。
例如,在微信中,通过网页授权access_token、openid获取用户信息的请求方法:
//api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID
如果网页授权验证凭证(access_token)是正确的,此时资源服务器就会返回资源信息,此时整个OAuth2流程就结束了。
注:本文为Yolo原创,未经许可不得在任何平台转载,侵权必究。如需转载,可关注微信公众号:技术训练营,在后台留言,与作者联系,取得许可才能转载~
微信扫一扫,发现更精彩。