【问题标题】:How can I generate a WM_SEC.AUTH_SIGNATURE in Ruby?如何在 Ruby 中生成 WM_SEC.AUTH_SIGNATURE?
【发布时间】:2020-09-28 03:06:55
【问题描述】:

(我最终想要完成的是使用产品代码在 Walmart.com 上查找单个产品,所以如果有人有其他方法,那也可以)

Walmart.io 的 Product Lookup API 需要一个名为“WM_SEC.AUTH_SIGNATURE”的标头,但我不知道如何使用 Ruby 生成它。 here 给出了一些 Java 代码(我不确定在此处复制该代码的合法性)但我不了解 Java,所以我不明白他们在做什么。

This SO question 试图解释这个过程,但我也不清楚具体做了什么。

要使用您自己的代码获取数字签名,请按以下步骤操作:

  1. 获取消费者 ID 和您生成的 Base 64 编码私钥 在卖家中心。

  2. 获取您要调用的完整 URL,包括任何 路径和查询参数。

  3. 使用 GET 方法构造输入 用于数字签名。

  4. 使用下面列出的结构: 发给你的消费者ID_+“\n”+你所在API调用的URL make + "\n" + 你正在调用的 API 的请求方法 所有大写字母 + "\n" + Unix Epoch 时间戳(以毫秒为单位) 自 1970 年 1 月 1 日 UTC) + "\n" ** 注意:参数的顺序和行返回\n对于正确生成签名很重要

使用第 3 步中列出的结构化数据生成字节数组 以下步骤:

一个。使用 Base-64 解码字节数组。

b.使用 PKCS#8 对结果值进行编码以表示您的 Private 钥匙。各种语言的图书馆提供识别的能力 私钥是 PKCS#8 格式,而不是其他冲突的 PKCS#1 等格式。

c。使用你的这个字节表示 使用带有 RSA 的 SHA-256 对数据进行签名的私钥。

d。使用 Base-64 对生成的数字签名进行编码。

使用生成的数字签名和时间戳来制作您的 API 打电话。

我已经做到了:

time = DateTime.now.strftime('%Q')
customerid = "customerid"
link = "https://developer.api.walmart.com/api-proxy/service/affil/product/v2/items/4837473"
method = "POST"
uncoded = customerid + "\n" + link + "\n" + method + "\n" + time + "\n"
encoded = Base64.encode64(uncoded)
privatekey = "longrsakey"

但我不知道如何继续。我是否必须将我的privatekey 编码为 PKCS#8,然后使用结果对我的encoded 进行编码?我什至在 Ruby 中都找不到 PKCS#8 编码器。

谁能帮忙?

【问题讨论】:

标签: ruby rsa sha256 pkcs#8 walmart-api


【解决方案1】:

假设您正在尝试访问附属 API,以下是创建发出请求所需的签名的方法:

version = 'YOUR VERSION'
consumer_id = "YOUR CONSUMER ID"
time_stamp = (Time.now.to_i * 1000).to_s
p_key = "YOUR PRIVATE KEY"
digest = OpenSSL::Digest.new('sha256')

data = consumer_id + "\n" + time_stamp + "\n" + version + "\n"

k = OpenSSL::PKey::RSA.new(p_key.to_s)
digest = OpenSSL::Digest::SHA256.new
signature = k.sign(digest,data)
signature = Base64.strict_encode64(signature)

headers = {
  "WM_SEC.KEY_VERSION": version,
  "WM_CONSUMER.ID": consumer_id,
  "WM_CONSUMER.INTIMESTAMP": time_stamp,
  "WM_SEC.AUTH_SIGNATURE": signature
}

puts HTTParty.get("https://developer.api.walmart.com/api-proxy/service/affil/product/v2/taxonomy", headers: headers).parsed_response

【讨论】:

    猜你喜欢
    • 2019-12-14
    • 2011-11-27
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    • 2016-09-02
    相关资源
    最近更新 更多