Laravel 第三方登陆之 Socialite Providers

Stella981
• 阅读 704

Laravel 框架在 PHP 以优雅著称,得到不少同行之人称赞;也招揽了,无数的第三方扩展包,扩展了框架的各个方面功能,本篇文章,采用 Socialite Providers,以开源中国OpenApi 实现的OAuth2 为例实现第三方登陆,体验 Laravel 之优雅。

Socialite

SocialiteLaravel 官方提供的实现 Oauth Client 的扩展包,用于实现各厂商提供的第三方登陆,并在其官方文档中有详尽的使用步骤描述,可点击以下链接查看:

Socialite 的使用十分方便,但其只提供了: Facebook、 Twitter、 LinkedIn、 Google、GitHub 和 Bitbucket 授权。并在在其 Github 上,标明 We are not accepting new adapters. (我们不接受新的适配器),但是官方推荐采用由社区运营的 Socialite Providers 来实现其他厂商的社会化登陆。

Socialite Providers

Socialite Providers 是基于 Socialite 的一个第三方登陆扩展包,由社区运作;其通过 LaravelEvent 机制来注册适配器,现已实现 123 (撰文时数据)个不同厂商的第三方登陆,同时支持 OAuth 1 & OAuth 2

其中包括国内常见的: Weixinweiboqqdouban 的适配器,我也已于前几日提交了oschina 的适配器,并已于今日通过审核合入主干:Added OSChina oAuth2 Provider

主页:https://socialiteproviders.netlify.com

Github:https://github.com/SocialiteProviders

OSChina: https://github.com/SocialiteProviders/OSChina

具体步骤

新建 Laravel 项目

composer create-project --prefer-dist laravel/laravel blog

本篇文章适合已经对 Laravel 框架有所了解的读者,具体安装,请见安装

引入扩展包

composer require socialiteproviders/oschina

注册服务

当扩展包引入完成后,在项目配置文件中添加 \SocialiteProviders\Manager\ServiceProvider::class 服务,如果你曾增加 Laravel\Socialite\SocialiteServiceProvide 服务(Socialite 扩展注册的),请移除:

  • 移除 config\app.php 文件中, providers[] 数组里的 Laravel\Socialite\SocialiteServiceProvider (如果有的话)。

  • 添加 \SocialiteProviders\Manager\ServiceProvider::classconfig\app.php 文件中的 providers[] 数组里。

    'providers' => [
        // a whole bunch of providers
        // remove 'Laravel\Socialite\SocialiteServiceProvider',
        \SocialiteProviders\Manager\ServiceProvider::class, // add
    ];
    

添加事件监听

在项目 app/Providers/EventServiceProvider.php 文件的 protected $listen 数组属性中,添加 \SocialiteProviders\Manager\SocialiteWasCalled::class 事件,并为其添加对应适配器的监听器 \SocialiteProviders\OSChina\OSChinaExtendSocialite::class (oschina 对应的是这个,可也可以添加多个对应的适配器提供的监听器)。

    /**
     * The event listener mappings for the application.
     *
     * @var array
     */
    protected $listen = [
        // 第三方登陆
        \SocialiteProviders\Manager\SocialiteWasCalled::class => [
            \SocialiteProviders\OSChina\OSChinaExtendSocialite::class
        ],
    ];

注册监听器时,请确保已经安装对应的适配器包,否则可能找不到对应的事件监听器。

添加配置

请确保您已在 应用管理 页面创建应用,并取得对应的相关:应用ID应用私钥回调地址,配置中需要用到。

请在配置文件 config/services.php 中添加对应的信息:

    'oschina' => [
        'client_id' => env('OSCHINA_KEY'),
        'client_secret' => env('OSCHINA_SECRET'),
        'redirect' => env('OSCHINA_REDIRECT_URI')
    ],

为了调试和安全,这里我将具体的配置信息,放在 .env 文件中了,您可根据实际情况修改。

同时请注意 Laravel 的配置缓存 php artisan config:cache; 如果您通过 php artisan server,还需要重启命令。

新建控制器

app\Http\Controllers\Auth 新建控制器 OSChinaController.php 文件:

<?php
/**
 * Created by PhpStorm.
 * User: dingdayu
 * Date: 2019/1/11
 * Time: 01:07
 */

namespace App\Http\Controllers\Auth;


use App\Http\Controllers\Controller;
use Laravel\Socialite\Facades\Socialite;

/**
 * 开源中国授权
 *
 * Class OSChinaController
 * @package App\Http\Controllers\Auth
 */
class OSChinaController extends Controller
{

    /**
     * 跳转至第三方登陆
     *
     * @return mixed
     */
    public function redirect()
    {
        // return \Socialite::with('oschina')->scopes(array('email'))->redirect();
        return Socialite::with('oschina')->redirect();
    }

    /**
     * 第三方登陆回跳
     */
    public function callback()
    {
        $oauthUser = Socialite::with('oschina')->user();

        var_dump($oauthUser->getId());
        var_dump($oauthUser->getNickname());
        var_dump($oauthUser->getName());
        var_dump($oauthUser->getEmail());
        var_dump($oauthUser->getAvatar());
    }
}

添加跳转路由

Route::prefix('auth')->namespace('Auth')->group(function () {
    // 开源中国
    Route::get('oschina', 'OSChinaController@redirect');
    Route::get('oschina/callback', 'OSChinaController@callback');

    // QQ
    //Route::get('qq', 'QQController@redirect');
    //Route::get('qq/callback', 'QQController@callback');
});

QQ 是QQ登录的路由

验证

访问:

http://host/oauth/oschina

请替换 host

如果前面配置没有问题,并且项目安装没有问题,此时应该会跳转至 oschina 的授权询问页面,会显示需要授权的列表,点击 连接 回跳转回刚才的网站,http://host/oschina/callback, 会在 OSChinaControllercallback 方法,将用户的信息打印出来。

相关文章推荐

  1. Laravel5.1 实现第三方登录认证(包括微博、QQ、微信、豆瓣)
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Easter79 Easter79
3年前
swap空间的增减方法
(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这