Jwt是高效简单的接口验证组件,使用非常广泛。

GitHub:https://github.com/tymondesigns/jwt-auth

安装

composer安装

composer require tymon/jwt-auth:1.0.0

生成配置文件

php artisan vendor:publish

生成密钥

这是用来给你的token签名的钥匙,使用以下命令生成一个密钥:

php artisan jwt:secret

这将用 JWT_SECRET=foobar 更新.env文件

配置说明

JWT配置文件是 config/jwt.php,下面有部分配置项进行说明:

#令牌过期时间(单位分钟),设置null为永不过期
'ttl' => env('JWT_TTL', 60)

#刷新令牌时间(单位分钟),设置为null可永久随时刷新
'refresh_ttl' => env('JWT_REFRESH_TTL', 20160)

修改用户模型

首先,您需要在用户模型上实现 Tymon\JWTAuth\Contracts\JWTSubject 契约,它要求您实现两个方法 getJWTIdentifier()getJWTCustomClaims()

下面的示例应该能让您了解这可能是什么样子的。显然,您应该根据需要进行任何更改,以满足自己的需要。

<?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;

    /**
     * 获取将存储在JWT主题声明中的标识符.
     * 就是用户表主键 id
     *
     * @return mixed
     */
    public function getJWTIdentifier()
    {
        return $this->getKey();
    }

    /**
     * 返回一个键值数组,其中包含要添加到JWT的任何自定义声明.
     *
     * @return array
     */
    public function getJWTCustomClaims()
    {
        return [];
    }
}

配置验证守卫

修改 config/auth.php 文件以使用jwt保护来为接口身份验证提供支持。

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],
    'api' => [
        'driver' => 'jwt',
        'provider' => 'users',
    ],
]

修改dingo配置文件 config/api.php 文件中的身份验证提供者

'auth' => [
    'jwt' => \Dingo\Api\Auth\Provider\JWT::class,
],

验证操作

路由定义

$api = app(\Dingo\Api\Routing\Router::class);
$api->version('v1', ['namespace' => 'App\Http\Controllers\Api',], function ($api) {
    $api->post('login', 'AuthController@login');
    $api->get('logout', 'AuthController@logout');
    $api->get('me', 'AuthController@me');
});

控制器定义

class AuthController extends Controller
{
    public function __construct()
    {
        // 除login外都需要验证
        $this->middleware('auth:api', ['except' => ['login']]);
    }

    //登录获取token
    public function login()
    {
        $credentials = request(['email', 'password']);

        if (!$token = auth('api')->attempt($credentials)) {
            return $this->response->errorUnauthorized('帐号或密码错误');
        }

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

    //获取用户资料
    public function me()
    {
        return response()->json(auth('api')->user());
    }

    //销毁token
    public function logout()
    {
        auth('api')->logout();

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

    //刷新token
    public function refresh()
    {
        return $this->respondWithToken(auth('api')->refresh());
    }

    //响应token
    protected function respondWithToken($token)
    {
        return response()->json([
            'access_token' => $token,
            'token_type'   => 'bearer',
            'expires_in'   => auth('api')->factory()->getTTL() * 60,
        ]);
    }
}

使用令牌

当请求需要验证的api时必须带有token,下面是使用header头携带令牌数据

Authorization: Bearer 令牌数据

本文由 一切随风 创作,可自由转载、引用,但需署名作者且注明文章出处。

还不快抢沙发

添加新评论