JeffreyBool
阅读 98
测试

安装 socialiteproviders

socialiteproviders 为 Laravel Socialite 提供了更多的第三方登录方式,基本上你需要的,都能在这里找到。这个组件方便我们完成整个 OAuth 流程,不过对于我们开发接口来说,只用到了它部分的功能。 首先找到 微信的provider,一步步完成安装。

$ composer require socialiteproviders/weixin

微信登录微信登录

可以省略 ServiceProvider 的设置。

设置 EventServiceProvider

app/Providers/EventServiceProvider.php

 .
 .
 .
    protected $listen = [
        \SocialiteProviders\Manager\SocialiteWasCalled::class => [
            // add your listeners (aka providers) here
            'SocialiteProviders\Weixin\WeixinExtendSocialite@handle'
        ],
        Registered::class => [
            SendEmailVerificationNotification::class,
        ],

        \Illuminate\Auth\Events\Verified::class => [
            \App\Listeners\EmailVerified::class,
        ],
    ];

.
.
.

好了,暂时只需要这两步,我们就能开始使用了。

功能调试

还记得上一章我们提到,客户端可能有两种实现方式, 我们先分别了解一下这两种情况,服务器端该如何处理。

1). 客户端已经获取 access_token

因为客户端已经获取了 access_token,需要将 access_token 发给服务器,服务器通过 access_token 获取用户信息,如果成功的换取了用户信息则说明 access_token 正确,用户微信登录成功。

打开 tinker 开始调试

$ php artisan tinker

我们上一章已经讲解了如何通过 微信开发者工具 获取一个可用的 access_token,现在我们申请一个 access_token,然后在 tinker 中输入如下代码,将 ACCESS_TOKEN 替换为你自己的。

$accessToken = 'ACCESS_TOKEN';
$driver = Socialite::driver('weixin');
$oauthUser = $driver->userFromToken($accessToken);

将以上代码贴到 Tinker 里执行:

filefile

我们看到报错了,这里是因为微信的流程中换取用户信息的接口,需要我们同时提交 access_tokenopenidfile

执行如下代码,替换 OPEN_ID 为你自己的

$accessToken = 'ACCESSTOKEN';
$openID = 'OPENID';
$driver = Socialite::driver('weixin');
$driver->setOpenId($openID);
$oauthUser = $driver->userFromToken($accessToken);

将以上代码贴到 Tinker 里执行:

filefile

请求成功,获取了用户信息

只有微信获取用户信息需要同时使用 access_tokenopenid ,如果你开发的是微博等其他的第三方登录,并不需要 $driver->setOpenId($openID); 这一步。

2). 客户端只获取授权码(code)

这种方式是推荐的安全做法,客户端不保存 app_secret,获取到授权码后就提交给服务器,服务器完成换取 access_token 及换取用户信息的流程。 使用这种方式,首先需要在服务端配置 app_idapp_secret,修改如下

config/services.php

.
.
.
	'weixin' => [
		'clientid' => env('WEIXINKEY'),
		'clientsecret' => env('WEIXINSECRET'),
		'redirect' => env('WEIXINREDIRECTURI'),  
	], 
.
.
.

.env

.
.
.
# socialite weixin
WEIXINKEY=wx353901f6*****
WEIXINSECRET=d4624c36b6795d1d9******

注意将 WEIXIN_KEYWEIXIN_SECRET 替换为你自己的 appIdappsecret

不要忘记修改 .env.example

.
.
.
# socialite weixin
WEIXINKEY=
WEIXINSECRET=

打开 tinker

$ php artisan tinker

通过 微信开发者工具 获取一个 code,执行如下代码,将 CODE 替换成你自己的

$code = 'CODE';
$driver = Socialite::driver('weixin');
$response = $driver->getAccessTokenResponse($code);
$driver->setOpenId($response['openid']);
$oauthUser = $driver->userFromToken($response['access_token']);

将以上代码贴到 Tinker 里执行:

filefile

可以看到,我们通过授权码,成功获取了 access_tokenopenid,然后换取了用户信息。

出于安全的考虑,授权码只能使用一次!!!请不要重复使用同一个 Code 进行调试,如果你调试中报错了,可以打印一下 $responsecode been used, hints 就说明 Code 已经使用过了。

第三方登录处理流程

最终服务器获取了用户在微信的用户信息,这一点很重要,无论使用上面哪种方式,都一定要保证用户数据是服务器自己通过 access_token 获取的,还有这样才能验证客户端提交数据( code 或 access_token )的真实性。获取到的用户数据如下

user: [
   "openid" => "xxxxxxx",
   "nickname" => "xxx",
   "sex" => 1,
   "language" => "zh_CN",
   "city" => "成都",
   "province" => "四川",
   "country" => "中国",
   "headimgurl" => "avatar",
   "privilege" => [],
   "unionid" => "xxxxxx",
 ]

现在两种情况

  1. 用户第一次使用微信登录,根据微信的数据,在 Larabbs 中创建一个用户,返回该用户的登录凭证

  2. 用户已经使用过微信登录,则找到数据库中对应的用户,返回该用户的登录凭证

那么如何来分辨用户是否已存在,就需要一个用户的唯一标识。任何一个第三方平台,返回的用户信息都会有一个唯一标识,socialite 已经为我们封装好了,直接使用 $oauthUser->getId() 即可获取,对于微信来说,这个唯一标识叫做 openid。不过微信还有一个 unionid 的概念,大家可以看一下 这里 的回答。

微信关于unionid的解释

如果开发者拥有多个移动应用、网站应用、和公众帐号(包括小程序),可通过 unionid 来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序),用户的 unionid 是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionid 是相同的。

所以我们的处理如下

  • 根据用户的 openid/unionid 查找数据库中已存在的用户

  • 用户存在,返回该用户的登录凭证

  • 用户不存在,根据微信信息创建用户,返回该用户的登录凭证

提交代码

下一节我们完成代码的开发, 先提交一下代码

$ git add -A
$ git commit -m "add socialiteproviders"
关注下面的标签,发现更多相似文章
评论
相关推荐
测试图片

...

js正则校验,match和test的区别

test()var str='sad13123dfa4v564d5f8fb5sf'; var re=/\d+/g; alert(re.test(str));// 返回布尔值,是否匹配正...

这是一篇文章

this is a blog这是二级标题不错的博客...

手摸手教你撸一个form表单自动收集校验装饰器

项目环境搭建 create-react-app 需要eject后支持decorator装饰器语法 没了 npx create-react-app fakeAntdFormDemo cd fakeAnt...

test

sss...

测试评论开始

(毕设项目)Vue+Go前端后端一体化 企业级微服务网关项目完整无密云盘分享图片 (毕设项目)Vue+Go前端后端一体化 企业级微服务网关项目 【点击下载】不管是基于Java、Python、PHP,还...

测试评论出入参数

准备开始...

测试

测试...

测一测

优点:前端耗时少。因为后端拼接完了html,浏览器只需要直接渲染出来。有利于SEO(搜索引擎优化)。因为在后端有完整的html页面,所以爬虫更容易爬取获得信息,更有利于seo。无需占用客户端资源。即解...

测试

安装 socialiteproviderssocialiteproviders 为 Laravel Socialite 提供了更多的第三方登录方式,基本上你需要的,都能在这里找到。这个组件方便我们完成...

(毕设项目)Vue+Go前端后端一体化 企业级微服务网关项目完整无密云盘分享

(毕设项目)Vue+Go前端后端一体化 企业级微服务网关项目 【点击下载】不管是基于Java、Python、PHP,还是基于Go的网站,网站流量越高,对网关性能要求越高,尤其是亿级流量网站中,网关更是...

2020最新慕课网全站课程分享实战就业班全部都有云盘链接分享

*2020 慕课网所有课程全部都有,百分百高清原画,所有课程全部包含课件源码,完整无密,百度网盘链接分享,官方同步永久包更新! *官方品质,信誉保障!所有课程全部支持试看任何章节! *【点击下载】 *...

Node.js+Koa2+MySQL打造前后端分离精品项目《旧岛》完整无密 云盘分享

Node.js+Koa2+MySQL打造前后端分离精品项目《旧岛》完整无密 【点击下载】Nodejs逐渐成为前端同学进阶的必修技术之一,本课程将带大家从0到1开发一个前后端分离的精品项目《旧岛》,手把...

Learn Go in Y Minutes

转自:https://learnxinyminutes.com/docs/zh-cn/go-cn/ 发明 Go 语言是出于更好地完成工作的需要。Go 不是计算机科学的最新发展潮流,但它却提供了解决现实...

实战企业级项目 践行App重构之路

实战企业级项目 践行App重构之路 完整无密 随着企业级App功能不断累加强大,App代码质量下降、设计缺陷、难以维护、迭代困难等问题越来越突出,App的重构迭代已经成为Android工程师急需解决的...

你好,米粒

米粒小米粒小小米粒其实有时候很孤单...

大学计算机必修课新讲--编译原理+操作系统+图形学

大学计算机必修课新讲--编译原理+操作系统+图形学 无密 [【点击下载】](http://www.97yrbl.com/t-310.html)编译原理,操作系统,图形学被称为程序员的三大浪漫,不仅因为...

2020最新慕课网全站课程完整无密网盘分享

*2020 慕课网所有课程全部都有,百分百高清原画,所有课程全部包含课件源码,完整无密,百度网盘链接分享,官方同步永久包更新!*官方品质,信誉保障!所有课程全部支持试看任何章节!*下载地址:&nbsp...

asdfasdfasdf

asdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdf ~asdfasdfasdfasdfsadfasdfffffffffffffff...

asdfasdfasdf

tttttt...