使用 Laravel Socialite 集成微信登录

Posted by

Laravel Socialite provides an expressive, fluent interface to OAuth
authentication with Facebook, Twitter, Google, LinkedIn, GitHub and
Bitbucket. It handles almost all of the boilerplate social
authentication code you are dreading writing.

不久之前 Dearmadman 曾写过一篇 使用 Laravel Socialite
集成微信登录
的文章,但是似乎还是有些同学不太明白,询问着如何集成 QQ
登录,那么,本篇我们就来剖析一下 Laravel Socialite
的详细内容。让各位同学都获得 Laravel Socialite 所提供的驱动适配能力。

Laravel Socialite 为第三方应用的 OAuth
认证提供了非常丰富友好的接口,我们使用它可以非常方便快捷的对类似微信、微博等第三方登录进行集成。

Laravel Socialite

Laravel Socialite 为第三方应用的 OAuth
认证提供了非常丰富友好的接口,我们使用它可以非常方便快捷的对类似微信、微博等第三方登录进行集成。

那么首先,你需要知道 Laravel Socialite 主要是用于那些 OAuth
授权登录的。这些场景下的第三方应用比如微信,QQ,微博等,都使用了 OAuth
协议为用户提供授权其它应用获取用户信息及权限的能力。

OAuth是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。

OAuth
允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据。每一个令牌授权一个特定的网站(例如,视频编辑网站)在特定的时段(例如,接下来的
2 小时内)内访问特定的资源(例如仅仅是某一相册中的视频)。这样,OAuth
让用户可以授权第三方网站访问他们存储在另外服务提供者的某些特定信息,而非所有内容。

Open Authorization

OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。

OAuth
允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据。每一个令牌授权一个特定的网站(例如,视频编辑网站)在特定的时段(例如,接下来的
2 小时内)内访问特定的资源(例如仅仅是某一相册中的视频)。这样,OAuth
让用户可以授权第三方网站访问他们存储在另外服务提供者的某些特定信息,而非所有内容。

我们的应用与使用 OAuth 标准的第三方应用的交互流程一般是这样的:

  • 展示跳转到第三方应用登录的链接
  • 用户点击链接跳转到第三方应用登录并进行授权
  • 在用户授权后第三方应用会跳转到我们所指定的应用回调资源地址并伴随用于交互
    AccessToken 的 Code
  • 我们的应用拿到 Code 后自主请求第三方应用并使用 Code 获取该用户的
    AccessToken
  • 获取 AccessToken
    之后的应用即可自主的从第三方应用中获取用户的资源信息

我们的应用与使用 OAuth 标准的第三方应用的交互流程一般是这样的:

详解

对于以上流程,我们来分析一下 Laravel Socialite
针对上面的每一步都做了些什么,我们将构建一个 QQProvider
来作为演示示例:

  • 展示跳转到第三方应用登录的链接
  • 用户点击链接跳转到第三方应用登录并进行授权
  • 在用户授权后第三方应用会跳转到我们所指定的应用回调资源地址并伴随用于交互
    AccessToken 的 Code
  • 我们的应用拿到 Code 后自主请求第三方应用并使用 Code 获取该用户的
    AccessToken
  • 获取 AccessToken
    之后的应用即可自主的从第三方应用中获取用户的资源信息

第三方应用的登录链接

显而易见的,第一步我们需要构建用于跳转到第三方登录的
URL,这里需要提供一些额外的参数来进行应用的识别,比如,当你为你的应用注册
QQ 登录网站接入应用时,QQ
互联会为你提供一组数据用来验证登录来源的合法性,通常这些关键数据为以下几项:

{
  appid: 'xxxxxxxxx',
  app_secret: 'xxxxxxxxx',
  redirect: 'xxxxxxxxxxx'
}

在 Laravel Socialite 中这些关键数据映射到了 AbstractProvider
顶级抽象中,你可以将这些配置项定义到 services.php 配置文件中:

'qq' => [
    'client_id' => 'your-qq-app-id',
    'client_secret' => 'your-qq-app-secret',
    'redirect' => 'http://your-callback-url',
],

我们将会在后续注册扩展驱动时使用这些配置。

如果需要为第三方应用登录构建自定义的驱动,那么你需要先继承
AbstractProvider,并且实现 ProviderInterface
接口,因为国内流行的应用都使用的 OAuth 2.0 协议,比如
QQ,就是使用的这种协议,所以我们需要继承
LaravelSocialiteTwoAbstractProvider 抽象类,并且实现
ProviderInterface 接口。

ProviderInterface 接口限定了两个方法: redirectuser,其中
redirect
方法就是返回构建后的跳转响应,用于跳转到第三方应用进行授权登录,而
user
方法就是用来在用户同意授权登录之后,获取第三方应用中用户的信息数据的。这些方法已经在
AbstractProvider 抽象类中提供了实现。所以基本上你不需要再去实现它。

Socialite 通过三个函数的配合来构造跳转 URL,它们分别是
getAuthUrlbuildAuthUrlFromBasegetCodeFields

  • getAuthUrl($state): 返回构造完成后的跳转 URL,它需要调用
    BuildAuthUrlFromBase
    函数,我们只需要在这里指定第三方应用所规定的应用登录授权的地址即可。
  • BuildAuthUrlFromBase($url, $state):
    它主要是为授权地址构建相应的查询参数,将驱动配置中的关键数据以及第三方应用所规定的数据填充到
    URL 中。在它的内部需要调用 getCodeFields
    函数,我们只需要在这里返回第三方应用所规定的应用登录授权的地址与查询参数合并即可。
  • getCodeFields($state = null):
    将驱动配置信息映射到第三方应用登录验证所需的参数中。

相关文章

Leave a Reply

电子邮件地址不会被公开。 必填项已用*标注