尝试设置 API 管理 REST API 带有节点 JS 的身份验证
Trying to set up API Management REST API Authentication w/ Node JS
我的目标是使用 Azure API 管理对 Node.js 客户端进行身份验证 API。
我在将此 C# 示例翻译成 Node.js Javascript 时遇到了一些困难。我已经用我自己的 ID 和密钥测试了 C# 示例,它似乎使用 API 验证了 200
,但我一直用我的 Node.js 片段获得 401
。
我感觉这可能与 C# 示例格式化到期时间 (ex={1:o}
) 的方式有关,它是 Format Specifier
的一种类型
C# 示例
来源:Azure API Management REST API Authentication
using System;
using System.Text;
using System.Globalization;
using System.Security.Cryptography;
public class Program
{
public static void Main()
{
var id = "12345678abcdefgh";
var key = "1234abcd5678asdf==";
var expiry = DateTime.UtcNow.AddDays(10);
using (var encoder = new HMACSHA512(Encoding.UTF8.GetBytes(key)))
{
var dataToSign = id + "\n" + expiry.ToString("O", CultureInfo.InvariantCulture);
var hash = encoder.ComputeHash(Encoding.UTF8.GetBytes(dataToSign));
var signature = Convert.ToBase64String(hash);
var encodedToken = string.Format("SharedAccessSignature uid={0}&ex={1:o}&sn={2}", id, expiry, signature);
Console.WriteLine(encodedToken);
}
}
}
我的 Node.js 片段
var util = require('util')
var crypto = require('crypto')
var generateAccessCode = function() {
var id = "1234asdf1234asdf";
var key = "1234asdf1234ghjk";
const accessCodeExpireDays = 10;
const formatString = 'SharedAccessSignature uid=%s&ex=%s&sn=%s'
const dataToSignString = '%s\n%s';
//create expiry string
var today = new Date();
var expiry = new Date();
expiry.setDate(today.getDate() + accessCodeExpireDays);
expiry = expiry.toISOString();
//create hash
var dataToSign = util.format(dataToSignString, id, expiry)
const hash = crypto.createHmac('sha512', key)
.update(dataToSign)
.digest('base64');
var encodedToken = util.format(formatString, id, expiry, hash);
console.log(encodedToken)
}
generateAccessCode()
您可能需要通过 Moment.js 将到期日期格式化如下:
//create expiry string
var today = new Date();
var expiry = new Date();
expiry.setDate(today.getDate() + accessCodeExpireDays);
expiry = moment(expiry).format('YYYY-MM-DD[T]HH:mm:ss.SSSSSSS[Z]')
我的目标是使用 Azure API 管理对 Node.js 客户端进行身份验证 API。
我在将此 C# 示例翻译成 Node.js Javascript 时遇到了一些困难。我已经用我自己的 ID 和密钥测试了 C# 示例,它似乎使用 API 验证了 200
,但我一直用我的 Node.js 片段获得 401
。
我感觉这可能与 C# 示例格式化到期时间 (ex={1:o}
) 的方式有关,它是 Format Specifier
C# 示例
来源:Azure API Management REST API Authentication
using System;
using System.Text;
using System.Globalization;
using System.Security.Cryptography;
public class Program
{
public static void Main()
{
var id = "12345678abcdefgh";
var key = "1234abcd5678asdf==";
var expiry = DateTime.UtcNow.AddDays(10);
using (var encoder = new HMACSHA512(Encoding.UTF8.GetBytes(key)))
{
var dataToSign = id + "\n" + expiry.ToString("O", CultureInfo.InvariantCulture);
var hash = encoder.ComputeHash(Encoding.UTF8.GetBytes(dataToSign));
var signature = Convert.ToBase64String(hash);
var encodedToken = string.Format("SharedAccessSignature uid={0}&ex={1:o}&sn={2}", id, expiry, signature);
Console.WriteLine(encodedToken);
}
}
}
我的 Node.js 片段
var util = require('util')
var crypto = require('crypto')
var generateAccessCode = function() {
var id = "1234asdf1234asdf";
var key = "1234asdf1234ghjk";
const accessCodeExpireDays = 10;
const formatString = 'SharedAccessSignature uid=%s&ex=%s&sn=%s'
const dataToSignString = '%s\n%s';
//create expiry string
var today = new Date();
var expiry = new Date();
expiry.setDate(today.getDate() + accessCodeExpireDays);
expiry = expiry.toISOString();
//create hash
var dataToSign = util.format(dataToSignString, id, expiry)
const hash = crypto.createHmac('sha512', key)
.update(dataToSign)
.digest('base64');
var encodedToken = util.format(formatString, id, expiry, hash);
console.log(encodedToken)
}
generateAccessCode()
您可能需要通过 Moment.js 将到期日期格式化如下:
//create expiry string
var today = new Date();
var expiry = new Date();
expiry.setDate(today.getDate() + accessCodeExpireDays);
expiry = moment(expiry).format('YYYY-MM-DD[T]HH:mm:ss.SSSSSSS[Z]')