Nodejs:运行 按顺序承诺
Nodejs : run promises sequentially
对于我需要在 F5 big-ip 上使用 private_key_jwt
进行 oauth
客户端身份验证的工作。
由于 oauth 的内置模块不负责这种身份验证,因此必须通过基于 nodejs 的 iRuleLX
模块来实现。
我有下面的代码来加密JWT
,但是在某些系统上,在执行第二个promise之前,第一个promise的结果是不可用的,这导致了c的错误。
我做了一些 google 努力来找到一种方法来顺序处理这两个承诺,但我无法找到实现它的正确方法(在执行 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();
您可以使用异步等待:
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包围函数体。
您可以使用 async/Await。
试试这个,
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");
});
});
对于我需要在 F5 big-ip 上使用 private_key_jwt
进行 oauth
客户端身份验证的工作。
由于 oauth 的内置模块不负责这种身份验证,因此必须通过基于 nodejs 的 iRuleLX
模块来实现。
我有下面的代码来加密JWT
,但是在某些系统上,在执行第二个promise之前,第一个promise的结果是不可用的,这导致了c的错误。
我做了一些 google 努力来找到一种方法来顺序处理这两个承诺,但我无法找到实现它的正确方法(在执行 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();
您可以使用异步等待:
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包围函数体。
您可以使用 async/Await。
试试这个,
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");
});
});