Lumen之JWT扩展包
JWT定义及其组成
官网链接:https://jwt.io/
JSON Web Token(JWT)是一个开放标准(RFC 7519),它定义了一种紧凑且独立的方式,可以在各方之间作为JSON对象安全地传输信息。此信息可以通过数字签名进行验证和信任。JWT可以使用秘密(使用HMAC算法)或使用RSA或ECDSA的公钥/私钥对进行签名。
虽然JWT可以加密以在各方之间提供保密,但我们将专注于签名令牌。签名令牌可以验证其中包含的声明的完整性,而加密令牌则隐藏其他方的声明。当使用公钥/私钥对签署令牌时,签名还证明只有持有私钥的一方是签署私钥的一方。
什么时候应该使用JSON Web令牌?
以下是JSON Web令牌有用的一些场景:
- 授权:这是使用JWT的最常见方案。一旦用户登录,每个后续请求将包括JWT,允许用户访问该令牌允许的路由,服务和资源。Single Sign On是一种现在广泛使用JWT的功能,因为它的开销很小,并且能够在不同的域中轻松使用。
- 信息交换:JSON Web令牌是在各方之间安全传输信息的好方法。因为JWT可以签名 - 例如,使用公钥/私钥对 - 您可以确定发件人是他们所说的人。此外,由于使用标头和有效负载计算签名,您还可以验证内容是否未被篡改。
集成JWT到lumen
1.下载lumen
composer create-project laravel/lumen lumen --prefer-dist "5.5.*"
2.安装JWT扩展
composer require tymon/jwt-auth:1.0.0-rc.2
配置
1.开启 Facade 和 Eloquent
取消以下行的注释。bootstrap/app.php
// $app->withFacades();
// $app->withEloquent();
2.开启中间件认证
取消以下行的注释。bootstrap/app.php
// $app->routeMiddleware([
// 'auth' => App\Http\Middleware\Authenticate::class,
// ]);
// $app->register(App\Providers\AuthServiceProvider::class);
3.添加服务提供者
bootstrap/app.php
$app->register(\Tymon\JWTAuth\Providers\LumenServiceProvider::class);
4.生成加***
# 这条命令会在 .env 文件下生成一个加***,如:JWT_SECRET=foobar
php artisan jwt:secret
5.更新你的模型
<?php
namespace App;
use Illuminate\Auth\Authenticatable;
use Laravel\Lumen\Auth\Authorizable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract;
class User extends Model implements AuthenticatableContract, AuthorizableContract
{
use Authenticatable, Authorizable;
}
6.注册两个 Facade
bootstrap/app.php
把原先去了注释的那一行再改一下。
$app->withFacades(true, [
'Tymon\JWTAuth\Facades\JWTAuth' => 'JWTAuth',
'Tymon\JWTAuth\Facades\JWTFactory' => 'JWTFactory',
]
);
7 设置 auth.php
把 \vendor\laravel\lumen-framework\config\auth.php
也复制到 项目根目录config
文件夹(没有就新建)。
'defaults' => [
'guard' => env('AUTH_GUARD', 'userApi'),
],
'guards' => [
'userApi' => [
'driver' => 'jwt',
'provider' => 'users'
],
],
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => \App\Model\User::class,
],
],
8 .注册路由
$router->post('user/login/{code}','User\[email protected]');
9. 创建 token 控制器
<?php
namespace App\Http\Controllers\User;
use App\Exceptions\ThrowException;
use App\Http\Controllers\Controller;
use App\Model\User;
use Illuminate\Http\Request;
use Ixudra\Curl\Facades\Curl;
use Tymon\JWTAuth\JWTAuth;
class LoginController extends Controller
{
protected $jwt;
public function __construct(JWTAuth $jwt)
{
$this->jwt = $jwt;
}
public function userLogin($result)
{
$user = User::where('openid',$result)->first();
$token = $this->jwt->fromUser($user);
return response()->json(compact('token'),200);
}
}
注意:
1.在Model中必须要有User模型
(Lumen 还精简了很多辅助函数,比如 auth 和 bcrypt 等。
可以安装 albertcht/lumen-helpers 补全)
2.安装一个composer require albertcht/lumen-helper