jwt的使用

laravel8-使用jwt

jwt-官方网址
https://jwt-auth.readthedocs.io/en/develop/laravel-installation

安装

    第一步:composer拉取最新版本

        composer require tymon/jwt-auth

    第二步:添加服务提供者(Laravel 5.4 或以下)
    将服务提供者添加到配置文件 config/app.php 中的 providers 数组中,如下所示:

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

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

 

    第三步:运行以下命令发布包配置文件

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

运行完后应该有一个 config/jwt.php 文件,允许配置此包的基础知识

    第四步:运行以下命令生成一个密钥

php artisan jwt:secret

运行完后.env文件会生成一个 JWT_SECRET

在laravel项目中配置

    第一步:配置 config/auth.php
    在 config/auth.php 中,将 api 的 driver 驱动改为 jwt


   
    然后注册自己写的model
   
    具体代码
    - 控制器-新建 AuthController

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\User;
use Illuminate\Support\Facades\Auth;
use Tymon\JWTAuth\Facades\JWTAuth;

class AuthController extends Controller
{
    /**
     * Create a new AuthController instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('auth:api', ['except' => ['login']]);
    }

    /**
     * Get a JWT via given credentials.
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function login(Request $request)
    {
        $credentials = $request->only('name', 'password');

        if (count($credentials) < 2) {
            return response()->json(['error' => 'Unauthorized'], 401);
        }

        $user = User::where('name', $credentials['name'])
            ->where('password', ($credentials['password']))
            ->first();

        if (empty($user) || !$token = JWTAuth::fromUser($user)) {
            return response()->json(['error' => 'Unauthorized'], 401);
        }

        return $this->respondWithToken($token);

    }

    /**
     * Get the authenticated User.
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function me()
    {
        return response()->json(auth('api')->user());
    }

    /**
     * Log the user out (Invalidate the token).
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function logout()
    {
        auth('api')->logout();

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

    /**
     * Refresh a token.
     * @return \Illuminate\Http\JsonResponse
     */
    public function refresh()
    {
        return $this->respondWithToken(auth('api')->refresh());
    }

    /**
     * Get the token array structure.
     *
     * @param  string $token
     *
     * @return \Illuminate\Http\JsonResponse
     */
    protected function respondWithToken($token)
    {
        return response()->json([
            'access_token' => $token,
            'token_type' => 'bearer',
            'expires_in' => auth('api')->factory()->getTTL() * 60
        ]);
    }
}

  

- Model-新建 User

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Tymon\JWTAuth\Contracts\JWTSubject;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable implements JWTSubject
{
    use Notifiable;

    protected $table = 'users';

    // Rest omitted for brevity

    /**
     * Get the identifier that will be stored in the subject claim of the JWT.
     *
     * @return mixed
     */
    public function getJWTIdentifier()
    {
        return $this->getKey();
    }

    /**
     * Return a key value array, containing any custom claims to be added to the JWT.
     *
     * @return array
     */
    public function getJWTCustomClaims()
    {
        return [];
    }
}

Hertz JWT 使用通常涉及到在 API 开发中对访问控制、身份验证和授权的管理。JWT (JSON Web Token) 是一种开放标准,用于安全地传输数据作为令牌,并可以在客户端和服务端之间进行验证。当结合 Hertz 框架使用时,可以有效提升 RESTful API 的安全性。 ### Hertz 中 JWT 的应用 1. **身份验证**:通过 JWT 提供了一个自包含的身份认证机制,允许客户端一次性携带身份信息,在请求过程中不需要再次提供凭证。 2. **权限控制**:JWT 可以携带用户角色或其他授权信息,服务端可以根据这些信息做出相应的访问决策。 3. **状态无状态性**:由于 JWT 是自包含的,它消除了对会话存储的需求,使得应用程序更易于分布式部署。 4. **加密与签名**:使用哈希算法如 HMAC 或 RSA 进行签名,保证了数据的完整性和来源的可信度。 ### 实现步骤 #### 客户端生成 JWT 1. 发起一次认证请求给服务器,例如登录请求,返回包含用户名等信息的响应。 ```http POST /login HTTP/1.1 Host: example.com username=example_user&password=example_password ``` 2. 服务器验证凭据并生成 JWT,通常包括 token、过期时间等字段,并将其返回给客户端。 ```json { "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c", "exp": 1682797600, // 其他信息... } ``` #### 服务端验证 JWT 1. 接收到请求,从请求头(通常是 `Authorization` 字段)提取 JWT。 ```http GET /protected-resource HTTP/1.1 Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c ``` 2. 使用相同的密钥解码 JWT,并验证其完整性及有效性。 3. 根据 JWT 中的信息进行授权处理,如检查用户角色、过期时间等。 ### 相关问题: 1. **如何确保 JWT 在传输过程中的安全性?** 使用 HTTPS 协议保护数据传输的安全,防止中间人攻击。同时,可以采用 AES 加密或其他更高级别的加密技术来进一步增强安全性。 2. **如何在 Hertz 框架中集成 JWT 验证机制?** 可以使用第三方库(如 gjwt)简化 JWT 验证的过程,或者自定义实现验证逻辑。这通常涉及拦截 HTTP 请求,读取 JWT使用预设的密钥进行解码和验证。 3. **JWT 的生命周期管理有哪些注意事项?** - 确保设置合理的过期时间,避免长时间有效性的 JWT 被滥用。 - 定期清理无效或已撤销的 JWT,减少资源消耗和潜在的风险。 - 对敏感操作如账户更改密码等,考虑使用短生命周期的刷新令牌而非原始的访问令牌。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值