权益需求对接中,公司跟第三方公司合作,有时我们可能作为甲方,提供接口给对方,有时我们也作为乙方,调对方接口,这就需要API使用签名方法(Sign)对接口进行鉴权。每一次请求都需要在请求中包含签名信息, 以验证用户身份,不然任何人都可以调我们公司的接口,会导致安全隐患。

思路:在接口请求参数都带上appKey,签名sign和时间戳timestamp等字段。

假如我们是甲方时,那么需要让乙方在目标网站上申请或者给乙方提供安全凭证(appKey和appSecret),其中 appKey是用于标识 API 调用者的身份,appSecret是用于加密签名字符串和服务器端验证签名字符串的密钥。appSecret必须严格保管。避免泄露。

乙方(对方)需要做

根据甲方(我们)提供appSecret和需要传的特定参数生成的签名sign,最后在接口的url参数拼接上,签名sign,时间戳timestamp和appKey等参数。

具体步骤如下:

1.    对参数进行排序和拼接

首先对请求参数按参数名做字典序升序(自然顺序)排列,然后格式化特定的形式,例如 k=v的形式,同时参数间使用"&"拼接在一起,或者kv的形式,不用"&"拼接的形式(注意不包括签名Sign参数,v为原始值而非url编码后的值)。

示例 采用k=v的形式,同时参数间使用"&"拼接在一起

appkey=00159&from=51916&phone=13612549848&thirdOrderId=768169123&timestamp=2020-10-22 17:39:08&ver=3.4

2.    使用特定的加密算法进行加密(Md5,SHA),再进行大小写格式化等操作

String sig = MD5Utils.EncoderByMd5(appSecret + “参数进行排序和拼接后的字符串”+ appSecret).toLowerCase().substring(0, 30);

3.  url拼接签名sign,时间戳timestamp和appKey等参数

StringBuilder stringBuilder = new StringBuilder(url);
if (url.contains("?")) {
stringBuilder.append("&client_id=").append(clientId)
.append("&ext_user_id=").append(phead.getUserId())
.append("&sign=").append(sign)
.append("&timestamp=").append(timestamp)
.append("&phone=").append(phone)
.append("&callback_info=").append(phead.getUserId());
}

项目实战

示例1

示例2

我们(甲方)要做

拿到对方请求我们传过来的参数中的签名sign和appKey和时间戳等字段,然后通过appKey去获得对应的密码appSecret(这两个参数appKey和appSecret是我们定义后给乙方的),我们通过和乙方一样的方式生成签名sign2,最后比较对方传过来的sign值和我们以同样方式生成得到的sign2是不是一致,一致签名验证就通过,不一致签名就是失败;

注意:有了签名,基本上数据的合法性就得到了保障。只要坏人没有秘钥就无法伪造调用方的请求。但坏人依然可以截取调用方的请求,不停的发送给服务端,造成服务端资源紧张、数据错误等不好的结果。为了防止同样的请求多次发送,我们往往还要求调用方提供一个唯一的序列号,比如UUID、时间戳之类的。服务端需要在收到请求的第一时间校验该唯一序列号。我们可以通过spring的切面或者拦截器来做。

参考/好文

https://www.web3.xin/index/article/156.html

项目API接口鉴权流程总结的更多相关文章

  1. laravel JWTAuth实现api接口鉴权(基础篇)

    官网:https://jwt-auth.readthedocs.io 参考:https://learnku.com/articles/10885/full-use-of-jwt#99529f 1.to ...

  2. 接口鉴权之sign签名校验与JWT验证

    需求描述: 项目里的几个Webapi接口需要进行鉴权,同接口可被小程序或网页调用,小程序里没有用户登录的概念,网页里有用户登录的概念,对于调用方来源是小程序的情况下进行放权,其他情况下需要有身份验证. ...

  3. EasyNVR摄像机网页H5全平台无插件直播流媒体播放服务二次开发之接口鉴权示例讲解

    背景需求 EasyNVR的使用者应该都清楚的了解到,EasyNVR一个强大的功能就是可以进行全平台的无插件直播.主要原因在于rtsp协议的视频流(默认是需要插件才可以播放的)经由EasyNVR处理可以 ...

  4. 使用JWT设计SpringBoot项目api接口安全服务

    转载直: 使用JWT设计SpringBoot项目api接口安全服务

  5. [转]使用nodejs-koa2-mysql-sequelize-jwt 实现项目api接口

    本文转自:https://blog.csdn.net/yibowanbo/article/details/80521849 nodejs-koa2-mysql-sequelize-jwt技术栈:nod ...

  6. 使用nodejs-koa2-mysql-sequelize-jwt 实现项目api接口

    nodejs-koa2-mysql-sequelize-jwt 技术栈:nodejs, koa2, mysql, sequelize, jwt 项目数据层和操作层分明 使用koa2框架中间件,参数处理 ...

  7. HiMall 3接口鉴权参考

    签名算法 为了防止API调用过程中被黑客恶意篡改,调用任何一个API都需要携带签名,HOP服务端会根据请求参数,对签名进行验证,签名不合法的请求将会被拒绝.TOP目前支持的签名算法只有一种:MD5(s ...

  8. 接口鉴权,提供给第三方调用的接口,进行sign签名

    //场景:公司要跟第三方公司合作,提供接口给对方对接,这样需要对接口进行授权,不然任何人都可以调我们公司的接口,会导致安全隐患: 思路: 在每个接口请求参数都带上ApiKey 和sign签名: 我们在 ...

  9. Asp.net Core 项目API接口服务器部署

    Windows server 2008服务器部署: DotNetCore.1.0.0.RC2-WindowsHosting 或者DotNetCore.1.0.5_1.1.2-WindowsHostin ...

随机推荐

  1. python中的多线程和多进程

    一.简单理解一下线程和进程 一个进程中可有多个线程,线程之间可共享内存,进程间却是相互独立的.打比方就是,进程是火车,线程是火车厢,车厢内人员可以流动(数据共享) 二.python中的多线程和多进程 ...

  2. 深入分析 Java Lock 同步锁

    前言 Java 的锁实现,有 Synchronized 和 Lock.上一篇文章深入分析了 Synchronized 的实现原理:由Java 15废弃偏向锁,谈谈Java Synchronized 的 ...

  3. ARC109F - 1D Kingdom Builder

    一行格子,其中小于\(0\)的格子为白色,大于\(n\)的格子为黑色,中间的格子颜色由题目给出. 有一些格子需要被标记.标记按照以下规则进行:选择一个颜色\(c\),找到一个未标记的 旁边有标记点的 ...

  4. Codeforces Edu Round 49 A-E

    A. Palindromic Twist 由于必须改变.所以要使\(a[i] = a[n - i + 1]\). 要么同向走,但必须满足之前的\(a[i] = a[n - i + 1]\). 要么相遇 ...

  5. 用Ubuntu和树莓派系统部署kubernetes集群后的一些心得

    方案 环境 操作系统:Ubuntu 16.04 & Raspbian GNU/Linux 9(Stretch Desktop) kubernetes :1.15.3 flannel:0.11. ...

  6. Jmeter(4)断言

    Jmeter添加断言,检查测试中得到的响应数据是否符合预期.以下介绍下响应断言,JSON断言 一.响应断言 1.创建测试计划: 添加线程组->添加取样器->添加察看结果树,运行后可查看接口 ...

  7. Java 8 新特性:Lambda、Stream和日期处理

    1. Lambda 简介   Lambda表达式(Lambda Expression)是匿名函数,Lambda表达式基于数学中的λ演算得名,对应于其中的Lambda抽象(Lambda Abstract ...

  8. .net core WebAPI性能监控-MiniProfiler与Swagger集成

    ------------恢复内容开始------------ 安装Nuget Install-Package MiniProfiler.AspNetCore.Mvc Install-Package M ...

  9. v-text、v-html、v-pre

    v-text 用于将数据填充到标签中,作用于插值表达式类似,但是相对于直接插值是没有闪动问题的 v-html 用于将HTML片段填充到标签中,但是可能有安全问题(易被跨域脚本攻击[XSS攻击]) v- ...

  10. 详解汇编语言B和LDR指令与相对跳转和绝对跳转的关系

    @ 目录 为什么要有相对跳转和绝对跳转? 在程序中只有相对跳转/绝对跳转是否可以? B(BL)和LDR指令具体怎么执行的? B(BL)和LDR跳转范围是如何规定的? 为什么要有相对跳转和绝对跳转? 顺 ...