当前位置: 首页博文详情
Laravel社会化登录
宁夏
2019年5月5日
1175 阅读
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('/')));
}
} 上一篇: 没有了
下一篇: 没有了