IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> 在Lumen中使用jwt生成token和鉴权 -> 正文阅读

[PHP知识库]在Lumen中使用jwt生成token和鉴权

在Lumen中使用jwt生成token和鉴权

参考:https://blog.csdn.net/weixin_43303732/article/details/90443408

步骤:

  1. 添加依赖包:tymon/jwt-auth
  2. 生成密钥
  3. 启用jwt
  4. 修改Model
  5. 编写接口,生成token
  6. 配置鉴权
  7. 编写接口,测试用auth中间件鉴权

1) 添加依赖:

composer require tymon/jwt-auth

2)生成密钥

.env 文件下生成一个加密密钥

php artisan jwt:secret

3) 启用jwt

修改文件:bootstrap\app.php

$app->register(Tymon\JWTAuth\Providers\LumenServiceProvider::class); // 添加代码(启用jwt)

4)修改模型(Model)

<?php
namespace App\Models;

use Tymon\JWTAuth\Contracts\JWTSubject;

class User extends Model implements AuthenticatableContract, AuthorizableContract, JWTSubject
{
    use Authenticatable, Authorizable, HasFactory;

    ....// 获取用户标识(即:用户的id,对应于生成的token的payload中的sub字段)
    public function getJWTIdentifier()
    {
        return $this->getKey();
    }
 
    // payload中附加的自定义数据
    public function getJWTCustomClaims()
    {
        return [
            'data'=>$this->data
        ];
    }
}

5)编写接口,生成token

新建文件:app\Http\Controllers\AuthController.php

<?php

namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\Http\Request;

class AuthController
{
	// 为登录正确的用户生成token
    public function postLogin(Request $request)
    {
        $username = $request->json('username');
        $password = $request->json('password');
        
        // 数据库可以自已建一个表名叫users的表,要有name和password字段.
        $user = User::where('name', $username)->where('password', $password)->first();

		// payload中添加自定义数据
        $user->data = [
            'nickname'=>'测试',
            'username'=>$username,
            'url'=>'url'
        ];

        if ($user) {
            $token = Auth::login($user); // 生成token

            return [
                'status'=>200,
                'data'=>[
                    'token'=>$token
                ]
            ];
        }else{
            return [
                'status'=>500,
                'message'=>'帐号不存在'
            ];
        }
    }
}

添加路由:routes\web.php

$router->post('/api/auth/login', '\App\Http\Controllers\AuthController@postLogin');

测试:

POST http://xxxx/api/auth/login
Content-Type:application/json
{
  "username":"test",
  "password":"123456"
}

返回:(https://tool.box3.cn/jwt.html 可以查看token解析出的结果,payload中的[sub]即数据库用户的id)

{
"status": 200,
"data":{
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC92Y2hhdGJvdC5sb2NcL2FwaVwvYXV0aFwvbG9naW4iLCJpYXQiOjE2MzEwODYyMTcsImV4cCI6MTYzMTA4OTgxNywibmJmIjoxNjMxMDg2MjE3LCJqdGkiOiJ4RXdEeThGcE5KM09NdUdoIiwic3ViIjoxLCJwcnYiOiIyM2JkNWM4OTQ5ZjYwMGFkYjM5ZTcwMWM0MDA4NzJkYjdhNTk3NmY3IiwiZGF0YSI6eyJuaWNrbmFtZSI6Ilx1NmQ0Ylx1OGJkNSIsInVzZXJuYW1lIjoidGVzdCIsInVybCI6InVybCJ9fQ.GmFd5AgT2FOzkW3O_c10dUPdRLj7FDLiu_HHZxqR0f4"
}
}

6)配置鉴权

检查文件是否存在:config\auth.php

如果不存在可以把:vendor\laravel\lumen-framework\config\auth.php复制过来。

修改文件:config\auth.php

'guards' => [
    'api' => [
        		'driver' => 'jwt', // 使用jwt
                'provider' => 'users' // 使用providers中的users节的配置
             ], 
],

'providers' => [
        'users' => [
            'driver' => 'eloquent', // 使用数据库模型(鉴权方法依赖数据库)
            'model' => \App\Models\User::class, // 具体的模型(生成token时的用户来源)
        ],
    ],

修改文件:bootstrap\app.php

$app->configure('auth'); // 添加代码
$app->routeMiddleware([
    'auth' => App\Http\Middleware\Authenticate::class, // 打开注释
]);
$app->register(App\Providers\AuthServiceProvider::class); // 打开注释

7)编写接口,测试用auth中间件鉴权

控制器中添加方法:app\Http\Controllers\AuthController.php

    public function test(Request $request)
    {
        var_dump(Auth::user()->id);
    }

配置路由:

$router->group([
    'prefix'=>'api/jwt', 
    'middleware'=>'auth' // 使用在bootstrap\app.ph中打开的中间件鉴权
], function() use ($router){
    $router->get('test', '\App\Http\Controllers\AuthController@test');
});

测试:

GET http://xxxx/api/jwt/test
Authorization:Bearer 这里填token(Bearer+空格+token)

返回:

int(1)

如token无效返回:

Unauthorized.

注:

jwt的配置参数可以查看:vendor\tymon\jwt-auth\config\config.php

可以使用vendor\tymon\jwt-auth\src\Http\Middleware\Authenticate.php代替默认的鉴权中间件。

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-09-09 11:30:33  更:2021-09-09 11:31:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:40:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码