关于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

laravel6生成JWT密钥
这个密钥暂时用不到,并且在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

控制器完整代码:



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



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
关于laravel的jwt认证教程我猜这才是新手最想看到的_第1张图片
从图中可以看到,注册成功,返回了一个token值。
测试登录接口:http://www.larjwt.test/api/login
用的邮箱和密码就是上一步注册的哈,成功之后返回的也是一个token值。
关于laravel的jwt认证教程我猜这才是新手最想看到的_第2张图片
测试获取账号信息接口:http://www.larjwt.test/api/user
这次我们直接用我们上两部返回的token值去请求,从图中可以看到,是能成功获取信息的。
关于laravel的jwt认证教程我猜这才是新手最想看到的_第3张图片
到这文章也就结束了,不知道你按照此教程操作是不是顺利,很负责任的告诉大家,这个教程我自己跑了好几遍,都没有问题。如果你还是遇到了问题,我只能说声抱歉了。
最后,想邀请大家到我的个人博客参观一下,虽然目前日IP才二百多,但这每天都在进步,希望得到大家的鼓励(可以做友链哈)。
K先生个人博客

你可能感兴趣的:(PHP技术,laravel,php,jwt,api)