当前位置:  首页博文详情

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('/')));
    }

}

上一篇: 没有了

下一篇: 没有了

标签云

站点信息

  • 文章统计:11 篇
  • 标签统计:3 个