首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Nodejs :顺序运行promises

Nodejs :顺序运行promises
EN

Stack Overflow用户
提问于 2020-03-04 16:23:42
回答 2查看 76关注 0票数 2

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

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

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

老实说,我对Node.js并不熟悉。

代码语言:javascript
复制
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();
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-04 16:36:34

您可以使用async/Await。

尝尝这个,

代码语言:javascript
复制
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在一起。

代码语言:javascript
复制
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");
        });
});
票数 2
EN

Stack Overflow用户

发布于 2020-03-04 16:35:13

您可以使用async await:

代码语言:javascript
复制
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把函数体包围起来。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60521761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档