1. 程式人生 > >Lumen之JWT擴充套件包

Lumen之JWT擴充套件包

JWT定義及其組成

官網連結:https://jwt.io/

JSON Web Token(JWT)是一個開放標準(RFC 7519),它定義了一種緊湊且獨立的方式,可以在各方之間作為JSON物件安全地傳輸資訊。此資訊可以通過數字簽名進行驗證和信任。JWT可以使用祕密(使用HMAC演算法)或使用RSAECDSA的公鑰/私鑰對進行簽名

雖然JWT可以加密以在各方之間提供保密,但我們將專注於簽名令牌。簽名令牌可以驗證其中包含的宣告的完整性,而加密令牌則隱藏其他方的宣告。當使用公鑰/私鑰對簽署令牌時,簽名還證明只有持有私鑰的一方是簽署私鑰的一方。

什麼時候應該使用JSON Web令牌?

以下是JSON Web令牌有用的一些場景:

  • 授權:這是使用JWT的最常見方案。一旦使用者登入,每個後續請求將包括JWT,允許使用者訪問該令牌允許的路由,服務和資源。Single Sign On是一種現在廣泛使用JWT的功能,因為它的開銷很小,並且能夠在不同的域中輕鬆使用。
  • 資訊交換:JSON Web令牌是在各方之間安全傳輸資訊的好方法。因為JWT可以簽名 - 例如,使用公鑰/私鑰對 - 您可以確定發件人是他們所說的人。此外,由於使用標頭和有效負載計算簽名,您還可以驗證內容是否未被篡改。

整合JWT到lumen

1.下載lumen

composer create-project laravel/lumen lumen --prefer-dist "5.5.*"

2.安裝JWT擴充套件

composer require tymon/jwt-auth:1.0.0-rc.2

配置

1.開啟 Facade 和 Eloquent

取消以下行的註釋。bootstrap/app.php

// $app->withFacades();

// $app->withEloquent();

2.開啟中介軟體認證

取消以下行的註釋。bootstrap/app.php

// $app->routeMiddleware([

// 'auth' => App\Http\Middleware\Authenticate::class,

// ]);

// $app->register(App\Providers\AuthServiceProvider::class);

3.新增服務提供者

bootstrap/app.php

$app->register(\Tymon\JWTAuth\Providers\LumenServiceProvider::class);

4.生成加密金鑰

# 這條命令會在 .env 檔案下生成一個加密金鑰,如:JWT_SECRET=foobar

php artisan jwt:secret

5.更新你的模型

<?php

namespace App;

use Illuminate\Auth\Authenticatable;
use Laravel\Lumen\Auth\Authorizable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract;

class User extends Model implements AuthenticatableContract, AuthorizableContract
{
    use Authenticatable, Authorizable;

}

6.註冊兩個 Facade

bootstrap/app.php

把原先去了註釋的那一行再改一下。

$app->withFacades(true, [
        'Tymon\JWTAuth\Facades\JWTAuth' => 'JWTAuth',
        'Tymon\JWTAuth\Facades\JWTFactory' => 'JWTFactory',
    ]
);

7 設定 auth.php

把 \vendor\laravel\lumen-framework\config\auth.php 也複製到 專案根目錄config 資料夾(沒有就新建)。

'defaults' => [
    'guard' => env('AUTH_GUARD', 'userApi'),
],
'guards' => [
  'userApi' => [
       'driver' => 'jwt',
       'provider' => 'users'
    ],
],
    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model'  => \App\Model\User::class,
        ],
    ],

8 .註冊路由

$router->post('user/login/{code}','User\[email protected]');

9. 建立 token 控制器

<?php
namespace App\Http\Controllers\User;

use App\Exceptions\ThrowException;
use App\Http\Controllers\Controller;
use App\Model\User;
use Illuminate\Http\Request;
use Ixudra\Curl\Facades\Curl;
use Tymon\JWTAuth\JWTAuth;

class LoginController extends Controller
{
    protected $jwt;

    public function __construct(JWTAuth $jwt)
    {
        $this->jwt = $jwt;
    }
    public function userLogin($result)
    {
        $user = User::where('openid',$result)->first();
        $token = $this->jwt->fromUser($user);
        return response()->json(compact('token'),200);
    }
}

注意:

1.在Model中必須要有User模型

(Lumen 還精簡了很多輔助函式,比如 auth 和 bcrypt 等。

2.安裝一個composer require albertcht/lumen-helper