当前位置: 首页博文详情
Laravel社会化登录
宁夏
2019年5月5日
884 阅读
laravel框架实现社会化登录(以QQ登录为例)
1、安装依赖
composer require socialiteproviders/qq
2、注册服务(config/app.php)
'providers' => [ // ... SocialiteProviders\Manager\ServiceProvider::class ];
3、添加门面类(config/app.php)
'Socialite' => Laravel\Socialite\Facades\Socialite::class,
4、事件监听(App/Providers/EventServiceProvider)
/** * The event listener mappings for the application. * * @var array */ protected $listen = [ 'SocialiteProviders\Manager\SocialiteWasCalled' => [ 'SocialiteProviders\QQ\QqExtendSocialite@handle', ], ];
5、配置接口信息
①config/service.php
'qq' => [ 'client_id' => env('QQ_KEY'), 'client_secret' => env('QQ_SECRET'), 'redirect' => env('QQ_REDIRECT_URI'), ],
②.env
QQ_KEY=101551888 QQ_SECRET=f12bfd04940f785e878a53419f738888 QQ_REDIRECT_URI=http://www.zlmspace.com/auth/user/handleProviderCallback/qq
6、添加路由
// 第三方登录认证 Route::get('redirectToProvider/{service}', 'UserController@redirectToProvider'); // 第三方登录回调 Route::get('handleProviderCallback/{service}', 'UserController@handleProviderCallback');
7、控制器登录代码
<?php namespace App\Http\Controllers\Auth; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use App\Http\Controllers\Controller; use Laravel\Socialite\Facades\Socialite; use Illuminate\Support\Facades\URL; use App\Models\User; use GuzzleHttp\Client; use GuzzleHttp\Exception\ClientException; class UserController extends Controller { use AuthenticatesUsers; /** * 第三方登录 * @param string $service * @return mixed */ public function redirectToProvider($service) { return Socialite::driver($service)->redirect(); } /** * 登录回调 * @param string $service * @param Request $request * @param User $user * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @throws \GuzzleHttp\Exception\GuzzleException */ public function handleProviderCallback($service, Request $request, User $user) { // 第三方用户信息 $oUser = Socialite::driver($service)->user(); // 检查此用户是否已经登录过 $where = [ 'type' => $service, 'openid' => $oUser->id ]; $oldUser = $user->where($where)->first(); // 如果已经存在,则更新用户资料 ,如果不存在,则插入数据 $userId = $oldUser ? $oldUser->id : 0; if ($oldUser) { // 用户被设置禁止登录时 if (!$oldUser->status) { return redirect(session('back_url', url('/'))); } $data = [ 'nickname' => $oUser->nickname, 'access_token' => $oUser->token, 'last_login_ip' => $request->getClientIp(), 'login_times' => $oldUser->login_times + 1, ]; } else { $data = [ 'type' => $service, 'nickname' => $oUser->nickname, 'openid' => $oUser->id, 'access_token' => $oUser->token, 'last_login_ip' => $request->getClientIp(), 'login_times' => 1, 'is_admin' => 0, 'email' => '' ]; } // 下载最新的头像到本地 $avatarPath = 'images/avatar/' . $oUser->id . '.jpg'; try { $client = new Client(); $client->request('GET', $oUser->avatar, [ 'sink' => $avatarPath ]); } catch (ClientException $e) { // 如果下载失败,则使用默认图片 copy('images/avatar/default.jpg', $avatarPath); } $data['avatar'] = '/' . $avatarPath; // 更新数据 $userId = $user->storeData($userId, $data, $user); // 登录 Auth::guard('user')->loginUsingId($userId, true); // 如果是管理员则自动后台登录 if ($oldUser != null && $oldUser->is_admin) { Auth::guard('admin')->loginUsingId(1, true); } return redirect(session('back_url', url('/'))); } }
上一篇: 没有了
下一篇: 没有了