K先生个人博客

当前位置:首页 > 爱技术 > 正文

关于laravel的jwt认证教程我猜这才是新手最想看到的

最近在写一个前后端分离的项目,所以需要API,所以需要JWT身份验证。在网上搜laravel使用JWT的教程,没想到都是前篇一律,似乎都和laravel论坛的一篇JWT教程一个模子,不可否认,人家教程写的很好,但是我在“搬砖”的过程中遇到了问题,这种问题对于第一次使用JWT的人是很难受的,因为完全不知道问题出在了哪,在抓掉了几十根头发之后,我成功在laravel中把jwt-auth给跑通了。在这想吐槽一下jwt-auth的官方教程,真是写的“啥也不是”!差点放弃这个jwt-auth扩展包。 

对于新手,我相信最想看到,不是说教程写的有多详细,而是怎么能简单跑起来一个demo。 

下面是我抓掉几十根头发之后,总结出来的更快更简单的跑起来一个demo的方法。这里选择重新创建一个laravel项目并选择laravel6版本,至于为什么不用最新版的7,原因也很简单laravel6是LTS(长期支持)版本。

1、composer安装laravel6

composer create-project --prefer-dist laravel/laravel blog "6.*"

安装好之后记得把env文件中的数据库信息配置好再说。

2、安装jwt-auth扩展包

composer require tymon/jwt-auth:dev-develop --prefer-source

至于为什么不是官网的composer require tymon/jwt-auth命令,为什么后面多了个dev-developprefer-sourcedev-develop是指GitHub上的develop分支,持续更新的分支,而--prefer-source 会从github 上clone 源代码,不会在本地缓存,保留了.git文件夹,从而可以实现版本控制。适合用于修改源代码。

3、发布jwt配置文件

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

执行此命令会在config目录生成jwt.php 配置文件。

4、生成JWT密钥

php artisan jwt:secret

20200717170723847.png

这个密钥暂时用不到,并且在env文件中可以看到的,所以不用记哈。

5、注册 auth.jwt 中间件

打开app/Http/Kernel.php文件,然后:

protected $routeMiddleware = [
    ....
    'auth.jwt' => \Tymon\JWTAuth\Http\Middleware\Authenticate::class,
];

应该很容易看懂吧,在文件中找到$routeMiddleware数组,添加上边那一句就行了。

6、创建ApiController控制器

我们使用artisan命令快速创建ApiController控制器:

php artisan make:controller ApiController

控制器完整代码:

<?php

namespace App\Http\Controllers;

use App\User;
use Illuminate\Http\Request;
use JWTAuth;
use Tymon\JWTAuth\Exceptions\JWTException;

class ApiController extends Controller
{
    public $loginAfterSignUp = true;

    public function register(Request $request)
    {
        $user = new User();
        $user->name = $request->name;
        $user->email = $request->email;
        $user->password = bcrypt($request->password);
        $user->save();

        if ($this->loginAfterSignUp) {
            return $this->login($request);
        }

        return response()->json([
            'success' => true,
            'data' => $user
        ], 200);
    }

    public function login(Request $request)
    {
        $input = $request->only('email', 'password');
        $jwt_token = null;

        if (!$jwt_token = JWTAuth::attempt($input)) {
            return response()->json([
                'success' => false,
                'message' => 'Invalid Email or Password',
            ], 401);
        }

        return response()->json([
            'success' => true,
            'token' => $jwt_token,
        ]);
    }

    public function logout(Request $request)
    {
        $this->validate($request, [
            'token' => 'required'
        ]);

        try {
            JWTAuth::invalidate($request->token);

            return response()->json([
                'success' => true,
                'message' => 'User logged out successfully'
            ]);
        } catch (JWTException $exception) {
            return response()->json([
                'success' => false,
                'message' => 'Sorry, the user cannot be logged out'
            ], 500);
        }
    }

    public function getAuthUser(Request $request)
    {
        $this->validate($request, [
            'token' => 'required'
        ]);

        $user = JWTAuth::authenticate($request->token);

        return response()->json(['user' => $user]);
    }
}

7、开始写路由

因为JWT就是为API所生,所以我们直接把路由文件写到web/api.php文件中:

Route::post('login', 'ApiController@login');
Route::post('register', 'ApiController@register');
Route::group(['middleware' => 'auth.jwt'], function () {
    Route::get('logout', 'ApiController@logout');
    Route::get('user', 'ApiController@getAuthUser');
});

这几个路由应该就够体验JWT了。

8、更新user模型

JWT 需要在 User 模型中实现 Tymon\JWTAuth\Contracts\JWTSubject 接口。 此接口需要实现两个方法 getJWTIdentifier 和 getJWTCustomClaims。使用以下内容更新 app/User.php。

<?php

namespace App;

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

class User extends Authenticatable implements JWTSubject
{
    use Notifiable;
    protected $fillable = [
        'name', 'email', 'password',
    ];
    protected $hidden = [
        'password', 'remember_token',
    ];
    public function getJWTIdentifier()
    {
        return $this->getKey();
    }
    public function getJWTCustomClaims()
    {
        return [];
    }
}

为了减少代码长度,把这里面的注释都给删除了。看到这个代码你可能猛一看和原文件变化不大,只把后面的两个方法复制进了你的代码,嘿嘿,如果你这样干了,等着挠头吧。再多我就不说了,我可是因为这个问题,挠掉了好几十根头发呢,很想看看还会不会有其他小伙伴挠头。

9、你还需要一个users数据表

laravel6自带的是有一个users表的迁移文件的,我们直接执行它创建users表就行。

php artisan migrate

如果你执行这个数据库迁移的时候遇到了报错:Syntax error or access violation: 1071 Specified key was too long。不要慌,问题不大,我的个人博客中有对此报错最优的解决方法,推荐阅读:laravel6数据库迁移报错: Syntax error or access violation: 1071 Specified key was too long的解决方法

10、开始测试

先测试注册接口:http://www.larjwt.test/api/register(本地域名哈) 

这里用的测试工具是RunApi,当然你也可以用postman

laravel6配置jwt测试注册接口从图中可以看到,注册成功,返回了一个token值。 

测试登录接口:http://www.larjwt.test/api/login 

用的邮箱和密码就是上一步注册的哈,成功之后返回的也是一个token值。

laravel6配置jwt测试登录接口

测试获取账号信息接口:http://www.larjwt.test/api/user 

这次我们直接用我们上两部返回的token值去请求,从图中可以看到,是能成功获取信息的。

laravel6配置jwt测试获取账户信息接口

到这文章也就结束了,不知道你按照此教程操作是不是顺利,很负责任的告诉大家,这个教程我自己跑了好几遍,都没有问题。如果你还是遇到了问题,我只能说声抱歉了。

还有有问题欢迎留言哈,博主会第一时间回复。

作者K先生本文地址http://www.gold404.cn/info/90

版权声明:本文为原创文章,版权归 K先生个人博客 所有,欢迎分享本文,转载请保留出处,谢谢!

文章评论

* 必填
可选
可选

评论列表