[教程] Laravel 下實現(xiàn) Google 2fa 兩步認證(雙因子驗證

image.png

轉(zhuǎn)自:[教程] Laravel 下實現(xiàn) Google 2fa 兩步認證(雙因子驗證

我最近在我工作的其中一個項目中實現(xiàn)了 雙因子認證. Antonio Ribeiro 是一個很好的包,使用它非常簡單實現(xiàn), 并且 Christopher Thomas 發(fā)布了一個很酷的策略. 讓我們來看看實現(xiàn)這些的具體步驟.

https://github.com/antonioribeiro/google2fa-laravel

1- 安裝google2fa-laravel

composer require pragmarx/google2fa-laravel

2- 生成二維碼

用戶首先需要的是一種激活或禁用多重要素驗證的方法鳍征。一種方法是開放一個profile/token的GET請求,它會向沒有私鑰的用戶渲染出激活視圖,向有私鑰的用戶渲染出禁用視圖.

<?php
namespace App\Http\Controllers\Profile;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Facades\PragmaRX\Google2FA\Google2FA;
class GoogleTokenController extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('auth');
    }
    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $user = auth()->user();
        if (is_null($user->google_token)) {
            return $this->showEnableTokenForm($user);
        }
        return view('app.profile.token.disable', ['user' => $user]);
    }
    
    /**
     * Show Form with Key and QRCode for the User to enable it.
     *
     * @param $user
     * @return mixed
     */
    private function showEnableTokenForm($user)
    {
        $key = Google2FA::generateSecretKey(64);
        $google2fa_url = Google2FA::getQRCodeGoogleUrl(
            'Application Name',
            $user->email,
            $key
        );
        return view('app.profile.token.enable', [
            'user' => $user,
            'key' => $key,
            'QRCode' => $google2fa_url
        ]);
    }
}

在方法 showEnableTokenForm 中,Google 2fa Facede將會生成密鑰及由密鑰生成的二維碼,用戶可以掃描二維碼得到秘鑰.
記得使用圖片標(biāo)簽展示二維碼.

<img src="{{ $QRCode }}" alt="">

3- 存儲/移除令牌

一旦用戶讀取二維碼,它們可以輸入一次性密碼并提交給應(yīng)用程序以驗證其是否激活.

<?php
/**
 * @param Request $request
 * @return \Illuminate\Http\RedirectResponse
 */
public function update(Request $request)
{
    if (is_null($request->get('token'))) {
        return $this->disableToken();
    }
    $secretKey = $request->get('secret');
    $token = $request->get('token');
    if (Google2FA::verifyKey($secretKey, $token)) {
        auth()->user()->update(['google_token' => $secretKey]);
        return redirect('/profile/token')->with('success', 'Google Token successfully enabled!');
    }
    return redirect('/profile/token')->withErrors(['error' => 'The provided token does not match.']);
}
/**
 * @return \Illuminate\Http\RedirectResponse
 */
private function disableToken()
{
    auth()->user()->update(['google_token' => null]);
    return redirect('/profile/token')->with('success', 'Google Token successfully removed!');
}

如果用戶提交了正確的一次性密碼, Google2FA 門面將會驗證并將這個秘鑰存儲在用戶表中.

4- 身份驗證方法

激活令牌之后, 下一步是在登錄進程中使用它。使用Laravel默認的身份驗證系統(tǒng), LoginController 自帶了一個 authenticated的方法用于觸發(fā)身份驗證之后的操作。 請求標(biāo)記的完美位置诗充。

<?php
    
protected function authenticated(Request $request, $user)
{
    if (is_null($user->google_token)) {
        return redirect()->intended($this->redirectTo);
    }
    Auth::logout();
    $request->session()->put('user-id', $user->id);
    return redirect('/token');
}

這個策略檢查通過身份認證的用戶是否擁有一個令牌和一個一次性的時間密碼顽频。如果令牌是空的,常規(guī)的行為是將應(yīng)用重定向到主頁骇陈。如果不是這樣的話宠页,用戶將被重定向到/token路由上左胞。

注意: 確保在users數(shù)據(jù)表中添加goole_oken列。

5- 登錄時請求一次性密碼

TokenController 將顯示一個簡單的視圖举户,輸入字段需要的一次性密碼烤宙。

在此視圖的表單提交中,目標(biāo)是檢索用戶并根據(jù)他們的谷歌令牌驗證他們的一次性密碼俭嘁。 如果匹配躺枕,則認證,否則再詢問。

<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Models\Main\Admin;
use Facades\PragmaRX\Google2FA\Google2FA;
use Illuminate\Http\Request;
class TokenController extends Controller
{
    public function index()
    {
        return view('auth.token');
    }
    public function authenticate(Request $request)
    {
        $user = Admin::findOrFail($request->session()->get('user-id'));
        $token = $request->get('token');
        if (Google2FA::verifyKey($user->google_token, $token)) {
            $request->session()->remove('user-id');
            
            auth()->loginUsingId($user->id);
            return redirect('/home');
        }
        return redirect('/token')->withErrors(['error' => __('Invalid Token')]);
    }
}

6- 結(jié)語

該軟件包使得在任何 Laravel 應(yīng)用程序中實現(xiàn)多因素身份驗證變得非常簡單屯远。 Google2FA Facade 專注于生成密鑰并在必要時進行驗證蔓姚,完美地處理這項工作捕虽。

另一個有意思的地方是使用 Auth Facade 在請求一次性密碼時強制注銷并且在令牌匹配時依靠 loginUsingId 的策略慨丐。

討論請前往:[教程] Laravel 下實現(xiàn) Google 2fa 兩步認證(雙因子驗證

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市泄私,隨后出現(xiàn)的幾起案子房揭,更是在濱河造成了極大的恐慌,老刑警劉巖晌端,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捅暴,死亡現(xiàn)場離奇詭異,居然都是意外死亡咧纠,警方通過查閱死者的電腦和手機蓬痒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來漆羔,“玉大人梧奢,你說我怎么就攤上這事⊙菅鳎” “怎么了亲轨?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長鸟顺。 經(jīng)常有香客問我惦蚊,道長,這世上最難降的妖魔是什么讯嫂? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任蹦锋,我火速辦了婚禮,結(jié)果婚禮上欧芽,老公的妹妹穿的比我還像新娘莉掂。我一直安慰自己,他們只是感情好渐裸,可當(dāng)我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布巫湘。 她就那樣靜靜地躺著,像睡著了一般昏鹃。 火紅的嫁衣襯著肌膚如雪尚氛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天洞渤,我揣著相機與錄音阅嘶,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛讯柔,可吹牛的內(nèi)容都是我干的抡蛙。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼魂迄,長吁一口氣:“原來是場噩夢啊……” “哼粗截!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起捣炬,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤熊昌,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后湿酸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體婿屹,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年推溃,在試婚紗的時候發(fā)現(xiàn)自己被綠了昂利。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡铁坎,死狀恐怖蜂奸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情厢呵,我是刑警寧澤窝撵,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站襟铭,受9級特大地震影響碌奉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜寒砖,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一赐劣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧哩都,春花似錦魁兼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至儒鹿,卻和暖如春化撕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背约炎。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工植阴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蟹瘾,地道東北人。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓掠手,卻偏偏與公主長得像憾朴,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子喷鸽,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 原文鏈接 必備品 文檔:Documentation API:API Reference 視頻:Laracasts ...
    layjoy閱讀 8,607評論 0 121
  • 必備品文檔:DocumentationAPI: API Reference視頻:Laracasts速查表:Lara...
    ethanzhang閱讀 5,746評論 0 68
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理众雷,服務(wù)發(fā)現(xiàn),斷路器魁衙,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • 簡介 laravel 使實施認證的變得非常簡單报腔,事實上,它提供了非常全面的配置項以適應(yīng)應(yīng)用的業(yè)務(wù)剖淀。認證的配置文件存...
    Dearmadman閱讀 6,132評論 2 13
  • 每天必須做的 1.總結(jié)自己一天的任務(wù)完成情況 2.考慮明天應(yīng)該做的主要工作 3.了解至少一個門店基本情況或進行相應(yīng)...
    張勇飛閱讀 203評論 0 0