Laravel 中使用 JWT 做登录权限认证

171 阅读1分钟

1、安装JWT扩展包:

composer require tymon/jwt-auth ^1.0

2、发布配置文件:

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

3、生成JWT密钥:

php artisan jwt:secret

4、设置超时时间

修改 env 文件,新增:

JWT_TTL=525600 // 单位为秒

5、修改config/auth.php文件:

'defaults' => [
    'guard' => 'api', // 将 web 修改为 api
    'passwords' => 'users',
],
'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],
    'api' => [
        'driver' => 'jwt', // 将 token 修改为 jwt
        'provider' => 'users',
        'hash' => false,
    ],
],

5、新增中间件:

<?php

namespace App\Http\Middleware;

use Closure;

class AuthMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request $request
     * @param  \Closure $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        try {
            $user = auth()->guard('api')->userOrFail();
            if (!$user) {
                return response()->json(['code' => 401,'msg' => 'token invalid','data' => new \stdClass()], 401);
                }
            } catch (\Tymon\JWTAuth\Exceptions\UserNotDefinedException $e) {
            return response()->json(['code' => 401,'msg' => 'token invalid','data' => new \stdClass()], 401);
        }
        return $next($request);
    }
}

6、注册中间件:

在 app/Http/Kernel.php 中,修改数组 $routeMiddleware:

'myauth' => \App\Http\Middleware\AuthMiddleware::class,

7、更新User模型:

<?php

namespace App\Models;

use Tymon\JWTAuth\Contracts\JWTSubject;
use Illuminate\Notifications\Notifiable;

class User extends JwtUser implements JWTSubject
{
    use Notifiable;


    protected $collection = 'users';     //文档名
    protected $primaryKey = '_id';    //设置id



    /**
     * 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 [];
    }
}
<?php

namespace App\Models;

use Illuminate\Auth\Authenticatable;
use Illuminate\Auth\MustVerifyEmail;
use Illuminate\Auth\Passwords\CanResetPassword;
use Illuminate\Foundation\Auth\Access\Authorizable;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;

use Jenssegers\Mongodb\Eloquent\Model as Eloquent;

class JwtUser extends Eloquent implements
    AuthenticatableContract,
    AuthorizableContract,
    CanResetPasswordContract
{
    use Authenticatable, Authorizable, CanResetPassword, MustVerifyEmail;
}

7、设置路由:

Route::group(['middleware'=>['myauth']],function(){
    //获取用户信息
    Route::get('/user-info', [AuthController::class, 'info']);
});

8、控制器获取登录 token 示例:

$respon_token = auth('api')->fromUser($user);
return $this->success(['token' => $respon_token]);