javascript - 如何将此 JS 签名生成器函数转换为 Ruby?
问题描述
我正在尝试将Zoom SDK 集成到我的应用程序中,但我无法弄清楚如何将其用于生成签名的示例代码转换为 ruby。
示例代码 -
const base64JS = require('js-base64');
const hmacSha256 = require('crypto-js/hmac-sha256');
const encBase64 = require('crypto-js/enc-base64');
function generateSignature(data) {
let signature = '';
const ts = new Date().getTime();
const msg = base64JS.Base64.encode(data.apiKey + data.meetingNumber + ts + data.role);
const hash = hmacSha256(msg, data.apiSecret);
signature = base64JS.Base64.encodeURI(`${data.apiKey}.${data.meetingNumber}.${ts}.${data.role}.${encBase64.stringify(hash)}`);
return signature;
}
const data = {apiKey: "" ,
apiSecret: "",
meetingNumber: 888,
role: 0}
console.log(generateSignature(data));
该generateSignature
函数在 ruby 中的外观如何?
我已经尝试了几次,但是当我尝试用 Ruby 编写它时,输出的签名不同。我怀疑我的编码和解码不正确。
这是上面的 javascript 代码,我稍作修改以交叉引用
const base64JS = require('js-base64');
const hmacSha256 = require('crypto-js/hmac-sha256');
const encBase64 = require('crypto-js/enc-base64');
function generateSignature(data) {
let signature = '';
const ts = "1569600658561"
const msg = base64JS.Base64.encode(data.apiKey + data.meetingNumber + ts + data.role);
console.log(msg); // This matches the ruby
const hash = hmacSha256(msg, data.apiSecret);
signature = base64JS.Base64.encodeURI(`${data.apiKey}.${data.meetingNumber}.${ts}.${data.role}.${encBase64.stringify(hash)}`);
return signature;
}
data = {
apiKey: 'api_key',
apiSecret: 'secret',
meetingNumber: '1000',
role: '0'
}
console.log(generateSignature(data));
这是我对红宝石的尝试
class ZoomSignatureGenerator
def self.generate
data = {
api_key: 'api_key',
api_secret: 'secret',
meeting_number: '1000',
role: '0'
}
ts = "1569600658561"
msg = Base64.encode64(data[:api_key] + data[:meeting_number] + ts + data[:role]);
puts(msg)
hash = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha256'), data[:api_secret], msg)
signature = Base64.urlsafe_encode64("#{data[:api_key]}.#{data[:meeting_number]}.#{ts}.#{data[:role]}.#{Base64.encode64(hash)}");
return signature
end
end
我希望它们是相同的输出。但他们最终是不同的。
希望可以有人帮帮我 :)
解决方案
的输出Base64.encode64(value)
由换行符分隔,用于Base64.strict_encode64(value)
生成与 Node.js 相同的结果。
require "base64"
require "openssl"
def generate_signature(api_key, api_secrete, meeting_number, role)
timestamp = 1544683367752
message = Base64.strict_encode64("#{api_key}#{meeting_number}#{timestamp}#{role}")
hash = Base64.strict_encode64(OpenSSL::HMAC.digest('sha256', api_secrete, message))
signature = Base64.strict_encode64("#{api_key}.#{meeting_number}.#{timestamp}.#{role}.#{hash}")
end
generate_signature("key", "secret", 123456, 0)
推荐阅读
- dataweave - Mule 4:XML 模块:如何使用 XPATH 从具有名称空间字段的 XML 消息中检索值?
- azure - 带有来自特定点的延续令牌的 Azure 存储 blob 列表
- c# - N个不同参数的报告
- django - allauth 未找到“登录”的反向。“登录”不是有效的视图函数或模式名称
- java - 在 Spring Boot 中加载外部库的配置
- php - Delete id if not in database from a value
- javascript - 在 reactjs 中从 JSON 获取数组
- datatable - Eclipse 在使用 Cucumber 数据表时无法找到 raw() 方法
- sql - 用于查找具有某些值的记录的 SQL 查询在同一个表中具有不同的 id
- java - 当我将 javaFX stage 的 re-sizable 属性设置为 false 时,为什么我的内容周围会出现空白?