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添加了完整的代码片段。