【问题标题】:Trying to set up API Management REST API Authentication w/ Node JS尝试使用 Node JS 设置 API 管理 REST API 身份验证
【发布时间】:2017-06-28 22:07:59
【问题描述】:

我的目标是使用 Azure API 管理 API 对 Node.js 客户端进行身份验证。

在将这个 C# 示例转换为 Node.js Javascript 时,我有点挣扎。我已经用我自己的 id 和密钥测试了 C# 示例,它似乎使用 API 对 200 进行身份验证,但我的 Node.js sn-p 不断收到 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()

【问题讨论】:

    标签: javascript c# node.js azure azure-api-management


    【解决方案1】:

    您可能需要通过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]')
    

    【讨论】:

    • 就是这样,谢谢亚伦!
    猜你喜欢
    • 2012-01-20
    • 2016-08-10
    • 2018-12-20
    • 2019-06-03
    • 2018-03-12
    • 1970-01-01
    • 2018-07-04
    • 2017-12-15
    • 2019-03-31
    相关资源
    最近更新 更多