Laravel
框架在 PHP
以优雅著称,得到不少同行之人称赞;也招揽了,无数的第三方扩展包,扩展了框架的各个方面功能,本篇文章,采用 Socialite Providers,以开源中国 的OpenApi
实现的OAuth2
为例实现第三方登陆,体验 Laravel
之优雅。
Socialite
Socialite
是 Laravel
官方提供的实现 Oauth Client
的扩展包,用于实现各厂商提供的第三方登陆,并在其官方文档中有详尽的使用步骤描述,可点击以下链接查看:
Socialite
的使用十分方便,但其只提供了: Facebook、 Twitter、 LinkedIn、 Google、GitHub 和 Bitbucket 授权。并在在其 Github 上,标明 We are not accepting new adapters.
(我们不接受新的适配器),但是官方推荐采用由社区运营的 Socialite Providers
来实现其他厂商的社会化登陆。
Socialite Providers
Socialite Providers
是基于 Socialite
的一个第三方登陆扩展包,由社区运作;其通过 Laravel
的 Event
机制来注册适配器,现已实现 123
(撰文时数据)个不同厂商的第三方登陆,同时支持 OAuth 1 & OAuth 2
。
其中包括国内常见的: Weixin
,weibo
,qq
,douban
的适配器,我也已于前几日提交了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::class
到config\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
, 会在 OSChinaController
的 callback
方法,将用户的信息打印出来。