为 Azure API 管理创建的 SAS 令牌无效
Invalid SAS token being created for Azure API Management
我正在尝试创建一个 SAS Token
以使用 JavaScript(Express.js).但是使用它实际上会导致我 401 Unauthorized
。我正在使用以下代码行。
// 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}`
上面的片段 returns 我是这样的:
SharedAccessSignature uid=integration&ex=2021-04-21T10:48:04.402Z&sn=**O8KZAh9zVHw6Dmb03t1xlhTnrmP1B6i+5lbhQWe**=
(为了安全隐藏了一些字符,但字符数是真实的)
请注意,上述 SAS 令牌中只有一个尾随 破折号 =
,而所有示例中的 SAS 令牌和手动创建的 SAS来自 API 管理门户的令牌有 2 个 破折号 ==
我做错了什么吗?
提前致谢。
根据Azure APIM的SAS tokendocument,我们可以看到样本是c#代码:
示例和您的代码之间的区别在于,C# 示例使用 HMACSHA512,而您的代码使用 HMAS256。所以我认为你还需要在你的 nodejs 中使用 HMACSHA512。你可以这样做:
var hash = crypto.createHmac('sha512', key);
您可能还需要做hash.update(text);
和hash.digest()
,请参考这篇document。
谢谢沉快点!我还发现我们不需要 crypto-js
(因为我们必须为此导入外部库)。 Node 有 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}`
我正在尝试创建一个 SAS Token
以使用 JavaScript(Express.js).但是使用它实际上会导致我 401 Unauthorized
。我正在使用以下代码行。
// 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}`
上面的片段 returns 我是这样的:
SharedAccessSignature uid=integration&ex=2021-04-21T10:48:04.402Z&sn=**O8KZAh9zVHw6Dmb03t1xlhTnrmP1B6i+5lbhQWe**=
(为了安全隐藏了一些字符,但字符数是真实的)
请注意,上述 SAS 令牌中只有一个尾随 破折号 =
,而所有示例中的 SAS 令牌和手动创建的 SAS来自 API 管理门户的令牌有 2 个 破折号 ==
我做错了什么吗?
提前致谢。
根据Azure APIM的SAS tokendocument,我们可以看到样本是c#代码:
示例和您的代码之间的区别在于,C# 示例使用 HMACSHA512,而您的代码使用 HMAS256。所以我认为你还需要在你的 nodejs 中使用 HMACSHA512。你可以这样做:
var hash = crypto.createHmac('sha512', key);
您可能还需要做hash.update(text);
和hash.digest()
,请参考这篇document。
谢谢沉快点!我还发现我们不需要 crypto-js
(因为我们必须为此导入外部库)。 Node 有 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}`