2018年11月12日 星期一

《面試官別再問》PHP Laravel 5如何使用JWT api authentication

php composer require tymon/jwt-auth 0.5.*
設定
安裝完成後,需要在配置/ app.php中註冊相應的服務提供者:
  1. 'providers' => [
  2. ...,
  3. Tymon\JWTAuth\Providers\JWTAuthServiceProvider::class
  4. ]
  1. 'aliases' => [
  2. ...,
  3. 'JWTAuth' => Tymon\JWTAuth\Facades\JWTAuth::class,
  4. 'JWTFactory' => Tymon\JWTAuth\Facades\JWTFactory::class
  5. composer require tymon/jwt-auth 0.5.*]

php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\JWTAuthServiceProvider"
php artisan jwt:generate
app\Http\Kernel.php
  1. protected $routeMiddleware = [
  2. ...,
  3. 'jwt.auth' => \Tymon\JWTAuth\Middleware\GetUserFromToken::class,
  4. 'jwt.refresh' => \Tymon\JWTAuth\Middleware\RefreshToken::class
  5. ];
app\Http\routes.php
  1. Route::group(['prefix' => 'api'], function()
  2. {
  3. Route::get('auth', 'AuthController@index');
  4. Route::post('auth', 'AuthController@auth');
  5. });

建立controller artisan make:controller AuthController

  1. <?php
  2. namespace App\Http\Controllers;
  3. use Illuminate\Http\Request;
  4. use App\Http\Requests;
  5. use Auth;
  6. use JWTAuth;
  7. class AuthController extends Controller
  8. {
  9. public function auth(Request $request)
  10. {
  11. $credentials = $request->only('email', 'password');
  12. try {
  13. if (! $token = JWTAuth::attempt($credentials)) {
  14. return response()->json(['error' => 'invalid_credentials'], 401);
  15. }
  16. } catch (JWTException $e) {
  17. return response()->json(['error' => 'could_not_create_token'], 500);
  18. }
  19. return response()->json(compact('token'));
  20. }
  21. public function __construct()
  22. {
  23. $this->middleware('jwt.auth', ['except' => ['auth']]);
  24. }
  25. public function index()
  26. {
  27. return response()->json(Auth::user()->all());
  28. }
  29. }
Laravel - CSRF token禁用方法
打開文件:app\Http\Middleware\VerifyCsrfToken.php
protected $except = [
        'api/*',
        'http://loaclhost/foo/bar',
    ];

在config/jwt.php中,你可以配置以下選項:

ttl:token有效期(分鐘)
refresh_ttl:刷新token時間(分鐘)
algo:token簽名算法
user:指向User模型的命名空間路徑
identifier:用於從token的sub中獲取用戶
require_claims:必須出現在token的payload中的選項,否則會拋出TokenInvalidException異常
blacklist_enabled:如果該選項被設置為false,那麼我們將不能廢止token,即使我們刷新了token,前一個token仍然有效
providers:完成各種任務的具體實現,如果需要的話你可以重寫他們
User —— providers.user:基於sub獲取用戶的實現
JWT —— providers.jwt:加密/解密token
Authentication —— providers.auth:通過證書/ID獲取認證用戶
Storage —— providers.storage:存儲token直到它們失效

沒有留言:

張貼留言