Laravel5使用 Jwt-Auth 实现 API 用户认证

已从CSDN搬家到简书

jwt-auth 最新版本是 1.0.0 rc.1 版本,已经支持了 Laravel 5.5。如果你使用的是 Laravel 5.5 版本,可以使用如下命令安装。

如果你是 Laravel 5.5 以下版本,也推荐使用最新版本,RC.1 前的版本都存在多用户token认证的安全问题。

 composer require tymon/jwt-auth 1.0.0-rc.1

添加服务提供商

将下面这行添加至 config/app.php 文件 providers 数组中:

Tymon\JWTAuth\Providers\LaravelServiceProvider::class,

将下面这行添加至 config/app.php 文件 aliases数组中:

  'JWTAuth'=> Tymon\JWTAuth\Facades\JWTAuth::class,
  'JWTFactory'=> Tymon\JWTAuth\Facades\JWTFactory::class,

在你的 shell 中运行如下命令发布 配置文件:

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

此命令会在 config 目录下生成一个 jwt.php 配置文件,你可以在此进行自定义配置。

生成密钥

php artisan jwt:secret

此命令会在你的 .env 文件中新增一行 JWT_SECRET=secret

配置 Auth guard

'defaults' => [
    'guard' => 'api',         // 修改为api
    'passwords' => 'users',
],
 
'guards' => [
    'api' => [
        'driver' => 'jwt',     // JWTGuard 实现,源码中为 token,我这改成 jwt 了
        'provider' => 'users',
    ],
],
 
'providers' => [
     'users' => [
          'driver' => 'eloquent',
          'model' => App\Models\User::class, // 根据你model的位置更改
     ],
],

更改 Model

<?php
 
namespace App\Models;
 
use Tymon\JWTAuth\Contracts\JWTSubject;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
 
class User extends Authenticatable implements JWTSubject
{
    use Notifiable;
    protected $table = 'users';
    protected $fillable = ['name', 'password', 'mobile'];
    #定义是否默认维护时间,默认是true.改为false,则以下时间相关设定无效
    public $timestamps = true;
    protected $hidden = [
        'password',
    ];
    /**
     * 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 [];
    }
 
}

用户提供账号密码前来登录。如果登录成功,那么我会给前端颁发一个 access _token

执行如下命令以新建一个中间件:

php artisan make:middleware ApiAuth

中间件代码 ApiAuth.php 如下:

<?php
namespace App\Http\Middleware;
 
 
use Closure;
use Tymon\JWTAuth\Exceptions\JWTException;
use Tymon\JWTAuth\Exceptions\TokenExpiredException;
use Tymon\JWTAuth\Exceptions\TokenInvalidException;
use JWTAuth;
 
class ApiAuth
{
    public function handle($request, Closure $next)
    {
        try {
            if (! $user = JWTAuth::parseToken()->authenticate()) {  //获取到用户数据,并赋值给$user
                return response()->json([
                    'errcode' => 1004,
                    'errmsg' => 'user not found'
 
                ], 404);
            }
        return $next($request);
 
    } catch (TokenExpiredException $e) {
 
            return response()->json([
                'errcode' => 1003,
                'errmsg' => 'token 过期' , //token已过期
            ]);
 
        } catch (TokenInvalidException $e) {
 
            return response()->json([
                'errcode' => 1002,
                'errmsg' => 'token 无效',  //token无效
            ]);
 
        } catch (JWTException $e) {
 
            return response()->json([
                'errcode' => 1001,
                'errmsg' => '缺少token' , //token为空
            ]);
 
        }
    }
 
}

在app\Http\Kernel.php下添加如下代码

 protected $routeMiddleware = [
        'api.auth' => \App\Http\Middleware\ApiAuth::class,
 ];

现在,我们可以在 routes/api.php 路由文件中路由来测试一下

Route::post('login', 'IndexController@login');
Route::post('register', 'IndexController@register');

控制器代码如下:

use JWTAuth;
 
public function login(Request $request)
{
   // 验证规则,由于业务需求,这里我更改了一下登录的用户名,使用手机号码登录
    $rules = [
         'mobile'   => ['required'],
         'password' => 'required|string|min:6|max:20',
    ];
 
    // 验证参数,如果验证失败,则会抛出 ValidationException 的异常
    $params = $this->validate($request, $rules);
 
    // 使用 Auth 登录用户,如果登录成功,则返回 201 的 code 和 token,如果登录失败则返回
    $token = JWTAuth::attempt($params);
    if ($token) {
        return $this->responseData(['access_token' => $token]);
    } else {
        $this->responseError('账号或密码错误');
    }
 
}
 
public function register(RegisterRequest $request)
{
    $mobile = $request->input('mobile');
    $password = $request->input('password');
    // 注册用户
    $user = User::create([
         'mobile' => $mobile,
         'password' => bcrypt($password),
         'nickname' => encryptedPhoneNumber($mobile)
    ]);
    // 获取token
    $token = JWTAuth::fromUser($user);
     if (!$token) {
         return $this->responseError('注册失败,请重试');
     }
 
     return $this->responseData([
         'access_token' => $token,
         'user' => $user
     ]);
}

测试截图如下:

image

image

纯原创,希望可以对大家有帮助,文章会不断更新,如有疑问或新坑,欢迎评论

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342