Lumen之JWT擴充套件包
JWT定義及其組成
官網連結:https://jwt.io/
JSON Web Token(JWT)是一個開放標準(RFC 7519),它定義了一種緊湊且獨立的方式,可以在各方之間作為JSON物件安全地傳輸資訊。此資訊可以通過數字簽名進行驗證和信任。JWT可以使用祕密(使用HMAC演算法)或使用RSA或ECDSA的公鑰/私鑰對進行簽名。
雖然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