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');
});
经过身份验证的请求
请通过 Header
的 Authorization
字段发送令牌
Authorization: Bearer eyJhbGciOiJIUzI1NiI...
方法
以下方法可用于 Auth
守卫实例。
多个守卫
如果新创建的 api
守卫没有设置为默认守卫,或者您已经定义了多个守卫来处理身份验证,那么您应该在调用 auth()
时指定该守卫。
$token = auth('api')->attempt($credentials);
attempt()
尝试通过某些凭据对用户进行身份验证。
// 如果凭据有效,则为用户生成令牌
$token = auth()->attempt($credentials);
这将返回 jwt
或 null
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);