laravel jwt多用户支持

前后端分离,但是后台需要为不同的前端提供api支持,所以做了一下jwt的多用户切换。


环境:laravel5.5+


  • 安装扩展tymon/jwt-auth
composer require tymon/jwt-auth:1.0
  • 生成user表(用默认的迁移文件就行了)
php artisan migrate

再随便添加两条数据

  • 发布jwt配置
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"
  • 生成jwt secret
php artisan jwt:secret
  • 修改一下 User 模型,需要实现扩展包提供的接口Tymon\JWTAuth\Contracts\JWTSubject

接口要求我们实现两个方法:

1、getJWTIdentifier —— 返回模型的 id,一般直接使用 $this->getKey() 返回模型主键

2、getJWTCustomClaims —— 返回数组,存放自定义的数据用于放在 Token 中,可以先返回空数组。

namespace App\Models;

use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Tymon\JWTAuth\Contracts\JWTSubject;

class User extends Authenticatable implements JWTSubject
{
    protected $table = 'user';

    //================== JWT配置 start ====================
    //这里我将手机号作为身份标识
    public function getJWTIdentifier()
    {
        return $this->mobile;
    }
    //可以加入一些额外的自定义数据,加入到载荷中
    public function getJWTCustomClaims()
    {
        return [
            'user_id' => $this->id,
            'sub'     => $this->mobile,
        ];
    }
    //================== JWT配置 end ====================

}

  • 结合 laravel auth, 配置config/auth.php
...
    'defaults' => [
        'guard'     => 'wechat_api',
        'passwords' => 'users',
    ],

    'guards' => [
        'wechat_api' => [
            'driver'   => 'jwt',
            'provider' => 'users',
            'hash'     => false,
        ],
    ],
...
  • 登录
$credentials = ['mobile' => '18612345678'];
$token = auth('wechat_api')->attempt($credentials);
  • 退出登录
auth('wechat_api')->logout();
  • 刷新jwt
$token = auth('wechat_api')->refresh();

ps:刷新需要配置一下config/jwt.php

//token过期时间,默认60分钟
'ttl' => env('JWT_TTL', 60),
//多长时间内,jwt可以再次被刷新,默认20160分钟(14天)
'refresh_ttl' => env('JWT_REFRESH_TTL', 20160),
  • 获取当前jwt对应的用户
//return App/Models/User
auth()->user()
  • 测试一下
    routes/api.php
Route::any('/test', function () {
    return auth('wechat_api')->attempt(['mobile' => '18612345678']);
});

访问api/test:

{
    "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC95dWVsYWkuZWJvb2tcL2FwaVwvd2VjaGF0XC90ZXN0IiwiaWF0IjoxNjAyMjM3Nzk5LCJleHAiOjE2MDIyNDEzOTksIm5iZiI6MTYwMjIzNzc5OSwianRpIjoicVZ1RXNPd0dnaVFOZWpwTSIsInN1YiI6IjE4NjE1ODY1Nzk2IiwidXNlcl9pZCI6MX0.G5Nw_YQxU6ujnA5aYc36f80Ig_WNiNczInk64W_b7ow"
}

多用户切换

  • 再新建一个adminmodel
php artisan make:model Admin
namespace App\Models;

use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Tymon\JWTAuth\Contracts\JWTSubject;

class Admin extends Authenticatable implements JWTSubject
{

    /**
     * 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',
    ];

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

    public function getJWTCustomClaims()
    {
        return [];
    }
}
  • 创建相应的迁移文件
php artisan make:migration --table=admin

迁移文件字段自行添加,之后执行迁移:

php artisan migrate
  • 修改config/auth.php配置
...
'guards' => [
        ...
        'admin' => [
            'driver' => 'jwt',
            'provider' => 'admins',
        ],
    ],
    'providers' => [
        ...
        'admins' => [
            'driver' => 'eloquent',
            'model' => App\Models\Admin::class,
        ],
...
  • 使用
    使用方式何之前的一致,区别一下中间件就可以了
//普通用户登录
Route::post('user/login', function(Request $request) {
    $credentials = $request->only('mobile');
    if (!$token = auth('wechat_api')->attempt($credentials)) {
        return response()->json(['error' => 'Unauthorized'], 401);
    }
    return response()->json(['token' => $token]);
});
//普通用户验证
Route::get('/user', function (Request $request) {
    return $request->user();
})->middleware('auth:wechat_api');

//后端用户登录
Route::post('admin/login', function(Request $request) {
    $credentials = $request->only('email', 'password');
    if (!$token = auth('admin')->attempt($credentials)) {
        return response()->json(['error' => 'Unauthorized'], 401);
    }
    return response()->json(['token' => $token]);
});
//后端用户验证
Route::get('/admin', function (Request $request) {
    return $request->user();
})->middleware('auth:admin');
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269