Passport 授權(quán)碼模式

交流群 375462817
視頻教程 https://space.bilibili.com/476513143

授權(quán)碼模式

  1. 嗶哩嗶哩提供一個“微信登陸”的鏈接岛宦,用戶點擊跳轉(zhuǎn)到微信授權(quán)服務(wù)器。
  2. 用戶根據(jù)微信授權(quán)服務(wù)器提示登陸微信并確認授權(quán)給嗶哩嗶哩污它。
  3. 微信授權(quán)服務(wù)器返回用戶代理(瀏覽器)一個授權(quán)碼。
  4. 用戶代理(瀏覽器)把這個授權(quán)碼傳給嗶哩嗶哩扔水。
  5. 嗶哩嗶哩憑借授權(quán)碼向微信授權(quán)服務(wù)器請求令牌廷没。
  6. 微信授權(quán)服務(wù)器發(fā)送令牌給嗶哩嗶哩。

服務(wù)器端(微信)

配置

composer create-project --prefer-dist laravel/laravel laravel6
.env 數(shù)據(jù)庫配置
修改數(shù)據(jù)庫默認字符串長度
composer require laravel/passport
Laravel\Passport\HasApiTokens Trait 添加到 App\User 模型中 // 提供一些輔助函數(shù)檢查已認證用戶的令牌和使用范圍

安裝前端必備的東西(腳手架)

下載 node   https://nodejs.org/en/
composer require laravel/ui
php artisan ui vue --auth
npm install cnpm -g --registry=https://registry.npm.taobao.org
cnpm install
cnpm run prod
composer require guzzlehttp/guzzle // 偽造 http 請求
// config/auth.php

'api' => [
    'driver' => 'passport',
    'provider' => 'users',
    'hash' => false,
],
php artisan migrate // 創(chuàng)建表來存儲客戶端和 access_token 等
php artisan passport:keys // 加密生成的 access_token
// 注冊路由 AuthServiceProvider
Passport::routes();
Passport::tokensExpireIn(now()->addDays(15)); // access_token 過期時間
Passport::refreshTokensExpireIn(now()->addDays(60)); // refresh_token 過期時間

創(chuàng)建客戶端

php artisan passport:client

第三方應(yīng)用程序(bilibili)

準備

composer create-project --prefer-dist laravel/laravel laravel6
composer require guzzlehttp/guzzle // 偽造 http 請求

web.php

<?php

$clientId = 1;
$clientSecret = '8sGiTDgHb69Y6nTiFImTJO32jm3jB7x2BzMxrhDF';

// bili 登錄頁面
Route::view('/login', 'login');


// 第三方登陸径荔,重定向
Route::get('/lishen/login',
    function (\Illuminate\Http\Request $request) use ($clientId) {
        $request->session()->put('state', $state = Str::random(40));

        $query = http_build_query([
            'client_id' => $clientId,
            'redirect_uri' => 'http://bili.com/auth/callback',
            'response_type' => 'code',
            'scope' => '*',
            'state' => $state,
        ]);

        return redirect('http://lishen.com/oauth/authorize?'.$query);
    });



// 回調(diào)地址督禽,獲取 code,并隨后發(fā)出獲取 token 請求
Route::view('/auth/callback', 'auth_callback');

Route::post('/get/token', function (\Illuminate\Http\Request $request) use (
    $clientId,
    $clientSecret
) {
    // csrf 攻擊處理
    $state = $request->session()->pull('state');
    throw_unless(
        strlen($state) > 0 && $state === $request->params['state'],
        InvalidArgumentException::class
    );


    $response
        = (new \GuzzleHttp\Client())->post('http://lishen.com/oauth/token', [
        'form_params' => [
            'grant_type' => 'authorization_code',
            'client_id' => $clientId,
            'client_secret' => $clientSecret,
            'redirect_uri' => 'http://bili.com/auth/callback',
            'code' => $request->params['code'],
        ],
    ]);

    return json_decode((string)$response->getBody(), true);
});


// 刷新 token
Route::view('/refresh/page', 'refresh_page');

Route::post('/refresh', function (\Illuminate\Http\Request $request) use (
    $clientId,
    $clientSecret
) {
    $http = new GuzzleHttp\Client;
    $response = $http->post('http://lishen.com/oauth/token', [
        'form_params' => [
            'grant_type' => 'refresh_token',
            'refresh_token' => $request->params['refresh_token'],
            'client_id' => $clientId,
            'client_secret' => $clientSecret,
        ],
    ]);

    return json_decode((string)$response->getBody(), true);
});

refresh_page

<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script>
    axios.post('/refresh', {
        params: {
            refresh_token: "def502009e634dd59ac4dcd4843be50c3a7a6c76fe0c26a6a948d45b99e393cdf99d1a212a8752d0ce02f4cbc25008972b524336f23b60dfc4198e5413b7e43250126b0d1780afb85443edc1579870e823eedea4313448ffcbe8ca73dc2441e1b1f54d3c0ffc31888e0afeb3b1d4516f6986e540b6a56490dfbfabfe7a88e9fb8539a18cb08f8a2ce10962a3c79e7eed137f137f605cb1ab26254e642750f7f07ebdf17a9ce07a370fabc85e769326cb4fbc9aad402bb69615357766f56e9e26feafac306a7338781317e8baa88e9df9dc0096c92522c8d3cdc1b77cf5273bb0866608575eec5688815d294de22cf8bdf1689cb7e11d6caeb2f3bd80cc57d911b712f79609a45e6e1def42709776c75ca16b56ce6449c25c1660635dfc4a590560db5d2bb52ffcb9be601b8a1ea51c221246815a4f08ed262290cf4fdf0c9c9d357c189f5fa4b9d32c7b9c98a8832666e1ee2eba38b9dc642b02fcc05c38bbdecc"
        }
    })
        .then(function (response) {
            console.log(response.data);
        });
</script>

auth_callback.blade.php

<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script>
    function GetRequest() {
        var url = location.search; //獲取url中"?"符后的字串
        var theRequest = {};
        if (url.indexOf("?") !== -1) {
            var str = url.substr(1);
            strs = str.split("&");
            for (var i = 0; i < strs.length; i++) {
                theRequest[strs[i].split("=")[0]] = decodeURI(strs[i].split("=")[1]);
            }
        }
        return theRequest;
    }

    //調(diào)用
    var Request = GetRequest();

    if (Request['error']) {
        // 用戶未授權(quán)處理
        alert(Request['error']);
    }else
    {
        var code = Request['code'];
        var state = Request['state'];

        axios.post('/get/token', {
            params: {
                code,
                state
            }
        })
            .then(function (response) {
                console.log(response.data);
            });
    }
</script>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末总处,一起剝皮案震驚了整個濱河市狈惫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鹦马,老刑警劉巖胧谈,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異荸频,居然都是意外死亡菱肖,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進店門旭从,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蔑滓,“玉大人,你說我怎么就攤上這事遇绞。” “怎么了燎窘?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵摹闽,是天一觀的道長。 經(jīng)常有香客問我褐健,道長付鹿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任蚜迅,我火速辦了婚禮舵匾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘谁不。我一直安慰自己坐梯,他們只是感情好,可當我...
    茶點故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布刹帕。 她就那樣靜靜地躺著吵血,像睡著了一般谎替。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蹋辅,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天钱贯,我揣著相機與錄音,去河邊找鬼侦另。 笑死秩命,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的褒傅。 我是一名探鬼主播弃锐,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼樊卓!你這毒婦竟也來了拿愧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤碌尔,失蹤者是張志新(化名)和其女友劉穎浇辜,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體唾戚,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡柳洋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年包券,在試婚紗的時候發(fā)現(xiàn)自己被綠了蠢熄。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡拓售,死狀恐怖募书,靈堂內(nèi)的尸體忽然破棺而出绪囱,到底是詐尸還是另有隱情,我是刑警寧澤莹捡,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布鬼吵,位于F島的核電站,受9級特大地震影響篮赢,放射性物質(zhì)發(fā)生泄漏齿椅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一启泣、第九天 我趴在偏房一處隱蔽的房頂上張望涣脚。 院中可真熱鬧,春花似錦寥茫、人聲如沸遣蚀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽妙同。三九已至射富,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間粥帚,已是汗流浹背胰耗。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留芒涡,地道東北人柴灯。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像费尽,于是被迫代替她去往敵國和親赠群。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,492評論 2 348

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