不败君

前端萌新&初级后端攻城狮

Laravel安装jwt-auth实现API认证

Laravel安装jwt-auth实现API认证

2019-03-03 11:50:05

围观(33305)


在没有使用Laravel之前一直都是写的原生PHP,主要是觉得不能太过依赖框架。但使用Laravel之后一切都变得美好、优雅。

使用原生不依赖任何框架,也不依赖任何的扩展、包。所以要认证API只能是在用户表中加入Token字段,还要加入Token生成时间或者过期时间字段用于验证。

而jwt-auth(Json Web Token) 无需将token存入字段,因为生成Token的时候已经将这些信息包含在Token中。

刚开始接触jwt-auth当然是看官方文档,在Github上的官方文档:https://github.com/tymondesigns/jwt-auth/wiki
官网网站:http://jwt-auth.com/
如果Laravel版本是5.6或者5.7跟着官方文档安装,会发现安装出错,即使不报错也会无法生成jwt.php文件。后来查阅了一些资料才得以解决。


安装jwt
当然需要先安装Laravel,然后配置好环境及域名(配置方法可看www.bubaijun.com/page.php?id=118 有一段写了配置方法)然后执行代码

composer require tymon/jwt-auth 1.*@rc

然后直接发布配置文件

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

发布成功后生成密钥

php artisan jwt:secret

这时候再回头来注册Facade (config/app.php文件) 在aliases数组里添加两行代码

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

然后修改config/auth.php配置文件
将api数组的driver值token改为jwt

'api' => [
    'driver' => 'jwt', //这里原来是token
    'provider' => 'users',
],

接下来就是修改User模型
需要引入一个类

use Tymon\JWTAuth\Contracts\JWTSubject;

类名后面添加JWTSubject接口

class User extends Authenticatable implements JWTSubject

然后新增两个函数

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

public function getJWTCustomClaims()
{
    return [];
}

User模型完整代码

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Tymon\JWTAuth\Contracts\JWTSubject;

class User extends Authenticatable implements JWTSubject
{
    use Notifiable;

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

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];

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

    public function getJWTCustomClaims()
    {
        return [];
    }
}

新建路由群组(routes/api.php)

Route::group([
    'prefix' => 'auth'
], function ($router) {
    Route::post('login', 'AuthController@login');
    Route::post('logout', 'AuthController@logout');
    Route::post('me', 'AuthController@me');
});

根据路由定的控制器 需要生成这个控制器

php artisan make:controller AuthController

在控制器顶部引入Auth类

use Illuminate\Support\Facades\Auth;

在控制器内写一个构造方法 用于中间件验证

public function __construct()
{
    $this->middleware('auth:api', ['except' => ['login']]);
}

根据定义路由的时候就可知 有一个login路径,是用于登录获取Token,所以写一个login函数

public function login()
{
    $credentials = request(['email', 'password']);
    //验证邮箱及密码 如果不存在则直接返回错误信息
    if (! $token = auth('api')->attempt($credentials)) {
        return response()->json(['error' => 'User does not exist or password error'], 400);
    }
    //验证成功则直接返回Token 这里的respondWithToken是自定义函数 用于生成Token
    return $this->respondWithToken($token);
}

此时需要写一个生成Token的函数respondWithToken

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

有登录生成Token必然就有退出登录销毁Token,所以写一个logout函数用于退出

public function logout()
{
    auth('api')->logout();
    return response()->json(['status' => 200, 'message' => 'Exit successfully']);
}

此时已经能够登录获取Token并退出,再写一个函数me获取用户信息。

public function me()
{
    return response()->json(auth('api')->user());
    //如果要获取用户ID可以这样
    // return response()->json(auth('api')->id());
}

接下来就是使用Postman测试这些接口,由于此时并没有user数据表,也没有可用的用户数据用于登录。所以需要执行在env文件配置好数据库,然后执行代码

php artisan make:auth

然后执行数据迁移

php artisan migrate

如果报错则修改app/Providers/AppServiceProvider.php
在顶部加一行代码

use Illuminate\Support\Facades\Schema;

然后在boot函数加入

Schema::defaultStringLength(191);

再把数据库里的数据表删除,重新执行数据迁移

php artisan migrate

为了测试方便,打开配置好的域名注册一个账号。

1.jpg

注册完成后打开Postman,输入域名及账号邮箱和密码发起请求。
比如 www.token.test/api/auth/login    因为api.php这个路由配置里的路由都是带api前缀的。所以在auth前加一个/api

2.jpg

可见已经返回了一个Token,再尝试获取用户数据的接口www.token.test/api/auth/me,请求这个接口就需要在请求头带上Token,请求头Token的key是Authorization。还有Token值前需要带上bearer

3.jpg
最后退出销毁Token
接口:www.token.test/api/auth/logout 和获取信息时一样,需要带上Token

4.jpg
此时再使用获取用户数据的接口也无效。整个过程结束了。

另外说一下,如果没有PHP和Laravel基础看此文可能会比较难懂,当然 主要是我也没细写😐😐...
最近在写一个小程序的开源,对的,就是“坦白言”开源😳,之前有写文章记录下运维情况,而现在用户量死在了当时的6W+ 已经没人使用了。
有兴趣可看这两篇文章
www.bubaijun.com/page.php?id=113
www.bubaijun.com/page.php?id=112
由于时间紧迫,开源的代码质量应该一般,虽然公司项目不多,但每天都在自学。所以开源的代码后续再慢慢优化了。
开源的是小程序前端及后端,后端用Laravel框架。配置一下.env搭建在服务器就能直接用这套程序了。
未完待续,敬请期待...

本文地址 : bubaijun.com/page.php?id=121

版权声明 : 未经允许禁止转载!

评论:我要评论
发布评论:
Copyright © 不败君 粤ICP备18102917号-1

不败君

首 页 作 品 微 语