Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Ruby中生成有效的ES256签名_Ruby_Cryptography_Jwt_Mapkit - Fatal编程技术网

如何在Ruby中生成有效的ES256签名

如何在Ruby中生成有效的ES256签名,ruby,cryptography,jwt,mapkit,Ruby,Cryptography,Jwt,Mapkit,我正在努力集成MapWeb快照(Apple MapKit SDK for Web的一部分),在这里我需要将URL的签名附加到查询参数。文档中的示例代码演示了如何使用NPM的jwa包实现这一点 //必需的模块。 const{readFileSync}=require(“fs”); const{sign}=require(“jwa”)(“ES256”); /*从文件系统读取您的私钥。(切勿添加您的私钥 *在代码或源代码管理中。始终保持安全。) */ const privateKey=readFil

我正在努力集成MapWeb快照(Apple MapKit SDK for Web的一部分),在这里我需要将URL的签名附加到查询参数。文档中的示例代码演示了如何使用NPM的
jwa
包实现这一点

//必需的模块。
const{readFileSync}=require(“fs”);
const{sign}=require(“jwa”)(“ES256”);
/*从文件系统读取您的私钥。(切勿添加您的私钥
*在代码或源代码管理中。始终保持安全。)
*/ 
const privateKey=readFileSync(“[file\u system\u path]”);
//用实际值替换团队ID和密钥ID值。
const teamId=“[team ID]”;
const keyId=“[key ID]”;
//创建签名字符串并返回包含签名的完整快照请求URL。
函数符号(参数){
常量快照路径=`/api/v1/snapshot?${params}`;
const completePath=`${snapshotPath}&teamId=${teamId}&keyId=${keyId}`;
const signature=sign(completePath,privateKey);
//在本例中,jwa模块将签名作为Base64 URL编码字符串返回。
//将签名附加到请求URL的末尾,然后返回。
返回`${completePath}&signature=${signature}`;
}
//通过简单的映射请求调用sign函数。
标志(“中心=苹果+公园”)
//预期的返回值为:“/api/v1/snapshot?center=apple+park&teamId=[team ID]&keyId=[key ID]&signature=[base64\u url\u encoded\u signature]”
我想实现同样的目标,但是用Ruby

key\u id=ENV['MAPKIT\u key\u id']
团队id=ENV['MAPKIT\u团队id']
private_key=OpenSSL::PKey::EC.new(ENV['MAPKIT_private_key'])
def标志(参数)
snapshot_path=“/api/v1/snapshot?#{params}”
complete_path=“#{snapshot_path}&teamId=#{team_id}&keyId=#{key_id}”
signature=JWT::signature.sign('ES256',完整路径,私钥)
“#{complete_path}&signature=#{signature}”
结束
但是,调用
JWT::Signature.sign
得到的输出不是我所期望的。在JavaScript示例中,我总是返回一个86个字符的字符串,类似于
t9enyigpqhorqxknmlidcl0lrwtr1mra9ciurhaiprdzpm7a-74mNh3DOYXi--FvPOxdUW0Omr-6jo3FWyLFQ
。在Ruby示例中,我得到了一些完全不同的东西-
“\x95\xA7\x8A4L\x82>\f\u0002\xBC\u 1~;\xAE\xBF\xE5\xC5\u0019W\x86\xDEwG\u0004i\x93CYX\xD2\u0018\x84\\ xD9\xFDf\x877\xF7 | rnf\u007FV\xF2“base64url”您的
签名
变量,如下:

signature=Base64.urlsafe\u encode64(JWT::signature.sign('ES256',完整路径,私钥))

@Casper和@privative是正确的,因为这是一个编码问题

你可以使用
Base64.urlsafe\u encode64
或者使用
JWT::Base64.url\u encode
如果你想坚持使用gem

signature=JWT::signature.sign('ES256',完整路径,私钥)
JWT::Base64.url\u编码(签名)

看起来像原始二进制文件。我想你需要对其进行base64编码。请查看此文件中的
encode\u signature
:谢谢-我以为这可能是一些编码问题,但我无法确定它是什么。