0

我正在使用 Microsoft Azure API 管理服务并希望使用 REST API 服务。在创建我的 SAS 令牌时,这是需要的,否则 API 调用不会授权,我很难形成正确的令牌。Microsoft 的有关 API 管理的 SAS 令牌的网页仅显示了 C# 中的示例。我想知道如何在 Node.js 中形成 SAS 令牌,没有显示。以下是我上周工作的代码,但由于某种未知原因现在不能工作。我得到的错误是:401 Authorization error, token invalid

如果有人可以帮助我制定这个令牌,我将不胜感激。

这是有关此身份验证令牌的 Microsoft 网页:https ://docs.microsoft.com/en-us/rest/api/apimanagement/apimanagementrest/azure-api-management-rest-api-authentication

这是我的代码:

const crypto = require('crypto');
const util = require('util');

const sign = () => {
  const id = ${process.env.id}
  const key = `${process.env.SASKey}`;
  const date = new Date();
  const newDate = new Date(date.setTime(date.getTime() + 8 * 86400000));
  const expiry = `${newDate.getFullYear()}${
    newDate.getMonth() < 10
      ? '' + newDate.getMonth() + 1
      : newDate.getMonth() + 1
  }${newDate.getDate()}${newDate.getHours()}${
    newDate.getMinutes() < 10
      ? '0' + newDate.getMinutes()
      : newDate.getMinutes()
  }`;
  const dataToSignString = '%s\n%s';
  const dataToSign = util.format(dataToSignString, ${id}, expiry);
  const hash = crypto
    .createHmac('sha512', key)
    .update(dataToSign)
    .digest('base64');

  const encodedToken = `SharedAccessSignature ${id}&${expiry}&${hash}`;
  console.log(encodedToken);
  return encodedToken;
};
4

2 回答 2

0

经过一百万次尝试后,目前唯一可接受的格式似乎是: SharedAccessSignature uid=${identifier}&ex=${expiry}&sn=${signature}

如果您使用具有“集成”参数的其他格式,那是命中或未命中,但大多是未命中。如果这是您的标识符,则将 uid 设置为“集成”,并在其工作时遵循上述格式。

于 2021-02-04T21:05:07.620 回答
0

试试代码:

protected getAPIManagementSAS(){

    let utf8 = require("utf8")
    let crypto= require("crypto")

    let identifier = process.env.API_IDENTIFIER;
    let key = process.env.API_KEY;

    var now = new Date;
    var utcDate = new Date(now.getUTCFullYear(),now.getUTCMonth(), now.getUTCDate() , now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds(), now.getUTCMilliseconds());

    let expiry = addMinutes(utcDate,1,"yyyy-MM-ddThh:mm:ss") + '.0000000Z'

    var dataToSign = identifier + "\n" + expiry;
    var signatureUTF8 = utf8.encode(key); 
    var signature = crypto.createHmac('sha512', signatureUTF8).update(dataToSign).digest('base64'); 
    var encodedToken = `SharedAccessSignature uid=${identifier}&ex=${expiry}&sn=${signature}`;   

    return encodedToken

}

有关详细信息,请参阅此处

于 2021-01-24T07:39:27.723 回答