Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/394.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
Javascript 为Azure API管理创建的SAS令牌无效_Javascript_Typescript_Azure Api Management_Cryptojs_Sas Token - Fatal编程技术网

Javascript 为Azure API管理创建的SAS令牌无效

Javascript 为Azure API管理创建的SAS令牌无效,javascript,typescript,azure-api-management,cryptojs,sas-token,Javascript,Typescript,Azure Api Management,Cryptojs,Sas Token,我正在尝试创建一个SAS令牌,以便使用JavaScript(Express.js)与Azure API管理Rest API通信。但使用它实际上会让我找到一个401未经授权的。我正在使用以下代码行 // setting one day expiry time const expiryDate = new Date(Date.now() + 1000 * 60 * 60 * 24) const expiryString = expiryDate.toISOString() const iden

我正在尝试创建一个
SAS令牌
,以便使用JavaScript(Express.js)与Azure API管理Rest API通信。但使用它实际上会让我找到一个
401未经授权的
。我正在使用以下代码行


//  setting one day expiry time
const expiryDate = new Date(Date.now() + 1000 * 60 * 60 * 24)
const expiryString = expiryDate.toISOString()

const identifier = process.env.AZURE_APIM_IDENTIFIER
const key = process.env.AZURE_APIM_SECRET_KEY ?? ""

const stringToSign = `${identifier}\n${expiryString}`

const signature = CryptoJS.HmacSHA256(stringToSign, key)
const encodedSignature = CryptoJS.enc.Base64.stringify(signature)
    
//  SAS Token
const sasToken = `SharedAccessSignature uid=${identifier}&ex=${expiryString}&sn=${encodedSignature}`
上面的代码段向我返回如下内容:
SharedAccessSignature uid=integration&ex=2021-04-21T10:48:04.402Z&sn=**O8KZAh9zVHw6Dmb03t1xlhTnrmP1B6i+5lbhQWe**=
(为了安全起见,有些字符是隐藏的,但字符数是实数)

请注意,上述SAS令牌中只有一个尾随的破折号
=
,而所有示例中的SAS令牌和从API管理门户手动创建的SAS令牌都有两个破折号
=

我做错什么了吗

提前感谢。

根据Azure APIM的SAS代币,我们可以看到样本是c#代码:

示例与代码之间的区别在于c#示例使用HMACSHA512,而代码使用HMAS256。因此,我认为您还需要在节点中使用HMACSHA512。你可以这样做:

var hash = crypto.createHmac('sha512', key);

您可能还需要执行
hash.update(text)
hash.digest()
,请参考此信息。

谢谢Hury Shen!我还发现我们不需要
crypto js
(因为我们必须为此导入一个外部库)。节点的本机模块是
crypto
,我们可以使用它。下面的JavaScript代码段工作正常

import crypto from "crypto"

const identifier = <YOUR_AZURE_APIM_IDENTIFIER>
const secretKey = <YOUR_AZURE_APIM_SECRET_KEY>

//  setting token expiry time
const expiryDate = new Date(Date.now() + 1000 * 60 * 60 * 24 * 29)
const expiryString = expiryDate.toISOString().slice(0, -1) + "0000Z"

const dataToSign = `${identifier}\n${expiryString}`

//  create signature
const signedData = crypto
    .createHmac("sha512", secretKey)
    .update(dataToSign)
    .digest("base64")

//  SAS Token
const accessToken = `SharedAccessSignature uid=${identifier}&ex=${expiryString}&sn=${signedData}`
从“加密”导入加密
常量标识符=
常数secretKey=
//设置令牌到期时间
const expireydate=新日期(Date.now()+1000*60*60*24*29)
常量expiryString=expiryDate.toISOString().slice(0,-1)+“0000Z”
常量dataToSign=`${identifier}\n${expiryString}`
//创建签名
const signedData=crypto
.createHmac(“sha512”,secretKey)
.update(dataToSign)
.摘要(“base64”)
//SAS令牌
const accessToken=`SharedAccessSignature uid=${identifier}&ex=${expiryString}&sn=${signedData}`

谢谢!是的,这就是问题所在。更新:这应该是最后的答案。我还使用JavaScript添加了完整的代码片段。