Laravel实现基于 Github 的用户认证
2022-02-07 22:56 / 浏览量:1541

笔者使用的框架为laravel,所以将在其基础上安装 Laravel Socialite 扩展包来实现基于 Github 进行登录认证


一、准备工作

1.安装 Laravel Socialite

composer require laravel/socialite

2.配置 Github 认证

首先登录到 Github 并访问这个页面:https://github.com/settings/developers,点击「New OAuth App」注册一个新 OAuth App:


这里授权回调地址Authorization callback URL,我们先设置为https://www.xxx.com/auth/github/callback,后面可以直接使用。image.png

image.png

注册成功之后,即可在跳转后页面看到 Client ID 及 点击Generate a new client secret生成的Client Secret 信息(请妥善保管首次生成的Client Secret):image.png将新增应用的 Client ID、Client Secret 信息添加到应用根目录下 .env 配置文件中:

GIT_CLIENT_ID=你的 Github 应用 Client ID
GIT_CLIENT_SECRET=你的 Github 应用 Client Secret

然后在 config/services.php 配置文件中新增如下配置

'github' => [      
'client_id' => env('GITHUB_CLIENT_ID'),      
'client_secret' => env('GITHUB_CLIENT_SECRET'),      
'redirect' => env('APP_URL', 'http://localhost').'/auth/github/callback'
],

3.数据表

执行下列语句生成 github_users 数据表database文件

php artisan make:migration create_github_users_table

github_users文件 完整内容

 Schema::create('github_users', function (Blueprint $table) { 
   $table->bigId(); 
   $table->unsignedBigInteger('user_id')->default(0); 
   $table->string('token', 64)->default('')->commit('token'); 
   $table->unsignedInteger('github_id')->default(0)->commit('github ID'); 
   $table->string('name')->default(''); 
   $table->string('email')->default(''); 
   $table->string('avatar')->default(''); 
   $table->string('client_id', 64)->default('')->comment('GITHUB_CLIENT_ID'); 
   $table->timestamps(); 
  });

执行下列语句,生成数据表

php artisan migrate

至此,就完成了基于 Github 登录所需的所有准备工作


二、实现基于 Github 进行登录认证

接下来我们来编写基于 Github 的认证逻辑实现代码,我们为其编写路由和控制器。

首先创建一个控制器 /app/Http/Controllers/Account/GithubLoginController.php:

<?php
namespace App\Http\Controllers\Auth;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Laravel\Socialite\Facades\Socialite;
class GithubLoginController extends Controller{
}

在 routes/web.php 中注册路由

Route::get('/auth/github/redirect', 'GithubLoginController@redirect');
Route::get('/auth/github/callback', 'GithubLoginController@callback');

具体的实现逻辑,更详细的请根据业务场景完善。

function redirect(){    
 return Socialite::driver('github')->redirect();
}
function callback(){    
 // 从第三方 OAuth 回调中获取用户信息    
 $user = Socialite::driver('github')->user();    
 // 查询或插入数据表github_users    
 return $user->getNickname();    
 // OAuth 2.0 providers...    
 $token = $user->token;    
 $refreshToken = $user->refreshToken;    
 $expiresIn = $user->expiresIn;    
 // OAuth 1.0 providers...    
 $token = $user->token;    
 $tokenSecret = $user->tokenSecret;    
 // All providers...    
 $user->getId();    
 $user->getNickname();    
 $user->getName();    
 $user->getEmail();    
 $user->getAvatar();
}

至此,我们已经完成了基于 Socialite 提供的第三方 OAuth 服务实现用户登录认证的所有安装配置和逻辑代码编写,接下来我们就可以访问 https://www.xxx.com/auth/github/redirect,点击页面上的授权按钮:

image.png

即可获取到github提供的用户基本信息。

image.png

至此,已基本阐明了github认证的流程,其余的视图和用户关联逻辑则使用场景可自由定义,你可以直接根据github生成一个新的用户,也可以只保留GitHub信息并要求绑定已有账号。