基于 JWT 实现 Laravel API 认证


什么是jwt

jwt单词代表的意思就是JSON Web Token。

我们在做api请求的时候,通常要使用token,来验证是否这个请求能不能访问。

一旦用户登录,后续每个请求都将包含JWT,允许用户访问该令牌允许的路由、服务和资源。单点登录是现在广泛使用的JWT的一个特性,因为它的开销很小,并且可以轻松地跨域使用。

为什么使用jwt

  1. Session是在服务器端的,而JWT是在客户端的。

  2. Session方式存储用户信息的最大问题在于要占用大量服务器内存,增加服务器的开销,而JWT方式将用户状态分散到了客户端中,可以明显减轻服务端的内存压力。

Laravel中如何使用jwt

  1. composer 安装jwt-auth
composer require tymon/jwt-auth 1.0.0-rc.1
  1. 注册我们的服务提供者
'providers' => [

    Tymon\JWTAuth\Providers\LaravelServiceProvider::class,
]
  1. 发布配置文件
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"
  1. 生成密钥
php artisan jwt:secret
  1. 配置Auth guard,让api的driver使用jwt
'guards' => [
    'api' => [
        'driver' => 'jwt',
        'provider' => 'users',
    ],
],
  1. 更改 User Model,让User 支持 jwt-auth

use Tymon\JWTAuth\Contracts\JWTSubject;
class User extends Authenticatable implements JWTSubject
{
    /**
     * 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 [];
    }
}

下面就可以使用了,跟laravel csrf-token一样我们在每个模版meta中注册api-token。

    <meta name="csrf-token" content="{{ csrf_token() }}">
    <meta name="api-token" content="{{ Auth::check() ? 'Bearer '.JWTAuth::fromUser(Auth::user()) : '' }}">

每次ajax请求的时候获取api-token放置到header中就可以了。

    let api_token = document.head.querySelector('meta[name="api-token"]');

    if(api_token) {
        window.axios.defaults.headers.common['Authorization'] = api_token.content;
    }

哪个api路由需要使用jwt,只需要加入'auth:api'中间件就可以了。

Route::middleware('auth:api')->group(function($router) {
    // 点赞
    $router->get('/post/is-zan/{zan_post}','\App\Api\Controllers\PostController@isZan');
});

本章节的代码可以参考最后一章基于laravel简单的项目。


点赞 取消点赞 收藏 取消收藏

<< 上一篇: Laravel 前端最佳实践

>> 下一篇: 负载均衡、分布式、集群的理解以及多台服务器代码如何同步