资讯专栏INFORMATION COLUMN

API 鉴权新姿势 - 签名鉴权

ormsf / 2368人阅读

摘要:鉴权这是一个的鉴权包,采用密钥加密的鉴权方式,只要客户端不被反编译从而泄露密钥,该鉴权方式理论上来说是安全的不考虑量子计算机的出现。签名重复,规定时间内出现两次或以上相同的签名。

laravel-api-auth

laravel API 鉴权

这是一个 laravel 的 API 鉴权包, laravel-api-auth 采用密钥加密的鉴权方式,只要客户端不被反编译从而泄露密钥,该鉴权方式理论上来说是安全的(不考虑量子计算机的出现)。

项目地址: github.com/96qbhy/laravel-api-auth

安装
composer require 96qbhy/laravel-api-auth
配置

注册 ServiceProvider:

QbhyLaravelApiAuthServiceProvider::class,

laravel 5.5+ 版本不需要手动注册

发布配置文件

php artisan vendor:publish --provider="QbhyLaravelApiAuthServiceProvider"

AppHttpKernal 中注册中间件

protected $routeMiddleware = [
    "api_auth" => QbhyLaravelApiAuthLaravelApiAuthMiddleware::class,
    // other ...
];

添加 role

php artisan api_auth

然后按照格式把 access_keysecret_key 添加到, config/api_auth.php 里面的 roles 数组中。

"roles" => [
    "{access_key}" => [
        "name" => "{role_name}",        // 角色名字,例如 android
        "secret_key" => "{secret_key}",
    ],
],

自定义签名方法 (可选)
config/api_auth.php 中的 encrypting 可以修改为自定义的签名函数,该函数将传入三个参数: 密钥: $secret_key、随机字符串: $echostr、时间戳: $timestamp,返回签名后的字符串。该函数默认为:

/**
 * @param $secret_key
 * @param $echostr
 * @param $timestamp
 * @return string
 */
function encrypting($secret_key, $echostr, $timestamp) {
    return md5($secret_key . $echostr . $timestamp);
}

自定义签名校验规则(可选)
config/api_auth.php 中的 rule 可以修改为自定义的校验函数,该函数将传入三个参数: 密钥: $secret_key、客户端签名: $signature、服务端签名: $server_signature,必须返回布尔值。该函数默认为:

/**
 * @param $secret_key
 * @param $signature
 * @param $server_signature
 * @return bool
 */
function rule($secret_key, $signature, $server_signature)
{
    return $signature === $server_signature;
}

自定义错误处理(可选)
config/api_auth.php 中的 error_handler 可以修改为自定义的错误处理函数,该函数将传入两个参数: 请求: $request、错误码: $code。该函数默认为:

/**
 * @param Request $request
 * @param int $code
 * @return IlluminateHttpJsonResponse
 */
function error_handler($request, $code)
{
    return response()->json([
        "msg" => "Forbidden",
        "code" => $code
    ], 403);
}  

$code 可能是以下几个值中的一个:

LaravelApiAuthMiddleware::LACK_HEADER -> 缺少请求头。

LaravelApiAuthMiddleware::ACCESS_KEY_ERROR -> access_key 错误。

LaravelApiAuthMiddleware::SIGNATURE_ERROR -> 签名错误。

LaravelApiAuthMiddleware::SIGNATURE_LAPSE -> 签名失效,客户端签名时间和服务端签名时间差超过设置的 timeout 值。

LaravelApiAuthMiddleware::SIGNATURE_REPETITION -> 签名重复,规定时间内出现两次或以上相同的签名。

使用 路由中
Route::get("api/example", function(Request $request){
    // $request->get("client_role");
    // todo...
})->middleware(["api_auth"]);
 or
Route::group(["middleware"=>"api_auth"], function(){
    // routes...
});

通过验证后 $request 会添加一个 client_role 字段,该字段为客户端的角色名称。

前端
import axios from "axios";

const access_key = "{access_key}";  // 服务端生成的 access_key
const secret_key = "{secret_key}";  // 服务端生成的 secret_key

const timestamp = Date.parse(new Date()) / 1000;    // 取时间戳
const echostr = "asldjaksdjlkjgqpojg64131321";      // 随机字符串自行生成

function encrypting(secret_key, echostr, timestamp){
    return md5(secret_key + echostr + timestamp);    // md5 库自行引入
}

const requestConfig = {
    headers: {
        "api-signature": encrypting(secret_key, echostr, timestamp),
        "api-echostr": echostr,
        "api-timestamp": timestamp,
        "api-access-key": access_key
    }
};

axios.post("/api/example",{},requestConfig).then(res=>{
    // todo
});

本例子为 web 前端的例子,其他客户端同理,生成签名并且带上指定参数即可正常请求。
通过自定义签名方法和自定义校验方法,可以使用其他加密方法进行签名,例如 哈希 等其他加密算法。更多自定义可以直接复制 QbhyLaravelApiAuthLaravelApiAuthMiddleware 中间件后自行修改 。有问题请开 issue

96qbhy.com
96qbhy@gmail.com

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/26017.html

相关文章

  • 分布式系统--感性认识JWT

    摘要:的安全性不好,攻击者可以通过获取本地进行欺骗或者利用进行攻击。 好久没写博客了,因为最近公司要求我学spring cloud ,早点将以前软件迁移到新的架构上。所以我那个拼命的学呐,总是图快,很多关键的笔记没有做好记录,现在又遗忘了很多关键的技术点,极其罪恶! 现在想一想,还是踏踏实实的走比较好。这不,今天我冒了个泡,来补一补前面我所学所忘的知识点。 想要解锁更多新姿势?请访问我的博客...

    sherlock221 评论0 收藏0
  • javascript实现腾讯AI开放平台,调用API时的接口鉴权,生成sign合法签名

    摘要:整个流程图在网上查了很多,但看到有人用前端做腾讯开放平台,生成签名的,所以闲着就自己弄了一下。这样就可以请求腾讯开放平台上的。注意如果使用身份证接口,字段是的的时候,格式问题不需要前面。 整个流程图 showImg(https://segmentfault.com/img/bVbrHpe?w=745&h=924); 在网上查了很多,但看到有人用javascript前端做腾讯AI开放平台...

    crelaber 评论0 收藏0
  • 小程序开发:上传图片到腾讯云

    这是小程序开发第二篇,主要介绍如何上传图片到腾讯云,之所以选择腾讯云,是因为腾讯云免费空间大? 准备工作 上传图片主要是将图片上传到腾讯云对象存储(COS)。 要使用对象存储 API,需要先执行以下步骤: 购买腾讯云对象存储(COS)服务 在腾讯云 对象存储控制台 里创建一个 Bucket 在控制台 个人 API 密钥 页面里获取 AppID、SecretID、SecretKey 内容 编写一个...

    why_rookie 评论0 收藏0
  • 小程序开发:上传图片到腾讯云

    这是小程序开发第二篇,主要介绍如何上传图片到腾讯云,之所以选择腾讯云,是因为腾讯云免费空间大? 准备工作 上传图片主要是将图片上传到腾讯云对象存储(COS)。 要使用对象存储 API,需要先执行以下步骤: 购买腾讯云对象存储(COS)服务 在腾讯云 对象存储控制台 里创建一个 Bucket 在控制台 个人 API 密钥 页面里获取 AppID、SecretID、SecretKey 内容 编写一个...

    idisfkj 评论0 收藏0
  • JWT+RSA鉴权

    摘要:一般根据前两步的数据,再加上服务的的密钥不要泄漏,最好周期性更换,通过加密算法生成。非对称加密后的授权和鉴权流程用户只需要与微服务交互,不用访问授权中心,效率大大提高1)JWT简介JWT,全称是Json Web Token, 是JSON风格轻量级的授权和身份认证规范,可实现无状态、分布式的Web应用授权;官网:https://jwt.io (JWT,生成Token加密字符串的一个标准或格式...

    Tecode 评论0 收藏0

发表评论

0条评论

ormsf

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<