4. 认证 - frowhy/modular GitHub Wiki

默认采用 JWT-AUTH 进行认证

生成密钥

php artisan jwt:secret

更新你的用户模型

首先,需要在用户模型上实现 Tymon\JWTAuth\Contract\JWTSubject 契约,这需要实现 getJWTIdentifier()getJWTCustomClaims() 两个方法。

下面的示例应该可以让您了解这是如何实现的。显然,您应该根据自己的需要进行必要的更改。

<?php

namespace Modules\Education\Entities;

use App\User as BaseUser;
use Modules\Core\Traits\CamelMutatorTrait;
use Tymon\JWTAuth\Contracts\JWTSubject;

class User extends BaseUser implements JWTSubject
{
    use CamelMutatorTrait;

    protected $fillable = [];

    /**
     * @return mixed
     */
    public function getJWTIdentifier()
    {
        return $this->getKey();
    }

    /**
     * @return array
     */
    public function getJWTCustomClaims()
    {
        return [
            'scopes' => ['basis' => '基础'],
        ];
    }
}

配置身份验证警卫

config/auth.php 文件中,您需要做一些更改来配置 Laravel,以使用 jwt 保护来支持应用程序身份验证。对文件做以下更改:

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

添加一些基本的身份验证路由

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

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

经过身份验证的请求

请通过 HeaderAuthorization 字段发送令牌

Authorization: Bearer eyJhbGciOiJIUzI1NiI...

方法

以下方法可用于 Auth 守卫实例。

多个守卫

如果新创建的 api 守卫没有设置为默认守卫,或者您已经定义了多个守卫来处理身份验证,那么您应该在调用 auth() 时指定该守卫。

$token = auth('api')->attempt($credentials);

attempt()

尝试通过某些凭据对用户进行身份验证。

// 如果凭据有效,则为用户生成令牌
$token = auth()->attempt($credentials);

这将返回 jwtnull

login()

登录用户并为他们返回 jwt

// 从某个地方获得一些用户
$user = User::first();

// 获得令牌
$token = auth()->login($user);

user()

获取当前经过身份验证的用户。

// 获取当前经过身份验证的用户
$user = auth()->user();

如果用户没有通过身份验证,那么将返回 null

userOrFail()

获取当前经过身份验证的用户或抛出异常。

try {
    $user = auth()->userOrFail();
} catch (\Tymon\JWTAuth\Exceptions\UserNotDefinedException $e) {
    // do something
}

如果没有设置用户,那么将抛出 Tymon\JWTAuth\Exceptions\UserNotDefinedException

logout()

注销用户—这将使当前令牌无效,并取消已验证用户的设置。

auth()->logout();

// 传递 `true` 以强制将令牌列入黑名单 `永久`
auth()->logout(true);

refresh()

刷新令牌,使当前令牌无效

$newToken = auth()->refresh();

// 传递 `true` 作为第一个参数强制令令牌被列入 `永久` 黑名单。
// 第二个参数将重置新令牌的声明
$newToken = auth()->refresh(true, true);

invalidate()

令牌无效(将其添加到黑名单中)

auth()->invalidate();

// 传递 `true` 作为第一个参数强制令令牌被列入 `永久` 黑名单。
auth()->invalidate(true);

tokenById()

根据给定用户的 id 获取令牌。

$token = auth()->tokenById(123);

payload()

获取原始 JWT 有效载荷

$payload = auth()->payload();

// 然后你就可以直接访问声明了。
$payload->get('sub'); // = 123
$payload['jti']; // = 'asfe4fq434asdf'
$payload('exp') // = 123456
$payload->toArray(); // = ['sub' => 123, 'exp' => 123456, 'jti' => 'asfe4fq434asdf'] etc

validate()

验证用户的凭据

if (auth()->validate($credentials)) {
    // credentials are valid
}

更高级的用法

添加自定义声明

$token = auth()->claims(['foo' => 'bar'])->attempt($credentials);

添加权限范围

$token = auth()->claims(['scopes' => ['basis' => '基础']])->attempt($credentials);

显式设置令牌

$user = auth()->setToken('eyJhb...')->user();

显式设置请求实例

$user = auth()->setRequest($request)->user();

覆盖令牌 TTL

$token = auth()->setTTL(7200)->attempt($credentials);