Skip to content

Commit 6e14b82

Browse files
committed
remove lodash dep from authz rule, avoid double calling callbacks, add tests
1 parent e08070f commit 6e14b82

2 files changed

Lines changed: 659 additions & 54 deletions

File tree

server/lib/rules/authorize.js

Lines changed: 51 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@ module.exports = `/*
22
* This rule been automatically generated by auth0-authz-extension
33
* Updated by <%= userName %>, <%= updateTime() %>
44
*/
5-
function (user, context, callback) {
6-
var _ = require('lodash');
5+
async function (user, context, callback) {
76
var EXTENSION_URL = "<%= extensionUrl %>";
87
98
var audience = '';
@@ -17,35 +16,6 @@ function (user, context, callback) {
1716
return callback(new UnauthorizedError('no_end_users'));
1817
}
1918
20-
getPolicy(user, context, function(err, res, data) {
21-
if (err) {
22-
console.log('Error from Authorization Extension:', err);
23-
return callback(new UnauthorizedError('Authorization Extension: ' + err.message));
24-
}
25-
26-
if (res.statusCode !== 200) {
27-
console.log('Error from Authorization Extension:', res.body || res.statusCode);
28-
return callback(
29-
new UnauthorizedError('Authorization Extension: ' + ((res.body && (res.body.message || res.body) || res.statusCode)))
30-
);
31-
}
32-
33-
// Update the user object.<% if (config.groupsInToken && !config.groupsPassthrough) { %>
34-
user.groups = data.groups;<% } %><% if (config.groupsInToken && config.groupsPassthrough) { %>
35-
user.groups = mergeRecords(user.groups, data.groups);<% } %><% if (config.rolesInToken && !config.rolesPassthrough) { %>
36-
user.roles = data.roles;<% } %><% if (config.rolesInToken && config.rolesPassthrough) { %>
37-
user.roles = mergeRecords(user.roles, data.roles);<% } %><% if (config.permissionsInToken && !config.permissionsPassthrough) { %>
38-
user.permissions = data.permissions;<% } %><% if (config.permissionsInToken && config.permissionsPassthrough) { %>
39-
user.permissions = mergeRecords(user.permissions, data.permissions);<% } %>
40-
<% if (config.persistGroups || config.persistRoles || config.persistPermissions) { %>
41-
// Store this in the user profile (app_metadata).
42-
saveToMetadata(user, data.groups, data.roles, data.permissions, function(err) {
43-
return callback(err, user, context);
44-
});
45-
<% } else { %>
46-
return callback(null, user, context);
47-
<% } %> });
48-
4919
// Convert groups to array
5020
function parseGroups(data) {
5121
if (typeof data === 'string') {
@@ -56,22 +26,27 @@ function (user, context, callback) {
5626
}
5727
5828
// Get the policy for the user.
59-
function getPolicy(user, context, cb) {
60-
request.post({
61-
url: EXTENSION_URL + "/api/users/" + user.user_id + "/policy/" + context.clientID,
62-
headers: {
63-
"x-api-key": configuration.AUTHZ_EXT_API_KEY
64-
},
65-
json: {
66-
connectionName: context.connection || user.identities[0].connection,
67-
groups: parseGroups(user.groups)
68-
},
69-
timeout: 5000
70-
}, cb);
29+
function getPolicy(user, context) {
30+
return new Promise((resolve, reject) => {
31+
request.post({
32+
url: EXTENSION_URL + "/api/users/" + user.user_id + "/policy/" + context.clientID,
33+
headers: {
34+
"x-api-key": configuration.AUTHZ_EXT_API_KEY
35+
},
36+
json: {
37+
connectionName: context.connection || user.identities[0].connection,
38+
groups: parseGroups(user.groups)
39+
},
40+
timeout: 5000
41+
}, (err, res, data) => {
42+
if (err) return reject(err);
43+
resolve({ res, data });
44+
});
45+
});
7146
}<% if (config.persistGroups || config.persistRoles || config.persistPermissions) { %>
7247
7348
// Store authorization data in the user profile so we can query it later.
74-
function saveToMetadata(user, groups, roles, permissions, cb) {
49+
async function saveToMetadata(user, groups, roles, permissions) {
7550
user.app_metadata = user.app_metadata || {};
7651
user.app_metadata.authorization = {<% if (config.persistGroups && !config.groupsPassthrough) { %>
7752
groups: groups,<% } %><% if (config.persistGroups && config.groupsPassthrough) { %>
@@ -82,24 +57,46 @@ function (user, context, callback) {
8257
permissions: mergeRecords(user.permissions, permissions)<% } %>
8358
};
8459
85-
auth0.users.updateAppMetadata(user.user_id, user.app_metadata)
86-
.then(function() {
87-
cb();
88-
})
89-
.catch(function(err){
90-
cb(err);
91-
});
60+
await auth0.users.updateAppMetadata(user.user_id, user.app_metadata);
9261
}<% } %><% if (config.groupsPassthrough || config.rolesPassthrough || config.permissionsPassthrough) { %>
9362
9463
// Merge the IdP records with the records of the extension.
9564
function mergeRecords(idpRecords, extensionRecords) {
96-
idpRecords = idpRecords || [ ];
97-
extensionRecords = extensionRecords || [ ];
65+
idpRecords = idpRecords || [];
66+
extensionRecords = extensionRecords || [];
9867
9968
if (!Array.isArray(idpRecords)) {
10069
idpRecords = idpRecords.replace(/,/g, ' ').replace(/\\s+/g, ' ').split(' ');
10170
}
10271
103-
return _.uniq(_.union(idpRecords, extensionRecords));
72+
return [...new Set([...idpRecords, ...extensionRecords])];
10473
}<% } %>
74+
75+
try {
76+
const { res, data } = await getPolicy(user, context);
77+
78+
if (res.statusCode !== 200) {
79+
console.log('Error from Authorization Extension:', res.body || res.statusCode);
80+
return callback(
81+
new UnauthorizedError('Authorization Extension: ' + ((res.body && (res.body.message || res.body)) || res.statusCode))
82+
);
83+
}
84+
85+
// Update the user object.<% if (config.groupsInToken && !config.groupsPassthrough) { %>
86+
user.groups = data.groups;<% } %><% if (config.groupsInToken && config.groupsPassthrough) { %>
87+
user.groups = mergeRecords(user.groups, data.groups);<% } %><% if (config.rolesInToken && !config.rolesPassthrough) { %>
88+
user.roles = data.roles;<% } %><% if (config.rolesInToken && config.rolesPassthrough) { %>
89+
user.roles = mergeRecords(user.roles, data.roles);<% } %><% if (config.permissionsInToken && !config.permissionsPassthrough) { %>
90+
user.permissions = data.permissions;<% } %><% if (config.permissionsInToken && config.permissionsPassthrough) { %>
91+
user.permissions = mergeRecords(user.permissions, data.permissions);<% } %>
92+
93+
<% if (config.persistGroups || config.persistRoles || config.persistPermissions) { %>
94+
await saveToMetadata(user, data.groups, data.roles, data.permissions);
95+
<% } %>
96+
97+
return callback(null, user, context);
98+
} catch (err) {
99+
console.log('Error from Authorization Extension:', err);
100+
return callback(new UnauthorizedError('Authorization Extension: ' + err.message));
101+
}
105102
}`;

0 commit comments

Comments
 (0)