Laravel5.7+Json Web Token實現接口用戶認證

廢話:記得在我剛實習那會,在某家公司寫PHP,主要對接‘某贊’ ‘某盟’ ‘微信’的接口,回想起來寫代碼真的是一把梭啊,能跑起來就行那種,從不考慮程序性能,好比時間複雜度和空間複雜度。php

ok,通過我努力學習,我如今要裝逼了(其實沒什麼技術含量),講一下接口服務的開發。html

1.有人說用Session判斷用戶的狀態就好了。這裏我提出幾個問題,以下:nginx

  • 若是作了負載均衡,上游服務器有幾臺,請問Session 怎麼存?(不要說存在redis共享出來,或者nginx配置ip_hash)
  • Session的存儲機制是文件的形式,若是有太多用戶,是否是有大量的文件佔據空間

2.安裝配置以下(注意Laravel版本和jwt版本的兼容問題):laravel

https://laravelacademy.org/post/3640.htmlredis

3.寫個jwt驗證的類提供服務,固然了,繼承jwt組件去寫:json

<?php

namespace App\Http\Controllers\Api\V1;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class AuthController extends Controller
{
    /**
     * Create a new AuthController instance.
     * 要求附帶email和password(數據來源users表)
     *
     * @return void
     */
    public function __construct()
    {
        // 這裏額外注意了:官方文檔樣例中只除外了『login』
        // 這樣的結果是,token 只能在有效期之內進行刷新,過時沒法刷新
        // 若是把 refresh 也放進去,token 即便過時但仍在刷新期之內也可刷新
        // 不過刷新一次做廢
        $this->middleware('auth:api', ['except' => ['login']]);
        // 另外關於上面的中間件,官方文檔寫的是『auth:api』
        // 可是我推薦用 『jwt.auth』,效果是同樣的,可是有更加豐富的報錯信息返回
    }

    /**
     * Get a JWT via given credentials.
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function login()
    {
        $credentials = request(['email', 'password']);

        if (! $token = auth('api')->attempt($credentials)) {
            return response()->json(['error' => 'Unauthorized'], 401);
        }
        return $this->respondWithToken($token);
    }
    /**
     * Get the authenticated User.
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function me()
    {
        return response()->json(auth('api')->user());
    }

    /**
     * Log the user out (Invalidate the token).
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function logout()
    {
        auth('api')->logout();

        return response()->json(['message' => 'Successfully logged out']);
    }

    /**
     * Refresh a token.
     * 刷新token,若是開啓黑名單,之前的token便會失效。
     * 值得注意的是用上面的getToken再獲取一次Token並不算作刷新,兩次得到的Token是並行的,即兩個均可用。
     * @return \Illuminate\Http\JsonResponse
     */
    public function refresh()
    {
        return $this->respondWithToken(auth('api')->refresh());
    }

    /**
     * Get the token array structure.
     *
     * @param  string $token
     *
     * @return \Illuminate\Http\JsonResponse
     */
    protected function respondWithToken($token)
    {
        return response()->json([
            'access_token' => $token,
            'token_type' => 'bearer',
            'expires_in' => auth('api')->factory()->getTTL() * 60
        ]);
    }
}

4.註冊中間件,起命名空間的別名api

 

 

 

 這裏要特別注意的要這這步操做,這是Laravel 能 使用jwt 主鍵的關鍵服務器

 

 4.爲了測試,我也安裝了Laravel的登錄註冊組件和dingo微信

詳情操控看文檔:https://laravelacademy.org/post/9554.html(登錄註冊組件)負載均衡

        https://laravel-china.org/docs/dingo-api/2.0.0/Installation/1443(dinggo的適用)

5.測試:

  • 路由配置:
  •  

  •  

  • Postman的測試結果:
  •  

相關文章
相關標籤/搜索