专栏首页超维编程Laravel中实现微信QQ等第三方登录

Laravel中实现微信QQ等第三方登录

Laravel 简介

Laravel 是 Taylor Otwell 开发的一款基于 PHP 语言的 Web 开源框架,采用了 MVC 的架构模式,在 2011 年 6 月正式发布了首个版本。由于 Laravel 具备 Rails 敏捷开发等优秀特质,深度集成 PHP 强大的扩展包(Composer)生态与 PHP 开发者广大的受众群,让 Laravel 在发布之后的短短几年时间得到了极其迅猛的发展,Laravel 在国内的生态圈发展也日趋成熟,你可以很轻松的在网上找到很多 Laravel 相关的中文学习资料、技术讨论社区。

除了传统的基于表单的登录认证外,Laravel 还可以通过 Laravel Socialite 提供 OAuth 认证,目前支持的认证驱动包括 Google,GitHub ,微信,QQ和微博等等。

注:其他平台的驱动可以在 Socialite 提供者网站上找到。(https://socialiteproviders.netlify.com)

由于微信审核时间比较长流程繁琐,QQ正在审核中,我们以微博为例,我们可以不进行审核等操作,就会得到一个 App Key 和一个 App Secret。

微博开发者申请

  • 首先到新浪微博申请加入开发者:http://open.weibo.com/
  • 右上角登录,登录后点击右上角头像,选第一个编辑开发者信息并提交审核
  • 然后导航栏 微连接 -> 网站接入 -> 立即接入,添加一个应用
  • 导航栏,我的应用 -> 应用信息 -> 高级信息

安装

要使用 Socialite,首先需要通过 Composer 安装扩展包:

composer require laravel/socialite
composer require socialiteproviders/weibo

服务提供者

//文件 Service Provider config/app.php
'providers' => [
    // a whole bunch of providers
    // remove 'Laravel\Socialite\SocialiteServiceProvider',
    \SocialiteProviders\Manager\ServiceProvider::class, // add
];

事件处理器

 //文件 app/Providers/EventServiceProvider.php
 protected $listen = [
        'SocialiteProviders\Manager\SocialiteWasCalled' => [
            'SocialiteProviders\Weibo\WeiboExtendSocialite@handle',
        ],
    ];

配置设置

在使用 Socialite 之前,还需要为应用用到的 OAuth 服务添加认证信息,这些认证信息位于配置文件 config/services.php,而且对应 key 必须为googlegithub、微信、QQ或微博 配置哪些 key 取决于应用需要的提供者。例如微博:

'weibo' => [
    'client_id' => env('WEIBO_KEY'),
    'client_secret' => env('WEIBO_SECRET'),
    'redirect' => env('WEIBO_REDIRECT_URI'),  
],

.env

WEIBO_KEY=3846771453
WEIBO_SECRET=6058d5959344be14b5dfce
WEIBO_REDIRECT_URI=https://blog.blumer.cn/auth/weibo/callback

路由

Route::get( '/auth/{social}', 'Web\AuthenticationController@getSocialRedirect' )
      ->middleware('guest');
Route::get( '/auth/{social}/callback', 'Web\AuthenticationController@getSocialCallback' )
      ->middleware('guest');

控制器

public function getSocialRedirect($account)
{
    try {
        return Socialite::with($account)->redirect();
    } catch (\InvalidArgumentException $e) {
        return redirect('/login');
    }
}
public function getSocialCallback($account)
{
    // 从第三方 OAuth 回调中获取用户信息
    $socialUser = Socialite::with($account)->user();
    // 在本地 users 表中查询该用户来判断是否已存在
    $user = User::where( 'provider_id', '=', $socialUser->id )
        ->where( 'provider', '=', $account )
        ->first();
    if ($user == null) {
        // 如果该用户不存在则将其保存到 users 表
        $newUser = new User();
        
        $newUser->name = $socialUser->getName();
        $newUser->email = $socialUser->getEmail() == '' ? '' : $socialUser->getEmail();
        $newUser->avatar = $socialUser->getAvatar();
        $newUser->password = '';
        $newUser->provider = $account;
        $newUser->provider_id = $socialUser->getId();
        
        $newUser->save();
        $user = $newUser;
    }
    // 手动登录该用户
    Auth::login( $user );
    // 登录成功后将用户重定向到首页
    return redirect('/');
}

成功展示

错误解决

//此异常的语义就是不能为空的字段 ‘name’ 被赋予了空值,我们 dd 查看下:
dd($socialUser);

果然,从微博调取的我的用户信息'name'为空,更改控制器回调方法的代码

 $newUser->name = $socialUser->getName(); //Github登录没问题,微博不可以

如果 name(用户名)为空,则使用nickname(昵称),三元表达式:

$newUser->name = $socialUser->getName() == '' ? $socialUser->getNickname():$socialUser->getName();

本文分享自微信公众号 - LAMPer 技术栈(lamp_tech_stack),作者:蓝默空间

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-08-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何用一条命令将网页转成电脑 App

    大家有没有一种感觉,很多网站其实做得非常优秀,但是它们就是没有开发 PC (电脑)版的客户端,比如知乎、GitHub、微信公众号。

    蓝默空间
  • 安装群晖NAS之预热篇

    本文章部分片段摘取自网络,如有侵权与我联系!本文旨在学习探讨所用,请尊重知识产权,支持正版!

    蓝默空间
  • 安装群晖NAS之二:虚拟化安装及相关配置

    家里有一台闲置PC,计划将PC里的下载的视频离线下载到PC,在内网和公网上访问,并实现远程管理,NAS是比较不错的选择,其实我早就心痒痒,想体验下NAS的诸多神...

    蓝默空间
  • 让解一元二次方程更容易,美国奥数国家队教练建议用新方法,还能帮助简化代码

    相信很多人在初中学习它的时候都很痛苦,因为这个公式实在有点难记。即使你到今天能够记得,还能回忆起当初的推导过程吗?

    量子位
  • 详解:37 text-align-last的案例

    用户7873631
  • 利用Docker开启持续交付之路

    持续交付即Continuous Delivery,简称CD,随着DevOps的流行正越来越被传统企业所重视。持续交付讲求以短周期、小细粒度,自动化的方式频繁...

    小小科
  • iOS9.1终于可以关闭讨厌的300ms延迟了

    https://developer.apple.com/library/prerelease/mac/releasenotes/General/WhatsNew...

    libo1106
  • HUST 1555 A Math Homework

    1555 - A Math Homework 时间限制:1秒 内存限制:128兆 338 次提交 131 次通过 题目描述 QKL is a poor a...

    Angel_Kitty
  • 非常简单的一个smtp邮箱发信案例

    Youngxj
  • HTTP和HTTPS的区别

    HTTP:是网络上应用尤为普遍的一种通信协议,是一个客户端和客户端请求和应答的国际标准(IP),用于从WWW客户端数据传输超文本到本地IE的数据传输协议。它可以...

    小白程序猿

扫码关注云+社区

领取腾讯云代金券