[C#] 基于 Token 的鉴权与签名机制详解 接口对接鉴权 token、sign(a=1&b=2&c=3&d=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

你可能感兴趣的:(ASP.NET,Core,c#,c语言,开发语言)