欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

Laravel 使用 JWT 实现用户认证

JWT(JSON Web Token)是一个用于安全信息传输的开放标准。基于 JWT 的用户认证,用户只需登录一次,服务端生成 Token(令牌)并发送给客户端,客户端则在每次发送请求时携带该 Token ,服务端根据 Token 识别用户身份。

一个 JSON Web Token 是用 base64 编码的长字符串,包含了验证用户身份所需的必要信息。


1
2
3

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxIiwiaXNzIjoiaHR0cDpcL1wvbG9jYWx
ob3N0OjgwMDFcL2F1dGhcL2xvZ2luIiwiaWF0IjoxNDUxODg4MTE5LCJleHAiOjE0NTQ1MTYxMTksIm5iZiI6MTQ1MTg4OD
ExOSwianRpIjoiMzdjMTA3ZTQ2MDlkZGJjYzljMDk2ZWE1ZWU3NmM2NjcifQ.wyoQ95RjAyQ2FF3aj8EvCSaUmeP0KUqcCJDENNfnaT4

这里对 JWT 规范不加赘述,只讨论如何快速实现基于 JWT 的用户认证。如果想进一步了解 JWT 规范,建议阅读 官方文档 。

安装

使用 Composer 安装 jwt-auth 依赖包。


1

composer require tymon/jwt-auth 0.5.*

配置

在 config\app.php 配置文件中,注册服务提供者和门面。


1
2
3
4

'providers' => [
...
Tymon\JWTAuth\Providers\JWTAuthServiceProvider::class
],

1
2
3
4
5

'aliases' => [
...
'JWTAuth' => Tymon\JWTAuth\Facades\JWTAuth::class,
'JWTFactory' => Tymon\JWTAuth\Facades\JWTFactory::class
],

执行以下命令发布 JWT 配置文件。该命令将在 config 目录下生成 jwt.php ,通常使用默认配置即可。


1

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

生成用于加密数据的密钥。


1

php artisan jwt:generate

创建

引用 JWTAuth 门面和异常处理类。


1
2

use JWTAuth;
use Tymon\JWTAuth\Exceptions\JWTException;

使用请求中的登录凭据(通常是邮箱和密码)创建 Token 。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

public function authenticate(Request $request)
{
// 获取请求中的登录凭据
$credentials = $request->only('email', 'password');
 
try {
// 验证登录凭据并创建 Token
if (! $token = JWTAuth::attempt($credentials)) {
// 登录凭据无效时返回错误
return response()->json(['error' => 'invalid_credentials'], 401);
}
} catch (JWTException $e) {
// 无法正常生成 Token 时返回错误
return response()->json(['error' => 'could_not_create_token'], 500);
}
 
// 返回创建的 Token
return response()->json(compact('token'));
}

登录凭据也可以是任何用户表里存在的字段,譬如手机号和密码。


1

$credentials = $request->only('mobile', 'password');

我们还可以直接基于用户模型对象创建 Token ,满足更为个性化的认证需求。


1
2
3

$user = User::first();
$token = JWTAuth::fromUser($user);
return $token;

认证

在 app\Http\Kernel.php 中注册 JWT 提供的认证中间件。


1
2
3
4

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

对需要认证才能访问的路由启用该中间件。


1
2
3

Route::group(['middleware' => 'jwt.auth'], function () {
...
});

jwt.auth 中间件将会解析请求中携带的 Token 。如果找不到 Token ,则返回“token_not_provided”错误;如果 Token 已过期,则返回“token_expired”错误。

客户端在请求的头部信息或 URL 中携带有效的 Token 即可通过认证。


1

Authorization: Bearer { Token }

1

服务端可以从 Token 中获得用户对象。


1

$user = JWTAuth::parseToken()->authenticate();

ENV: Windows7 x64 / VirtualBox 5.1.8 / Laravel Homestead / Laravel 5.4

来自 https://www.caiyiming.com/article/20170611130033.html

普通分类: