快速开始

未匹配的标注

在继续之前,请确保您已按照 LaravelLumen 的安装说明安装了该软件包。

更新您的 User 模型

首先,您需要在 User 模型上实现 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 主题声明中的标识符。
     *
     * @return mixed
     */
    public function getJWTIdentifier()
    {
        return $this->getKey();
    }

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

配置认证守卫

注意:这将仅在您使用 Laravel 5.2 及更改版本时有效。

config/auth.php 文件中,您将需要进行一些更改以配置 Laravel 使用 jwt 守卫来支持您的应用程序进行身份认证。

对文件进行以下更改:

'defaults' => [
    'guard' => 'api',
    'passwords' => 'users',
],

...

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

这里我们告诉 api 守卫使用 jwt 驱动程序,我们将 api 守卫设置为默认。

我们现在可以使用 Laravel 内置的认证系统,由 jwt-auth 完成幕后工作!

添加一些简单的认证路由

首先,让我们在 routes/api.php 添加一些路由,如下所示:

Route::group([

    'middleware' => 'api',
    'prefix' => 'auth'

], function ($router) {

    Route::post('login', 'AuthController@login');
    Route::post('logout', 'AuthController@logout');
    Route::post('refresh', 'AuthController@refresh');
    Route::post('me', 'AuthController@me');

});

创建 AuthController

然后创建 AuthController,手动或运行 artisan 命令:

php artisan make:controller AuthController

然后添加以下内容:

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Controller;

class AuthController extends Controller
{
    /**
     * 创建一个新的 AuthController 实例。
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('auth:api', ['except' => ['login']]);
    }

    /**
     * 通过给定的凭证获取 JWT。
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function login()
    {
        $credentials = request(['email', 'password']);

        if (! $token = auth()->attempt($credentials)) {
            return response()->json(['error' => 'Unauthorized'], 401);
        }

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

    /**
     * 获取已认证的用户。
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function me()
    {
        return response()->json(auth()->user());
    }

    /**
     * 注销用户(作废 token)。
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function logout()
    {
        auth()->logout();

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

    /**
     * 刷新 token。
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function refresh()
    {
        return $this->respondWithToken(auth()->refresh());
    }

    /**
     * 获取 token 数组结构。
     *
     * @param  string $token
     *
     * @return \Illuminate\Http\JsonResponse
     */
    protected function respondWithToken($token)
    {
        return response()->json([
            'access_token' => $token,
            'token_type' => 'bearer',
            'expires_in' => auth()->factory()->getTTL() * 60
        ]);
    }
}

您现在应该能使用一些有效的凭证 POST 到登录端点(例如:http://example.dev/auth/login)并看到如下响应:

{
    "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ",
    "token_type": "bearer",
    "expires_in": 3600
}

然后可以使用该 token 向您的应用程序发出身份已验证的请求。

身份已验证的请求

有很多方法可以通过 http 发送 token:

认证头

Authorization: Bearer eyJhbGciOiJIUzI1NiI...

查询字符串参数

http://example.dev/me?token=eyJhbGciOiJIUzI1NiI...

Post 参数

Cookies

Laravel 路由参数

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 0
发起讨论 查看所有版本


暂无话题~