Nodjoy

只做了一点微小的工作


  • 首页

  • 技术

  • 笔记

  • 杂记

  • 分享

  • 归档

  • 关于

  • 站点监控

  • 服务监控

  • 搜索

  • GitHub

  • Instagram

  • Weibo

  • Email

  • Bilibili

  • Bento

  • 抖音

  • 打赏

  • 在线笔记

  • 在线文档

  • 域名证书管理

  • 云盘

  • Download Hub

  • DockerHub Mirror

  • Harbor

  • Quick Reference

  • Linux 命令查询

  • Mock 模拟数据

  • 文档预览服务
友链
  • milu杰克
  • 小菜
close

Laravel Api开发之Dingo&Jwt的使用

时间: 2020-09-22   |   分类: 笔记     |   阅读: 1256 字 ~3分钟

Dingo

安装组件

composer require dingo/api:2.x

生成配置文件

php artisan vendor:publish

执行命令后会生成config/api.php配置文件

config/api.php 配置说明

#接口围绕:[x]本地和私有环境 [prs]公司内部app使用 [vnd]公开接口
'standardsTree' => env('API_STANDARDS_TREE', 'x')

#项目名称
'subtype' => env('API_SUBTYPE', 'hdcms')

#Api前缀 通过 www.hdcms.com/api 来访问 API。
'prefix' => env('API_PREFIX', 'api')

#api域名
'domain' => env('API_DOMAIN', 'api.hdcms.com'),

#版本号
'version' => env('API_VERSION', 'v1')

#开发时开启DEBUG便于发现错误
'debug' => env('API_DEBUG', false)

接口版本–在routes/api.php中定义

$api = app(\Dingo\Api\Routing\Router::class);

#默认配置指定的是v1版本,可以直接通过 {host}/api/version 访问到
$api->version('v1', function ($api) {
    $api->get('version', function () {
        return 'v1';
    });
});

#如果v2不是默认版本,需要设置请求头  
#Accept: application/[配置项 standardsTree].[配置项 subtype].v2+json
$api->version('v2', function ($api) {
    $api->get('version', function () {
        return 'v2';
    });
});

基础控制器

php artisan make:controller Api/Controller
namespace App\Http\Controllers\Api;

use Dingo\Api\Routing\Helpers;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller as SysController;

class Controller extends SysController
{
    use Helpers;
}

响应结果–设置响应状态码

return $this->response->array(User::get())->setStatusCode(200);

return response()->json(['error' => 'Unauthorized'], 401);

错误响应

// 一个自定义消息和状态码的普通错误。
return $this->response->error('This is an error.', 404);

// 一个没有找到资源的错误,第一个参数可以传递自定义消息。
return $this->response->errorNotFound();

// 一个 bad request 错误,第一个参数可以传递自定义消息。
return $this->response->errorBadRequest();

// 一个服务器拒绝错误,第一个参数可以传递自定义消息。
return $this->response->errorForbidden();

// 一个内部错误,第一个参数可以传递自定义消息。
return $this->response->errorInternal();

// 一个未认证错误,第一个参数可以传递自定义消息。
return $this->response->errorUnauthorized('帐号或密码错误');

限制请求次数

使用 api.throttle中间件结合 limit、expires 参数可实现接口次数限制

$api->version('v1', ['namespace' => '\App\Api'], function ($api) {
    $api->group(['middleware' => 'api.throttle', 'limit' => 2, 'expires' => 1], function ($api) {
        $api->get('user', 'UserController@all');
    });
});

限制1分钟只能访问2次

Jwt

安装组件

composer require tymon/jwt-auth:2.x

生成配置文件

php artisan vendor:publish

生成密钥

php artisan jwt:secret

这将用 JWT_SECRET=foobar 更新.env文件

配置说明

JWT配置文件是 config/jwt.php

#令牌过期时间(单位分钟),设置null为永不过期
'ttl' => env('JWT_TTL', 60)

#刷新令牌时间(单位分钟),设置为null可永久随时刷新
'refresh_ttl' => env('JWT_REFRESH_TTL', 20160)

更新用户模型示例

首先,您需要在用户模型上实现 Tymon\JWTAuth\Contracts\JWTSubject 契约,它要求您实现两个方法 getJWTIdentifier() 和 getJWTCustomClaims()

namespace App;

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

class User extends Authenticatable implements JWTSubject
{
    use Notifiable;

    /**
     * 获取将存储在JWT主题声明中的标识符.
     * 就是用户表主键 id
     *
     * @return mixed
     */
    public function getJWTIdentifier()
    {
        return $this->getKey();
    }

    /**
     * 返回一个键值数组,其中包含要添加到JWT的任何自定义声明.
     *
     * @return array
     */
    public function getJWTCustomClaims()
    {
        return [];
    }
}

配置验证守卫

修改 config/auth.php 文件以使用jwt保护来为接口身份验证提供支持

'guards' => [
	'web' => [
		'driver' => 'session',
		'provider' => 'users',
	],
	'api' => [
		'driver' => 'jwt',
		'provider' => 'users',
	],
]

修改dingo配置文件 config/api.php 文件中的身份验证提供者

'auth' => [
	'jwt' => \Dingo\Api\Auth\Provider\JWT::class,
],

验证操作

路由定义

$api = app(\Dingo\Api\Routing\Router::class);
$api->version('v1', ['namespace' => 'App\Http\Controllers\Api',], function ($api) {
    $api->post('login', 'AuthController@login');
    $api->get('logout', 'AuthController@logout');
    $api->get('me', 'AuthController@me');
});

控制器定义

class AuthController extends Controller
{
    public function __construct()
    {
    	// 除login外都需要验证
        $this->middleware('auth:api', ['except' => ['login']]);
    }

    //登录获取token
    public function login()
    {
        $credentials = request(['email', 'password']);

        if (!$token = auth('api')->attempt($credentials)) {
			return $this->response->errorUnauthorized('帐号或密码错误');
        }

        return $this->respondWithToken($token);
    }

    //获取用户资料
    public function me()
    {
        return response()->json(auth('api')->user());
    }

    //销毁token
    public function logout()
    {
        auth('api')->logout();

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

    //刷新token
    public function refresh()
    {
        return $this->respondWithToken(auth('api')->refresh());
    }

    //响应token
    protected function respondWithToken($token)
    {
        return response()->json([
            'access_token' => $token,
            'token_type'   => 'bearer',
            'expires_in'   => auth('api')->factory()->getTTL() * 60,
        ]);
    }
}

使用令牌

在postman 工具中可以使用以下方式操作


喜欢这篇文章的话 打赏一下吧!

Wechat Alipay

#PHP# #Laravel# #Api#
php安装Oracle扩展oci8
Larvel-使用Seeder生成测试数据
  • 文章目录
  • 站点概览
Nodjoy

Nodjoy

Developer & Acceleration Engineer⏩

GitHub Instagram Weibo Email Bilibili Bento 抖音 打赏
52 日志
4 分类
64 标签
工具站
在线笔记 在线文档 域名证书管理 云盘 Download Hub DockerHub Mirror Harbor Quick Reference Linux 命令查询 Mock 模拟数据 文档预览服务
友情链接
  • milu杰克
  • 小菜
  • Dingo
    • 安装组件
    • 生成配置文件
    • config/api.php 配置说明
    • 接口版本–在routes/api.php中定义
    • 基础控制器
    • 响应结果–设置响应状态码
    • 错误响应
    • 限制请求次数
  • Jwt
    • 安装组件
    • 生成配置文件
    • 生成密钥
    • 配置说明
    • 更新用户模型示例
    • 配置验证守卫
    • 验证操作
    • 使用令牌
京ICP备17004223号 © 2020 - NODJOY.
Powered by - HUGO
Theme by - NexT
访客量 -
0%