【问题标题】:Nodejs : run promises sequentiallyNodejs:按顺序运行承诺
【发布时间】:2020-06-16 16:36:29
【问题描述】:

对于我需要在 F5 大 IP 上使用 private_key_jwt 进行 oauth 客户端身份验证的工作。 由于 oauth 的内置模块不负责这种身份验证,因此必须通过基于 nodejs 的 iRuleLX 模块来实现。

我有以下代码来加密JWT,但是在某些系统上,在执行第二个promise之前,第一个promise的结果是不可用的,这导致了一个错误。

我在谷歌上做了一些努力来寻找一种顺序处理这两个承诺的方法,但我无法找到实现它的正确方法(在执行 createEncrypt 承诺之前处理 asKey)。

说实话我对Node.js不熟悉。

var f5 = require("f5-nodejs");
const { JWE, JWK } = require("node-jose");
var ilx = new f5.ILXServer();
var contentAlg = "A128CBC-HS256";
var key = "nok";
var token = "nok";
const skey = {
  kty: "RSA",
  e: "AQAB",
  use: "enc",
  kid: "e1",
  n:
    "vVm75k4dzUw_iuG8NvIvGS8o3dMvlpXwBX44ZcGgBzCnzHKjY37T8newmRcfmFkpvTR0qgYqtPeev5RwOZXXDO9Seg6Zkc_6sZjfSpeiOBebwW1DeZlEiYCTWSg6Ri5H26S3j6R8H_b3BCrtcd3gcmD7OwY280QvJ8eDmbJaj4aAaXf_Ef9RTYz1qJHnehbNRlmRr-OJuuYpsH497Is-c7OvUSLfMkItj9mtRKuk4DQ0LY5c5MYiyx1NidCuQTSK4VZSA3l6zMq-WN1pRb61hjfI74OO7gT256vQZZSq0DrzMPxA0mGeNDBlj6J5cBcdwnTAhF9mojs-ZwcAAvbgQ",
  alg: "RSA-OAEP",
  key_ops: ["encrypt", "wrap", ""]
};

var options = {
  compact: true,
  contentAlg: contentAlg,
  fields: {
    alg: "RSA-OAEP",
    kid: "e1",
    cty: "JWT",
    enc: contentAlg
  }
};

ilx.addMethod("test_jwk", function(req, res) {
  var payload = req.params()[0].toString();

  JWK.asKey(skey)
    .then(function(result) {
      key = result;
    })
    .catch(function(error) {
      key = "nok";
    });

  if (key != "nok") {
    jose.JWE.createEncrypt(options, key)
      .update(payload, "utf8")
      .final()
      .then(function(result) {
        token = result;
      })
      .catch(function(error) {
        token = "nok";
      });
  }

  res.reply(token);
});
ilx.listen();

【问题讨论】:

    标签: javascript node.js oauth jwt


    【解决方案1】:

    您可以使用异步/等待。

    试试这个,

    var f5 = require('f5-nodejs');
    const { JWE, JWK } = require('node-jose')
    var ilx = new f5.ILXServer();
    var contentAlg = "A128CBC-HS256";
    var key = "nok";
    var token = "nok";
    const skey =
    {
        "kty": "RSA",
        "e": "AQAB",
        "use": "enc",
        "kid": "e1",
        "n": "vVm75k4dzUw_iuG8NvIvGS8o3dMvlpXwBX44ZcGgBzCnzHKjY37T8newmRcfmFkpvTR0qgYqtPeev5RwOZXXDO9Seg6Zkc_6sZjfSpeiOBebwW1DeZlEiYCTWSg6Ri5H26S3j6R8H_b3BCrtcd3gcmD7OwY280QvJ8eDmbJaj4aAaXf_Ef9RTYz1qJHnehbNRlmRr-OJuuYpsH497Is-c7OvUSLfMkItj9mtRKuk4DQ0LY5c5MYiyx1NidCuQTSK4VZSA3l6zMq-WN1pRb61hjfI74OO7gT256vQZZSq0DrzMPxA0mGeNDBlj6J5cBcdwnTAhF9mojs-ZwcAAvbgQ",
        "alg": "RSA-OAEP",
        "key_ops": ["encrypt", "wrap", ""]
    };
    var options =
    {
        compact: true,
        contentAlg: contentAlg,
        fields:
        {
            "alg": "RSA-OAEP",
            "kid": "e1",
            "cty": "JWT",
            "enc": contentAlg
        }
    };
    ilx.addMethod('test_jwk', async function (req, res) {
        var payload = req.params()[0].toString();
        try {
            key = await JWK.asKey(skey);
        } catch (error) {
            key = "nok";
        }
    
        if (key != "nok") {
            try {
                token = await jose.JWE.createEncrypt(options, key).update(payload, "utf8").final();
            } catch (error) {
                token = "nok";
            }
        }
    
        res.reply(token);
    });
    ilx.listen();
    

    then chaining

    ilx.addMethod('test_jwk',  function (req, res) {
        var payload = req.params()[0].toString();
            JWK.asKey(skey)
            .then( (result) => {
               return  result;
            })
            .then( key => {
                if(key !== "nok"){
                    return jose.JWE.createEncrypt(options, key).update(payload, "utf8").final();
                } else {
                    throw "Invalid key";
                }
            })
            .then( resToken => {
                token = resToken;
                res.reply(token);
            })
            .catch( error => {
                res.reply("nok");
            });
    });
    

    【讨论】:

    • 非常感谢,它适用于顺序执行。我仍然需要找到有关 createEncrypt 的其他问题,它似乎会产生错误,我会对此进行调查。
    【解决方案2】:

    你可以使用异步等待:

    ilx.addMethod('test_jwk', function async (req, res) {
    
    var payload = req.params()[0].toString();
    
    
    try {
          const key = await JWK.asKey(skey);
    
          const token = await jose.JWE.createEncrypt(options, key).update(payload, "utf8").final();
    
          res.reply(token); 
       } catch {
          res.reply('nok');
       }
    
    });
    

    如果你愿意,你可以用 try catch 包围函数体。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-04
      • 2018-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-11
      • 1970-01-01
      • 2017-07-14
      相关资源
      最近更新 更多