权益需求对接中,公司跟第三方公司合作,有时我们可能作为甲方,提供接口给对方,有时我们也作为乙方,调对方接口,这就需要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. CobaltStrike3.14&3.8安装&中文乱码解决

    工具简介 Cobalt Strike 一款以 Metasploit 为基础的 GUI 框架式渗透测试工具,集成了端口转发.服务扫描,自动化溢出,多模式端口监听,exe.powershell 木马生成等 ...

  2. node.js、yarn、npm到底是什么?

    最近在部署环境,在没有开发脚本的情况下,自己根据以往其他项目中的脚本去生搬硬套,发现很难对项目的配置成功.对配置不成功的情况进行判断,发现是对脚本不熟悉,不了解其原理,实现方式也不知道,所以抽时间去了 ...

  3. 事后Postmortem会议

    会议图片 一.设想和目标 1. 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 我的软件是要建立一个失物招领网站,是一个为校园里的失误招领工作提供便利的平台.我们对 ...

  4. 【Azure Developer】VS Code运行Java 版Azure Storage SDK操作Blob (新建Container, 上传Blob文件,下载及清理)

    问题描述 是否可以用Java代码来管理Azure blob? 可以.在代码中加入azure-storage-blob依赖.即可使用以下类操作Azure Storage Blob. BlobServic ...

  5. Python条件判断和循环语句

    一.条件判断语句 通过一条或多条语句的判断来决定是否执行代码块 1.if语句基本形式: if 判断条件:    语句块 例如: score=75if score>=60:    print &q ...

  6. mac下git连接github远程仓库

    git配置 一.安装git 官方网站下载安装,如果有安装homebrew,在终端输入brew install git,安装后的位置在/Users/计算机用户名目录下安装完成后,在终端输入git --v ...

  7. SQL Server NULL值用法及处理详解

    用法如下: 1.如果表中的某个列是可选的,那么我们可以在不向该列添加值的情况下插入新记录或更新已有的记录,这意味着该字段将以 NULL 值保存. 2.NULL 用作未知的或不适用的值的占位符. 3.定 ...

  8. MySQL锁(二)表锁:为什么给小表加字段会导致整个库挂掉?

    概述 表级锁是MySQL中锁定粒度最大的一种锁,表示对当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分MySQL引擎支持.最常使用的MYISAM与INNODB都支持表级锁定.表级锁定分为表共享 ...

  9. js下 Day04、DOM操作--自定义属性

    语法: 元素.getAttribute('自定义属性名') 功能:获取自定义属性 语法: 元素.setAttribute('自定义属性名','值') 功能:设置自定义属性 语法: 元素.removeA ...

  10. 其它语言通过HiveServer2访问Hive

    先解释一下几个名词: metadata :hive元数据,即hive定义的表名,字段名,类型,分区,用户这些数据.一般存储关系型书库mysql中,在测试阶段也可以用hive内置Derby数据库. me ...