当前位置: 首页 > news >正文

[C#] 基于 Token 的鉴权与签名机制详解 接口对接鉴权 token、sign(a=1b=2c=3d=4)、Base64、参数加密、MD5

1. 鉴权方式

1.1. 获取 Token
  • 1.1.1. 调用服务接口 {{projectUrl}}/ois/order/getAuth,传入分配好的 appKeyappSecret,验证通过后返回 access token
  • 1.1.2. 调用其他接口时需要此 token 参与签名计算。
  • 1.1.3. token 的有效时间不固定,推荐根据响应 code 判断是否需要重新获取 token
    • code=1004code=1005 时需要获取新 token
1.2. 计算签名
  • 1.2.1. 将所有参数(表单参数和 HTTP 头原始值)拼接,将参数自然排序(无值的参数不拼接)。例如:a=1&b=2&c=3&d=4
  • 1.2.2. 将拼接好的参数字符串进行 Base64 编码:Base64(str)
  • 1.2.3. 将 Base64 后的字符串与 appSecret 进行拼接,并做 MD5 加密:MD5(Base64(str)+appSecret)
  • 1.2.4. 将 MD5 加密后的字符串转换为大写。
1.3. Token 解析
  • 1.3.1. HTTP 头中有三个参数:tokensignversiontoken 实际上是经过伪装的,并非原始 token

  • 1.3.2. token 组成:

    {"timestamp":1584953245407,"nonce":"slnkda","token":"b535e97f-2293-4b8c-8bdd-b2e9fa96aa77"}
    
    • timestamp:当前时间戳,13 位毫秒数。
    • nonce:可以固定为 slnkda
    • token:从 getAuth 接口返回的 token
  • 1.3.3. 将以上 token 对象进行 Base64 编码:Base64(token)

  • 1.3.4. 进行字符替换:

    • "a" -> "-"
    • "c" -> "#"
    • "x" -> "^"
    • "M" -> "$"

    Java 语言替换时可能会产生多余换行符,要处理掉,以免接口返回“非法请求”。

1.4. HTTP Header 组成

调用获取 token 以外的接口时,需要在 HTTP 头中添加以下信息:

  • 1.4.1. 伪装后的 token
  • 1.4.2. 计算后的 sign 签名。
  • 1.4.3. 客户端版本 version

2. 测试对接要求

  • 2.1. 测试单号要求以 Test 开头。

3. 常见对接误区

  • 3.1. 预报之后不主动监测预报状态,导致预报失败却未处理。
  • 3.2. 轮询频率不限制为每秒 1 次,会导致限流。
  • 3.3. 预报失败或预报一直未完成时不限制轮询次数,导致服务器压力增大。

使用以下C#代码来对接该接口。下面是一个步骤分解的示例,包括如何获取token和签名的计算方式:

4. 获取 Token 接口

using System;
using System.Net.Http;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;class Program
{private static readonly string appKey = "you

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 解释 JVM 的堆内存结构,并简述如何通过调整 JVM 参数来提高应用程序的性能 ?
  • 【C#生态园】构建完美的C#网络请求:深度剖析六大HTTP客户端库
  • 怎样查看电脑文件夹大小?文件夹数据丢失怎么找回
  • 【鼠鼠学AI代码合集#5】线性代数
  • 口语笔记——状语
  • mysql笔记3(数据库、表和数据的基础操作)
  • node.js、php、Java、python校园点餐与数据分析系统 校园食堂订餐系统(源码、调试、LW、开题、PPT)
  • 护肤产品如何推广吗
  • 通过EasyExcel设置自定义表头及设置特定单元格样式、颜色
  • OpenAI澄清:“GPT Next”不是新模型。
  • 完整指南:CNStream流处理多路并发框架适配到NVIDIA Jetson Orin (三) 代码编译、各种问题解决、代码修改
  • Oracle VM VirtualBox 下 Ubuntu22 虚拟机配置双网络
  • Ubuntu20.04+ros-noetic配置Cartographer
  • sqli-lab靶场学习(一)——Less1-4
  • Java小程序案例:电子日历记事本
  • JavaScript-如何实现克隆(clone)函数
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • Cumulo 的 ClojureScript 模块已经成型
  • Flex布局到底解决了什么问题
  • Laravel 中的一个后期静态绑定
  • Markdown 语法简单说明
  • Python3爬取英雄联盟英雄皮肤大图
  • React+TypeScript入门
  • 初识MongoDB分片
  • 高性能JavaScript阅读简记(三)
  • 前嗅ForeSpider采集配置界面介绍
  • 山寨一个 Promise
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 小程序测试方案初探
  • 学习HTTP相关知识笔记
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • ​linux启动进程的方式
  • ​学习一下,什么是预包装食品?​
  • #单片机(TB6600驱动42步进电机)
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (el-Transfer)操作(不使用 ts):Element-plus 中 Select 组件动态设置 options 值需求的解决过程
  • (NSDate) 时间 (time )比较
  • (SERIES12)DM性能优化
  • (附源码)php投票系统 毕业设计 121500
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (一)WLAN定义和基本架构转
  • (转)Linq学习笔记
  • ./和../以及/和~之间的区别
  • .aanva
  • .net core + vue 搭建前后端分离的框架
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .NET 设计模式初探
  • .Net 中Partitioner static与dynamic的性能对比
  • .NetCore 如何动态路由
  • .net和php怎么连接,php和apache之间如何连接
  • .net流程开发平台的一些难点(1)