Laravel技巧库

实现QQ登陆,其他第三方登录的做法

此课程是收费课程,请先购买或加入会员后再访问。

数据已经拿到后,现在要做的就是将用户信息,存入数据库,先去新建一个migration,增加几个做第三方登录要用到的字段。

migration

php artisan make:migration add_socialites_to_users_table --table=users
class AddSocialitesToUsersTable extends Migration
{
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->string('provider')->nullable();
            $table->string('uid')->nullable();
            $table->string('avatar')->nullable();
        });
    }

    public function down()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->dropColumn('provider');
            $table->dropColumn('uid');
            $table->dropColumn('avatar');
        });
    }
}
字段 意义
provider 区分当前使用的登录服务,例如QQ登录,那就存成qq。如果是微博登录,那就存weibo
uid 保存第三方登录提供的唯一识别id
avatar 第三方登录提供的用户头像

确认没问题后,运行下migrate

php artisan migrate

controller

控制器中,现在就要来修改一下callback部分的方法了。先用providerqq去查询一下,有没有这个用户的信息,如果没有那就将用户信息插入到数据库中。

其中邮箱密码部分,我们直接生成一个假的给用户就好,这里如果不填写,数据库会报错的。
邮箱的生成规则是provider的名字和一个加号 这里是qq登录所以是qq+,再加上qq登录提供的唯一id,最后拼接上example.com
密码就是随机生成了一个10位数的密码。

完整代码

<?php

namespace App\Http\Controllers\Auth;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Socialite;
use App\User;
use Illuminate\Support\Str;
use Auth;

class SocialitesController extends Controller
{
    public function qq()
    {
        return Socialite::with('qq')->redirect();
    }

    public function callback()
    {
        $info = Socialite::driver('qq')->user();

        $user = User::where('provider', 'qq')->where('uid', $info->id)->first();
        if (!$user) {
            $user = User::create([
                'provider' => 'qq',
                'uid' => $info->id,
                'email' => 'qq+' . $info->id . '@example.com',
                'password' => bcrypt(Str::random(10)),
                'name' => $info->nickname,
                'avatar' => $info->avatar,
            ]);
        }

        //Auth::login($user);
        Auth::login($user, true);
        return redirect('/');
    }
}

model

模型部分,找到app/user.php,增加相关字段的白名单。

protected $fillable = [
    'name', 'email', 'password', 'provider', 'uid', 'avatar'
];