n8n-nodes-duo 1.0.2 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -8
- package/dist/credentials/DuoSecurityApi.credentials.js +10 -1
- package/dist/credentials/DuoSecurityApi.credentials.js.map +1 -1
- package/dist/nodes/DuoSecurity/DuoSecurity.node.js +44 -97
- package/dist/nodes/DuoSecurity/DuoSecurity.node.js.map +2 -2
- package/dist/nodes/DuoSecurity/DuoSecurityTool.node.js +557 -0
- package/dist/nodes/DuoSecurity/DuoSecurityTool.node.js.map +6 -0
- package/examples/workflows/check-api-health.json +245 -35
- package/examples/workflows/duo-human-in-the-loop-approval.json +192 -56
- package/examples/workflows/duo-human-in-the-loop-approval.md +43 -49
- package/package.json +4 -3
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# n8n-nodes-duo
|
|
2
2
|
|
|
3
3
|
> A Wetomate n8n community node for the Duo Security multi-factor authentication API.
|
|
4
|
-
> This package provides authentication, pre-authentication, status checks,
|
|
4
|
+
> This package provides authentication, pre-authentication, status checks, availability checks, and human-in-the-loop approval directly within n8n workflows.
|
|
5
5
|
|
|
6
6
|
## Prerequisites
|
|
7
7
|
|
|
@@ -31,20 +31,32 @@ Create a new Duo credential in n8n with these fields:
|
|
|
31
31
|
Use this credential in all Duo node endpoints.
|
|
32
32
|
See the [Duo Auth API documentation](https://duo.com/docs/authapi) for integration setup and endpoint details.
|
|
33
33
|
|
|
34
|
+
The package provides two nodes: **Duo Security** for regular workflow connections and **Duo Security AI Tool** for connecting Duo operations to an n8n AI Agent. They share the same credential and operation fields, but only the AI Tool node is available through an `ai_tool` connection.
|
|
35
|
+
|
|
36
|
+
## Example: expense reimbursement approval
|
|
37
|
+
|
|
38
|
+
The included [Duo Expense Reimbursement Approval](./examples/workflows/duo-human-in-the-loop-approval.md) workflow starts with an n8n form. A manager receives a Duo Push containing the employee, expense, amount, and reference, and the workflow marks the expense approved only when Duo returns allow.
|
|
39
|
+
|
|
40
|
+
The example is inactive and has no credential references. Replace the example manager username and connect the approved branch to your finance or payroll system before enabling it. The Duo Push is a real authentication challenge.
|
|
41
|
+
|
|
42
|
+
The [Duo Security Capability Showcase](./examples/workflows/check-api-health.json) workflow demonstrates every Duo endpoint, synchronous and asynchronous push flows, status polling, and the separate Duo Security AI Tool connected to an AI Agent. It has five independent Manual Trigger scenarios. Assign a Duo credential to the Duo nodes and configure the chat model before running it; the AUTH paths create real authentication challenges.
|
|
43
|
+
|
|
34
44
|
## Supported endpoints
|
|
35
45
|
|
|
36
|
-
| Endpoint | Description
|
|
37
|
-
| ---------------------- |
|
|
38
|
-
| `/auth/v2/auth` | Starts second-factor authentication with a push notification, passcode, phone call, or SMS passcode delivery.
|
|
39
|
-
| `/auth/v2/auth_status` | Waits for the next status update from an asynchronous authentication transaction.
|
|
40
|
-
| `/auth/v2/
|
|
41
|
-
| `/auth/v2/
|
|
46
|
+
| Endpoint | Description |
|
|
47
|
+
| ---------------------- | ------------------------------------------------------------------------------------------------------------- |
|
|
48
|
+
| `/auth/v2/auth` | Starts second-factor authentication with a push notification, passcode, phone call, or SMS passcode delivery. |
|
|
49
|
+
| `/auth/v2/auth_status` | Waits for the next status update from an asynchronous authentication transaction. |
|
|
50
|
+
| `/auth/v2/check` | Verifies the Auth API integration, secret keys, and request signature. |
|
|
51
|
+
| `/auth/v2/logo` | Retrieves the stored Duo logo. |
|
|
52
|
+
| `/auth/v2/ping` | Checks whether the Duo Auth API is available without requiring a signed request. |
|
|
53
|
+
| `/auth/v2/preauth` | Checks whether a user may authenticate and returns the authentication factors available to that user. |
|
|
42
54
|
|
|
43
55
|
Each operation accepts input parameters and returns JSON output.
|
|
44
56
|
|
|
45
57
|
## Development and testing
|
|
46
58
|
|
|
47
|
-
When the repository Docker development environment starts, it imports the inactive [`Duo
|
|
59
|
+
When the repository Docker development environment starts, it imports the inactive [`Duo Security Capability Showcase`](./examples/workflows/check-api-health.json) and [`Duo Expense Reimbursement Approval`](./examples/workflows/duo-human-in-the-loop-approval.json) sample workflows. The showcase demonstrates every Duo endpoint, synchronous and asynchronous push flows, status polling, and the node connected as an AI tool. The approval example starts with an expense form, sends contextual `pushinfo` in a synchronous Duo Push, and branches on the manager's decision; its usage notes are documented in [`duo-human-in-the-loop-approval.md`](./examples/workflows/duo-human-in-the-loop-approval.md). Both workflows intentionally omit credentials. Create or select a Duo credential and use test users before running them; the push steps have a real effect.
|
|
48
60
|
|
|
49
61
|
From the repository root, install the locked dependencies and run the Duo package checks with:
|
|
50
62
|
|
|
@@ -56,6 +56,15 @@ function canonicalizeV5(method, host, path, params, date, body) {
|
|
|
56
56
|
hashString("")
|
|
57
57
|
].join("\n");
|
|
58
58
|
}
|
|
59
|
+
function isPingRequest(url) {
|
|
60
|
+
if (!url) return false;
|
|
61
|
+
if (url === "/auth/v2/ping") return true;
|
|
62
|
+
try {
|
|
63
|
+
return new URL(url).pathname === "/auth/v2/ping";
|
|
64
|
+
} catch {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
59
68
|
function signV5(ikey, skey, method, host, path, params, date, body) {
|
|
60
69
|
const canon = canonicalizeV5(method, host, path, params, date, body);
|
|
61
70
|
const sig = crypto.createHmac("sha512", skey).update(canon).digest("hex");
|
|
@@ -109,7 +118,7 @@ var DuoSecurityApi = class {
|
|
|
109
118
|
const ikey = credentials.ikey;
|
|
110
119
|
const skey = credentials.skey;
|
|
111
120
|
const hostname = credentials.hostname;
|
|
112
|
-
if (requestOptions.url
|
|
121
|
+
if (!isPingRequest(requestOptions.url)) {
|
|
113
122
|
const date = (/* @__PURE__ */ new Date()).toUTCString();
|
|
114
123
|
const bodyString = requestOptions.body !== void 0 ? requestOptions.body : "";
|
|
115
124
|
const auth = signV5(
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../credentials/DuoSecurityApi.credentials.ts"],
|
|
4
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,aAAwB;AAiBxB,SAAS,YAAY,QAA2C;AAC/D,SAAO,OAAO,KAAK,MAAM,EACvB,KAAK,EACL,QAAQ,CAAC,MAAM;AACf,UAAM,QAAQ,OAAO,CAAC;AACtB,UAAM,MAAM,mBAAmB,CAAC,IAAI;AACpC,WAAO,MAAM,QAAQ,KAAK,IACvB,MAAM,IAAI,CAAC,MAAM,MAAM,mBAAmB,CAAC,CAAC,IAC5C,CAAC,MAAM,mBAAmB,KAAK,CAAC;AAAA,EACpC,CAAC,EACA,KAAK,GAAG,EACR,QAAQ,YAAY,CAAC,MAAM,MAAM,EAAE,WAAW,CAAC,EAAE,SAAS,EAAE,EAAE,YAAY,CAAC;AAC9E;AAQA,SAAS,WAAW,SAA0B;AAC7C,SAAc,kBAAW,QAAQ,EAAE,OAAO,OAAO,EAAE,OAAO,KAAK;AAChE;AAEA,SAAS,eACR,QACA,MACA,MACA,QACA,MACA,MACS;AACT,SAAO;AAAA,IACN;AAAA,IACA,OAAO,YAAY;AAAA,IACnB,KAAK,YAAY;AAAA,IACjB;AAAA,IACA,YAAY,MAAM;AAAA,IAClB,WAAW,IAAI;AAAA,IACf,WAAW,EAAE;AAAA,EACd,EAAE,KAAK,IAAI;AACZ;AAEO,SAAS,OACf,MACA,MACA,QACA,MACA,MACA,QACA,MACA,MACS;AACT,QAAM,QAAQ,eAAe,QAAQ,MAAM,MAAM,QAAQ,MAAM,IAAI;AACnE,QAAM,MAAa,kBAAW,UAAU,IAAI,EAAE,OAAO,KAAK,EAAE,OAAO,KAAK;AAExE,QAAM,OAAO,OAAO,KAAK,CAAC,MAAM,GAAG,EAAE,KAAK,GAAG,CAAC,EAAE,SAAS,QAAQ;AACjE,SAAO,WAAW;AACnB;AAEO,IAAM,iBAAN,MAAgD;AAAA,EAAhD;AACN,gBAAO;AACP,uBAAc;AACd,4BAAmB;AACnB,gBAAgC;AAAA,MAC/B,OAAO;AAAA,MACP,MAAM;AAAA,IACP;AAEA,sBAAgC;AAAA,MAC/B;AAAA,QACC,aAAa;AAAA,QACb,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,QACT,aAAa;AAAA,MACd;AAAA;AAAA,MAEA;AAAA,QACC,aAAa;AAAA,QACb,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,QACT,aAAa;AAAA,UACZ,UAAU;AAAA,QACX;AAAA,MACD;AAAA,MACA;AAAA,QACC,aAAa;AAAA,QACb,MAAM;AAAA,QACN,MAAM;AAAA,QACN,aAAa;AAAA,QACb,aAAa;AAAA,QACb,SAAS;AAAA,MACV;AAAA,IACD;AAsCA,gBAA+B;AAAA,MAC9B,SAAS;AAAA,QACR,KAAK;AAAA,QACL,QAAQ;AAAA,MACT;AAAA,IACD;AAAA;AAAA,EAzCA,MAAM,aACL,aACA,gBAC+B;AAC/B,UAAM,OAAO,YAAY;AACzB,UAAM,OAAO,YAAY;AACzB,UAAM,WAAW,YAAY;AAE7B,QAAI,eAAe,
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -34,41 +34,17 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
34
34
|
));
|
|
35
35
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
36
36
|
|
|
37
|
-
// ../wetomate-node-toolkit/dist/
|
|
38
|
-
var
|
|
39
|
-
"../wetomate-node-toolkit/dist/
|
|
37
|
+
// ../wetomate-node-toolkit/dist/collections.js
|
|
38
|
+
var require_collections = __commonJS({
|
|
39
|
+
"../wetomate-node-toolkit/dist/collections.js"(exports2) {
|
|
40
40
|
"use strict";
|
|
41
41
|
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
42
|
-
exports2.WetomateNodePropertiesArray = void 0;
|
|
43
42
|
exports2.processOptionalCollections = processOptionalCollections2;
|
|
44
|
-
var WetomateNodePropertiesArray = class extends Array {
|
|
45
|
-
processParams(ctx, itemIndex) {
|
|
46
|
-
return this.reduce((params, prop) => {
|
|
47
|
-
const value = ctx.getNodeParameter(prop.name, itemIndex, "ignore");
|
|
48
|
-
if (value !== "ignore") {
|
|
49
|
-
if (prop.process) {
|
|
50
|
-
const processed = prop.process(value, ctx);
|
|
51
|
-
if (processed) {
|
|
52
|
-
if (typeof processed === "object") {
|
|
53
|
-
Object.assign(params, processed);
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
} else {
|
|
57
|
-
params[prop.name] = String(value).trim();
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
return params;
|
|
61
|
-
}, {});
|
|
62
|
-
}
|
|
63
|
-
};
|
|
64
|
-
exports2.WetomateNodePropertiesArray = WetomateNodePropertiesArray;
|
|
65
43
|
function processOptionalCollections2(value) {
|
|
66
44
|
const processed = {};
|
|
67
45
|
for (const [key, val] of Object.entries(value)) {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
processed[key] = strValue;
|
|
71
|
-
}
|
|
46
|
+
if (val !== void 0 && val !== null)
|
|
47
|
+
processed[key] = String(val).trim();
|
|
72
48
|
}
|
|
73
49
|
return Object.keys(processed).length ? processed : {};
|
|
74
50
|
}
|
|
@@ -121,7 +97,7 @@ var require_dist = __commonJS({
|
|
|
121
97
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports3, p)) __createBinding(exports3, m, p);
|
|
122
98
|
};
|
|
123
99
|
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
124
|
-
__exportStar(
|
|
100
|
+
__exportStar(require_collections(), exports2);
|
|
125
101
|
__exportStar(require_parameter_mapping(), exports2);
|
|
126
102
|
}
|
|
127
103
|
});
|
|
@@ -134,7 +110,7 @@ __export(DuoSecurity_node_exports, {
|
|
|
134
110
|
module.exports = __toCommonJS(DuoSecurity_node_exports);
|
|
135
111
|
var import_n8n_workflow2 = require("n8n-workflow");
|
|
136
112
|
|
|
137
|
-
// nodes/DuoSecurity/V1/
|
|
113
|
+
// nodes/DuoSecurity/V1/DuoSecurityV1Base.ts
|
|
138
114
|
var import_n8n_workflow = require("n8n-workflow");
|
|
139
115
|
|
|
140
116
|
// nodes/DuoSecurity/V1/duoProperties.ts
|
|
@@ -485,72 +461,38 @@ function safeStringify(obj) {
|
|
|
485
461
|
return obj ? JSON.stringify(sortParams(obj)) : "";
|
|
486
462
|
}
|
|
487
463
|
|
|
488
|
-
// nodes/DuoSecurity/V1/
|
|
489
|
-
var
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
description: "Connects n8n workflows to Duo Security for user verification and second-factor authentication.",
|
|
497
|
-
builderHint: {
|
|
498
|
-
message: "Use for Duo user verification, pre-authentication, Duo Push approval, passcode authentication, or authentication status checks."
|
|
499
|
-
},
|
|
500
|
-
defaults: {
|
|
501
|
-
name: "Duo Security"
|
|
502
|
-
},
|
|
503
|
-
inputs: [import_n8n_workflow.NodeConnectionTypes.Main],
|
|
504
|
-
outputs: [import_n8n_workflow.NodeConnectionTypes.Main],
|
|
505
|
-
credentials: [
|
|
506
|
-
{
|
|
507
|
-
name: "duoSecurityApi",
|
|
508
|
-
required: true
|
|
509
|
-
}
|
|
510
|
-
],
|
|
511
|
-
hints: [
|
|
512
|
-
{
|
|
513
|
-
message: "The AUTH operation sends a real authentication challenge to the selected user.",
|
|
514
|
-
type: "warning",
|
|
515
|
-
location: "ndv",
|
|
516
|
-
whenToDisplay: "always",
|
|
517
|
-
displayCondition: '={{ $parameter["endpoint"] === "auth" }}'
|
|
518
|
-
},
|
|
519
|
-
{
|
|
520
|
-
message: "For asynchronous authentication, pass the transaction ID returned by AUTH to AUTH STATUS.",
|
|
521
|
-
type: "info",
|
|
522
|
-
location: "ndv",
|
|
523
|
-
whenToDisplay: "always",
|
|
524
|
-
displayCondition: '={{ $parameter["endpoint"] === "auth_status" }}'
|
|
525
|
-
}
|
|
526
|
-
],
|
|
527
|
-
properties: duoProperties,
|
|
528
|
-
usableAsTool: {
|
|
529
|
-
replacements: {
|
|
530
|
-
description: "Use Duo Security to verify a user or start a second-factor authentication challenge. Use PREAUTH before AUTH when checking whether a user can authenticate. Use Push Notification for administrator approvals and include only non-secret context in Push Info. Treat only an explicit result.response.result of allow as approval; never continue after a missing, denied, expired, or failed response."
|
|
531
|
-
}
|
|
532
|
-
}
|
|
533
|
-
};
|
|
534
|
-
var DuoSecurityV1 = class {
|
|
535
|
-
constructor(baseDescription) {
|
|
464
|
+
// nodes/DuoSecurity/V1/DuoSecurityV1Base.ts
|
|
465
|
+
var DuoSecurityV1Base = class {
|
|
466
|
+
constructor(baseDescription, mode) {
|
|
467
|
+
this.icon = {
|
|
468
|
+
light: "file:duo.svg",
|
|
469
|
+
dark: "file:duo-dark.svg"
|
|
470
|
+
};
|
|
471
|
+
const isTool = mode === "tool";
|
|
536
472
|
this.description = {
|
|
537
|
-
|
|
538
|
-
|
|
473
|
+
...baseDescription,
|
|
474
|
+
displayName: isTool ? "Duo Security AI Tool" : "Duo Security",
|
|
475
|
+
name: isTool ? "duoSecurityTool" : "duoSecurity",
|
|
539
476
|
icon: { light: "file:duo.svg", dark: "file:duo-dark.svg" },
|
|
540
477
|
group: ["transform"],
|
|
541
|
-
subtitle: "Duo Security Multi-factor Authentication/Authorization",
|
|
478
|
+
subtitle: isTool ? "Duo Security operations for AI agents" : "Duo Security Multi-factor Authentication/Authorization",
|
|
542
479
|
version: 1,
|
|
543
|
-
description: "Duo Security
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
...
|
|
553
|
-
|
|
480
|
+
description: isTool ? "Use Duo Security operations as a tool for an AI agent." : "Connects n8n workflows to Duo Security for user verification and second-factor authentication.",
|
|
481
|
+
builderHint: {
|
|
482
|
+
message: isTool ? "Use this tool to check Duo user access or start a second-factor authentication challenge when the workflow requires it." : "Use for Duo user verification, pre-authentication, Duo Push approval, or authentication status checks."
|
|
483
|
+
},
|
|
484
|
+
defaults: { name: isTool ? "Duo Security AI Tool" : "Duo Security" },
|
|
485
|
+
inputs: isTool ? [] : [import_n8n_workflow.NodeConnectionTypes.Main],
|
|
486
|
+
outputs: isTool ? [import_n8n_workflow.NodeConnectionTypes.AiTool] : [import_n8n_workflow.NodeConnectionTypes.Main],
|
|
487
|
+
credentials: [{ name: "duoSecurityApi", required: true }],
|
|
488
|
+
properties: duoProperties,
|
|
489
|
+
...isTool ? {
|
|
490
|
+
usableAsTool: {
|
|
491
|
+
replacements: {
|
|
492
|
+
description: "Use Duo Security to verify a user or start a second-factor authentication challenge. Use PREAUTH before AUTH when checking whether a user can authenticate. Treat only an explicit result.response.result of allow as approval; never continue after a missing, denied, expired, or failed response."
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
} : {}
|
|
554
496
|
};
|
|
555
497
|
}
|
|
556
498
|
async execute() {
|
|
@@ -565,11 +507,9 @@ var DuoSecurityV1 = class {
|
|
|
565
507
|
method,
|
|
566
508
|
url: `/auth/v2/${endpoint}`,
|
|
567
509
|
json: true,
|
|
568
|
-
body: isPost ? safeStringify(processedParams) :
|
|
510
|
+
body: isPost ? safeStringify(processedParams) : "",
|
|
569
511
|
qs: isPost ? {} : processedParams,
|
|
570
|
-
headers: {
|
|
571
|
-
"Content-Type": "application/json"
|
|
572
|
-
}
|
|
512
|
+
headers: { "Content-Type": "application/json" }
|
|
573
513
|
};
|
|
574
514
|
const response = await this.helpers.httpRequestWithAuthentication.call(
|
|
575
515
|
this,
|
|
@@ -585,6 +525,13 @@ var DuoSecurityV1 = class {
|
|
|
585
525
|
}
|
|
586
526
|
};
|
|
587
527
|
|
|
528
|
+
// nodes/DuoSecurity/V1/DuoSecurityV1.ts
|
|
529
|
+
var DuoSecurityV1 = class extends DuoSecurityV1Base {
|
|
530
|
+
constructor(baseDescription) {
|
|
531
|
+
super(baseDescription, "regular");
|
|
532
|
+
}
|
|
533
|
+
};
|
|
534
|
+
|
|
588
535
|
// nodes/DuoSecurity/DuoSecurity.node.ts
|
|
589
536
|
var DuoSecurity = class extends import_n8n_workflow2.VersionedNodeType {
|
|
590
537
|
constructor() {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../../../wetomate-node-toolkit/src/
|
|
4
|
-
"mappings": "
|
|
3
|
+
"sources": ["../../../../wetomate-node-toolkit/src/collections.ts", "../../../../wetomate-node-toolkit/src/parameter-mapping.ts", "../../../../wetomate-node-toolkit/src/index.ts", "../../../nodes/DuoSecurity/DuoSecurity.node.ts", "../../../nodes/DuoSecurity/V1/DuoSecurityV1Base.ts", "../../../nodes/DuoSecurity/V1/duoProperties.ts", "../../../nodes/DuoSecurity/V1/duoParameterMapping.ts", "../../../nodes/DuoSecurity/utils/duoUtils.ts", "../../../nodes/DuoSecurity/V1/DuoSecurityV1.ts"],
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": ["exports", "processOptionalCollections", "exports", "mapNodeParameters", "exports", "import_n8n_workflow"]
|
|
6
6
|
}
|