Laravel6.0 使用 Jwt-auth 實現多使用者介面認證

huangdj 發表於 2019-09-11

後臺管理員認證 (admins表)

首先建立資料庫和表(admins),在 routes/api.php 中,寫上如下路由並建立對應控制器和方法。

Route::namespace('Api')->group(function () {
    /***
     * 管理員後臺介面路由
     */
    Route::prefix('admin')->namespace('Admin')->group(function () {
        Route::post('register', '[email protected]');
        Route::post('login', '[email protected]');
    });
    Route::prefix('admin')->namespace('Admin')->group(function () {
        Route::get('/', '[email protected]'); //後臺首頁
    });
});

1、安裝 jwt-auth

composer require tymon/jwt-auth:dev-develop

2、在 config/app.php 中註冊服務提供者

Tymon\JWTAuth\Providers\LaravelServiceProvider::class,

3、生成配置檔案

php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"

此命令會在 config 目錄下生成一個 jwt.php 配置檔案

4、生成金鑰

php artisan jwt:secret

此命令會在你的 .env 檔案中新增一行 JWT_SECRET=secret

5、建立 admins 表遷移檔案

php artisan make:migration create_admins_table

新增如下程式碼:

public function up()
{
    Schema::create('admins', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('name');
        $table->string('email')->unique();
        $table->timestamp('email_verified_at')->nullable();
        $table->string('password');
        $table->rememberToken();
        $table->timestamps();
    });
}

執行遷移:

php artisan migrate

此時檢視資料庫,對應的 admins 表已生成。

6、建立模型

由於我們這裡後臺管理員設定的是 admins 表,所以需建立對應模型,執行如下命令:

php artisan make:model Models/Admin

裡面新增如下程式碼:

<?php

namespace App\Models;

use Tymon\JWTAuth\Contracts\JWTSubject;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class Admin extends Authenticatable implements JWTSubject
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];

    public function getJWTIdentifier()
    {
        return $this->getKey();
    }

    public function getJWTCustomClaims()
    {
        return [];
    }
}

7、配置 Auth guard

config/auth.php 檔案中,新增 guardProviders,程式碼如下:

'admins' => [
    'driver'   => 'jwt',
    'provider' => 'admins'
]

*************************

'admins' => [
    'driver' => 'eloquent',
    'model' => App\Models\Admin::class,
]

8、在 AdminController 中新增如下程式碼:

<?php

namespace App\Http\Controllers\Api\Admin;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Models\Admin;
use Hash;

class AdminController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth:admins', ['except' => ['register', 'login']]);
    }

    /***
     * 後臺管理員註冊
     * @param Request $request
     */
    public function register(Request $request)
    {
        $name = $request->name;
        $email = $request->email;
        $password = $request->password;
        $check_password = $request->check_password;

        if (!$name || !$password) {
            return response()->json(['success' => false, 'message' => '使用者名稱、郵箱或密碼必填!']);
        }

        $pattern = "/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,})$/";
        if (!preg_match($pattern, $email)) {
            return response()->json(['success' => false, 'message' => '郵箱格式不正確!']);
        }

        if ($check_password != $password) {
            return response()->json(['success' => false, 'message' => '兩次密碼輸入不一致!']);
        }

        $admin = Admin::where('name', $name)->first();
        if ($admin) {
            return response()->json(['success' => false, 'message' => '使用者名稱已被註冊!']);
        }

        $password = Hash::make($password);
        $admin = Admin::create([
            'name' => $name,
            'email' => $email,
            'password' => $password
        ]);

        return response()->json(['success' => true, 'message' => '註冊成功!', 'admin' => $admin]);
    }

    /***
     * 後臺管理員登入
     * @param Request $request
     */
    public function login(Request $request)
    {
        $email = $request->email;
        $password = $request->password;

        if (!$email || !$password) {
            return response()->json(['success' => false, 'message' => '郵箱或密碼填寫錯誤!']);
        }

        $admin = Admin::where('email', $email)->first();
        if (!$admin) {
            return response()->json(['success' => false, 'message' => '此郵箱不存在!']);
        }

        if (!Hash::check($password, $admin->password)) {
            return response()->json(['success' => false, 'message' => '密碼填寫錯誤!']);
        }

        $credentials = request(['email', 'password']);
        if (!$token = auth('admins')->attempt($credentials)) {
            return response()->json(['error' => 'Unauthorized'], 401);
        }

        return $this->respondWithToken($token);
    }

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

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

    /**
     * Refresh a token.
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function refresh()
    {
        return $this->respondWithToken(auth('admins')->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('admins')->factory()->getTTL() * 60
        ]);
    }
}

測試:

先註冊一個後臺賬號,在postman 中,如圖所示:

Laravel6.0 使用 Jwt-auth 實現多使用者介面認證

9、使用中介軟體,修改之前的路由如下:

Route::namespace('Api')->group(function () {
    /***
     * 管理員後臺介面路由
     */
    Route::prefix('admin')->namespace('Admin')->group(function () {
        Route::post('register', '[email protected]');
        Route::post('login', '[email protected]');
    });
    Route::prefix('admin')->namespace('Admin')->middleware('auth:admins')->group(function () {
        Route::get('/', '[email protected]'); //後臺首頁
    });
});

測試:

實現登入,在postman 中,如圖所示:

Laravel6.0 使用 Jwt-auth 實現多使用者介面認證

12、獲取管理員資訊,在後臺首頁控制器中寫入如下程式碼:

public function index()
{
    return response()->json(auth('admins')->user());
}

Laravel6.0 使用 Jwt-auth 實現多使用者介面認證

至此,後臺介面認證已完成!

商戶後臺認證 (merchants表)

這裡的商戶後臺認證其實是重複上面的步驟,只是換了一張表而已,所以自行完成!

小程式前端使用者認證 (users表)

1、在 api.php 中新增路由並建立對應控制器和方法,users 表增加欄位 openid

 /***
 * 小程式使用者認證介面路由
 */
Route::any('/auth', '[email protected]');

2、在 config/auth.php 檔案中,修改 guard 裡面的 api 那欄,程式碼如下:

'users' => [
    'driver' => 'jwt',
    'provider' => 'users',
    'hash' => false,
],

3、修改模型 User.php 程式碼如下:

<?php

namespace App;

use Tymon\JWTAuth\Contracts\JWTSubject;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable implements JWTSubject
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password', 'openid'
    ];

    /**
     * Get the identifier that will be stored in the subject claim of the JWT.
     *
     * @return mixed
     */
    public function getJWTIdentifier()
    {
        return $this->getKey();
    }

    /**
     * Return a key value array, containing any custom claims to be added to the JWT.
     *
     * @return array
     */
    public function getJWTCustomClaims()
    {
        return [];
    }
}

4、使用中介軟體,修改之前的路由如下:

/***
 * 小程式使用者認證介面路由
 */
Route::any('/auth', '[email protected]');

Route::middleware('auth:users')->group(function () {
    Route::get('/', '[email protected]'); //首頁介面
});

5、安裝 easyWeChat 第三方包

composer require "overtrue/laravel-wechat:~5.0"  #安裝包檔案
php artisan vendor:publish --provider="Overtrue\LaravelWeChat\ServiceProvider"  #生成配置檔案

開啟配置檔案 wechat.php 裡面的小程式配置和支付配置,在 .env 檔案中配置支付的相關引數,如下:

WECHAT_MINI_PROGRAM_APPID=*******
WECHAT_MINI_PROGRAM_SECRET=*******

WECHAT_PAYMENT_MCH_ID=*******
WECHAT_PAYMENT_APPID=*******
WECHAT_PAYMENT_KEY=*******

6、在 MiniController 控制器中新增如下程式碼:

<?php

namespace App\Http\Controllers\Api;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\User;
use JWTAuth;
use EasyWeChat;
use Auth;

class MiniController extends Controller
{
    public function auth(Request $request)
    {
        $app = EasyWeChat::miniProgram();
        $session = $app->auth->session($request->code);
        $openid = $session['openid'];
//        return $openid;
        //用openid查詢資料庫,是否已經有了,沒有就建立。
        $user = User::firstOrCreate(compact('openid'));

        //生成token
        $token = JWTAuth::fromUser($user);
        return response()->json(['token' => 'Bearer ' . $token]);
    }
}

7、建立一個小程式測試專案,在 app.js 中,刷出 code。然後 postman 測試如圖:

Laravel6.0 使用 Jwt-auth 實現多使用者介面認證

8、最後一步獲取小程式使用者 id。在首頁介面控制器中寫入如下程式碼,用來列印小程式使用者的 openid

public function index()
{
    return response()->json(auth('users')->user()->openid);
}

Laravel6.0 使用 Jwt-auth 實現多使用者介面認證


相關文章

Laravel Passport OAuth 資料庫查詢改快取優化 資料庫|Laravel

Laravel Passport OAuth 資料庫查詢改快取優化

1、oauth_clients 表查詢快取修改-- 找到路徑 project/vendor/laravel/passport/src/Client.php 檔案註釋該行程式碼,不然查詢出來存快取無法獲
自定義 Command 檢視 Laravel 日誌 Laravel

自定義 Command 檢視 Laravel 日誌

Unix 的 tail 命令可以用來檢視檔案的,例如檢視 2019-09-26 的最後 100 行日誌$ cd storage/logs $ tail -100 laravel-2019-09-26
安裝 Laravel/horizon 踩過的坑 Laravel

安裝 Laravel/horizon 踩過的坑

報錯圖:問題原因我們簡單翻譯一下提示資訊就可以看到,整體說的是laravel/horizon依賴或者需要ext-pcntl擴充,我們可以在php.ini中修改並使用。這就是大概的意思,但是我去php.
Laravel passport 多端使用者使用 Laravel

Laravel passport 多端使用者使用

說明使用 passport 進行 admin 端和 customer 端的使用者認證。雖然教程很多,但是我並沒有參照其他教程完整的走下來,所以記錄了自己的開發流程,希望能對其他人有所幫助。github
Laravel/Homestead box v8.2.1 分享 Laravel

Laravel/Homestead box v8.2.1 分享

百度雲:https://pan.baidu.com/s/1oj9g9nAORLswYSvKr...密碼:kvf4
Windows 下 Laravel Mix 資源編譯過程以及產生的錯誤解決 Laravel

Windows 下 Laravel Mix 資源編譯過程以及產生的錯誤解決

環境說明虛擬機器 : Homestead ;物理機 : Windows 10 x64 系統 ;編輯器 : Sublime Text 3 ;終端 : git bash ;說明:以上環境不必完全保持一致
學習 Laravel —— 前端篇(持續更新) 前端|Laravel

學習 Laravel —— 前端篇(持續更新)

laravel 6.0一開始在 homestead 環境中使用 npm install / npm run dev 各種報錯,無法解決。最後在window下安裝了最新的 node.js 和修改 pac
Laravel 模型關聯的『動態屬性』,Eloquent: 關聯以後可以獲取模型的集合 Laravel

Laravel 模型關聯的『動態屬性』,Eloquent: 關聯以後可以獲取模型的集合

1. 以下是 laravel文件中的描述 文件連結一旦關係被定義好以後,就可以通過訪問 模型 的 屬性 來獲取集合。記住,由於 Eloquent 提供了『動態屬性』 ,所以我們可以像訪問模型的屬性一
Laravel 資料庫裡的資料刪除 資料庫|Laravel

Laravel 資料庫裡的資料刪除

想請問Laravel資料庫裡的資料如何刪除讓id重新編號,單純刪除資料庫的資料,在重新增加id會從被刪掉的id後開始新增,而不會從刪掉的id開始編號,我該使用什麼artisan command去刪除來
Laravel 模型關聯 「 預載入 」中 with () 方法的功能的示例及說明 Laravel

Laravel 模型關聯 「 預載入 」中 with () 方法的功能的示例及說明

laravel 模型關聯 「 預載入 」 -&gt;with()功能的示例1 模型關聯說明:在動態模型 Status中,指明一條微博動態屬於一個使用者 User&lt;?php..// 動態模型st
分享連結:序言《Laravel 之道》 Laravel

分享連結:序言《Laravel 之道》

分享連結:序言《Laravel 之道》
Laravelapi 自定義 response 格式 Laravel

Laravelapi 自定義 response 格式

laravel的http路由檔案有兩個api.php和web.php➜  ~ ll /Users/shiwenyuan/test/test_demo/routestotal 32drwxr-xr-x