Skip to content

Commit 7801781

Browse files
committed
add groups sample, revise roles sample
1 parent cc11bdc commit 7801781

50 files changed

Lines changed: 3076 additions & 205 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

4-AccessControl/1-app-roles/App/app.js

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,14 @@
55

66
const express = require('express');
77
const session = require('express-session');
8-
const methodOverride = require('method-override')
8+
const methodOverride = require('method-override');
99
const path = require('path');
1010

11-
const router = require('./routes/router');
11+
const msalWrapper = require('../../../../msal-express-wrapper/dist/index');
12+
const config = require('./appSettings.js');
13+
const cache = require('./utils/cachePlugin');
14+
const mainRouter = require('./routes/mainRoutes');
15+
1216
const SERVER_PORT = process.env.PORT || 4000;
1317

1418
// initialize express
@@ -29,14 +33,31 @@ app.use(express.json());
2933

3034
/**
3135
* Using express-session middleware. Be sure to familiarize yourself with available options
32-
* and set as desired. Visit: https://www.npmjs.com/package/express-session
36+
* and set them as desired. Visit: https://www.npmjs.com/package/express-session
3337
*/
34-
app.use(session({
35-
secret: 'ENTER_YOUR_SECRET_HERE',
36-
resave: false,
37-
saveUninitialized: false
38-
}));
39-
40-
app.use(router);
38+
const sessionConfig = {
39+
secret: 'ENTER_YOUR_SECRET_HERE',
40+
resave: false,
41+
saveUninitialized: false,
42+
cookie: {
43+
secure: false, // set this to true on production
44+
}
45+
}
46+
47+
if (app.get('env') === 'production') {
48+
app.set('trust proxy', 1) // trust first proxy
49+
sessionConfig.cookie.secure = true // serve secure cookies
50+
}
51+
52+
app.use(session(sessionConfig));
53+
54+
// instantiate the wrapper
55+
const authProvider = new msalWrapper.AuthProvider(config, cache);
56+
57+
// initialize the wrapper
58+
app.use(authProvider.initialize());
59+
60+
// pass the instance to your route handlers
61+
app.use(mainRouter(authProvider));
4162

4263
app.listen(SERVER_PORT, () => console.log(`Msal Node Auth Code Sample app listening on port ${SERVER_PORT}!`));
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
const appSettings = {
2+
appCredentials: {
3+
clientId: "Enter_the_Application_Id_Here",
4+
tenantId: "Enter_the_Tenant_Info_Here",
5+
clientSecret: "Enter_the_Client_Secret_Here"
6+
},
7+
authRoutes: {
8+
redirect: "/redirect",
9+
error: "/error",
10+
unauthorized: "/unauthorized"
11+
},
12+
accessMatrix: {
13+
todolist: {
14+
methods: ["GET", "POST", "DELETE"],
15+
roles: ["TaskUser", "TaskAdmin"]
16+
},
17+
dashboard: {
18+
methods: ["GET"],
19+
roles: ["TaskAdmin"]
20+
}
21+
}
22+
}
23+
24+
module.exports = appSettings;

4-AccessControl/1-app-roles/App/appSettings.json

Lines changed: 0 additions & 24 deletions
This file was deleted.
Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,7 @@
1-
const lowdb = require('lowdb');
2-
const FileSync = require('lowdb/adapters/FileSync');
3-
const adapter = new FileSync('./data/db.json');
4-
const db = lowdb(adapter);
1+
const Todo = require('../model/todo');
52

63
exports.getAllTodos = (req, res) => {
7-
const todos = db.get('todos')
8-
.value();
4+
const todos = Todo.getAllTodos();
95

106
res.render('dashboard', { isAuthenticated: req.session.isAuthenticated, todos: todos });
117
}
Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,22 @@
1-
const lowdb = require('lowdb');
2-
const FileSync = require('lowdb/adapters/FileSync');
3-
const adapter = new FileSync('./data/db.json');
4-
const db = lowdb(adapter);
1+
const Todo = require('../model/todo');
52
const { nanoid } = require('nanoid');
63

74
exports.getTodos = (req, res) => {
85
const owner = req.session.account.idTokenClaims['preferred_username'];
96

10-
const todos = db.get('todos')
11-
.filter({ owner: owner })
12-
.value();
7+
const todos = Todo.getTodosByOwner(owner)
138

149
res.render('todolist', { isAuthenticated: req.session.isAuthenticated, todos: todos });
1510
}
1611

1712
exports.postTodo = (req, res) => {
18-
const newTodo = {
19-
id: nanoid(),
20-
name: req.body.name,
21-
owner: req.session.account.idTokenClaims['preferred_username'],
22-
};
13+
const id = nanoid();
14+
const name = req.body.name;
15+
const owner = req.session.account.idTokenClaims['preferred_username'];
16+
17+
const newTodo = new Todo(id, name, owner)
2318

24-
db.get('todos').push(newTodo).write();
19+
Todo.postTodo(newTodo);
2520

2621
res.redirect('/todolist');
2722
}
@@ -30,9 +25,7 @@ exports.deleteTodo = (req, res) => {
3025
const id = req.body.id;
3126
const owner = req.session.account.idTokenClaims['preferred_username'];
3227

33-
db.get('todos')
34-
.remove({ owner: owner, id: id })
35-
.write();
28+
Todo.deleteTodo(id, owner);
3629

3730
res.redirect('/todolist');
3831
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"Account":{"a283a601-6ad4-4528-975d-6abbefa5edd7.cbaf2168-de14-4c72-9d88-f5f05366dbef-login.windows.net-cbaf2168-de14-4c72-9d88-f5f05366dbef":{"home_account_id":"a283a601-6ad4-4528-975d-6abbefa5edd7.cbaf2168-de14-4c72-9d88-f5f05366dbef","environment":"login.windows.net","realm":"cbaf2168-de14-4c72-9d88-f5f05366dbef","local_account_id":"a283a601-6ad4-4528-975d-6abbefa5edd7","username":"admin@msaltestingjs.onmicrosoft.com","authority_type":"MSSTS","name":"Dogan Erisen","client_info":"eyJ1aWQiOiJhMjgzYTYwMS02YWQ0LTQ1MjgtOTc1ZC02YWJiZWZhNWVkZDciLCJ1dGlkIjoiY2JhZjIxNjgtZGUxNC00YzcyLTlkODgtZjVmMDUzNjZkYmVmIn0"}},"IdToken":{"a283a601-6ad4-4528-975d-6abbefa5edd7.cbaf2168-de14-4c72-9d88-f5f05366dbef-login.windows.net-idtoken-d6c675c8-2e24-44a8-97c2-be3e503855bb-cbaf2168-de14-4c72-9d88-f5f05366dbef-":{"home_account_id":"a283a601-6ad4-4528-975d-6abbefa5edd7.cbaf2168-de14-4c72-9d88-f5f05366dbef","environment":"login.windows.net","credential_type":"IdToken","client_id":"d6c675c8-2e24-44a8-97c2-be3e503855bb","secret":"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6Im5PbzNaRHJPRFhFSzFqS1doWHNsSFJfS1hFZyJ9.eyJhdWQiOiJkNmM2NzVjOC0yZTI0LTQ0YTgtOTdjMi1iZTNlNTAzODU1YmIiLCJpc3MiOiJodHRwczovL2xvZ2luLm1pY3Jvc29mdG9ubGluZS5jb20vY2JhZjIxNjgtZGUxNC00YzcyLTlkODgtZjVmMDUzNjZkYmVmL3YyLjAiLCJpYXQiOjE2MjM4OTI5NjYsIm5iZiI6MTYyMzg5Mjk2NiwiZXhwIjoxNjIzODk2ODY2LCJuYW1lIjoiRG9nYW4gRXJpc2VuIiwib2lkIjoiYTI4M2E2MDEtNmFkNC00NTI4LTk3NWQtNmFiYmVmYTVlZGQ3IiwicHJlZmVycmVkX3VzZXJuYW1lIjoiYWRtaW5AbXNhbHRlc3Rpbmdqcy5vbm1pY3Jvc29mdC5jb20iLCJyaCI6IjAuQVVVQWFDR3Z5eFRlY2t5ZGlQWHdVMmJiNzhoMXh0WWtMcWhFbDhLLVBsQTRWYnRGQURnLiIsInJvbGVzIjpbIlRhc2tBZG1pbiIsIlRhc2tVc2VyIl0sInN1YiI6IjE3OUJuVlhxeVVnWnZLOGV5OG5mT0lXbm9YZ2hTZFFhUXFfMlQtdkV0RTAiLCJ0aWQiOiJjYmFmMjE2OC1kZTE0LTRjNzItOWQ4OC1mNWYwNTM2NmRiZWYiLCJ1dGkiOiJmdFdzTDJFckxrU2E1aE82bGZFcEFBIiwidmVyIjoiMi4wIn0.QbGtdURNQ1AtGDxeYudgJOve-PuDWLEeM96jf6s7XHye5_StRLXkF4qMV3PYnO5W3TtCiS2A9Xh7i4d6xo6GjT8yxDM6u04VzzJOp_DXttfTmjEvkMcRz6N0nx3pWxntPWtWrI9wVLAdlYn7BnnA_lMcLoCXX_QznpMLaRaW_jOp0R7EHPYk-KAqSoQbq_6SMvG-nFdFFDAeLRFbwEe8LJS9gDFZuPDa0_UaDsDgVx2RWhpq2AO0dpDXcxieOAZ9aq9dSP45GFjHgpr8d6ESTctHqVA5qApb0-Mm2Ku91Q7K2yo9wz4inLalughS25neFu2EZjrrdieXv8xq8ZYdjA","realm":"cbaf2168-de14-4c72-9d88-f5f05366dbef"}},"AccessToken":{"a283a601-6ad4-4528-975d-6abbefa5edd7.cbaf2168-de14-4c72-9d88-f5f05366dbef-login.windows.net-accesstoken-d6c675c8-2e24-44a8-97c2-be3e503855bb-cbaf2168-de14-4c72-9d88-f5f05366dbef-openid profile email":{"home_account_id":"a283a601-6ad4-4528-975d-6abbefa5edd7.cbaf2168-de14-4c72-9d88-f5f05366dbef","environment":"login.windows.net","credential_type":"AccessToken","client_id":"d6c675c8-2e24-44a8-97c2-be3e503855bb","secret":"eyJ0eXAiOiJKV1QiLCJub25jZSI6InR0NGxiSm5ncV9vTHE3aWwyaTdsb2RNdmxlWUlXWDM1SFVPRHI2LW5SOW8iLCJhbGciOiJSUzI1NiIsIng1dCI6Im5PbzNaRHJPRFhFSzFqS1doWHNsSFJfS1hFZyIsImtpZCI6Im5PbzNaRHJPRFhFSzFqS1doWHNsSFJfS1hFZyJ9.eyJhdWQiOiIwMDAwMDAwMy0wMDAwLTAwMDAtYzAwMC0wMDAwMDAwMDAwMDAiLCJpc3MiOiJodHRwczovL3N0cy53aW5kb3dzLm5ldC9jYmFmMjE2OC1kZTE0LTRjNzItOWQ4OC1mNWYwNTM2NmRiZWYvIiwiaWF0IjoxNjIzODkyOTY2LCJuYmYiOjE2MjM4OTI5NjYsImV4cCI6MTYyMzg5Njg2NiwiYWNjdCI6MCwiYWNyIjoiMSIsImFjcnMiOlsidXJuOnVzZXI6cmVnaXN0ZXJzZWN1cml0eWluZm8iLCJ1cm46bWljcm9zb2Z0OnJlcTEiLCJ1cm46bWljcm9zb2Z0OnJlcTIiLCJ1cm46bWljcm9zb2Z0OnJlcTMiLCJjMSIsImMyIiwiYzMiLCJjNCIsImM1IiwiYzYiLCJjNyIsImM4IiwiYzkiLCJjMTAiLCJjMTEiLCJjMTIiLCJjMTMiLCJjMTQiLCJjMTUiLCJjMTYiLCJjMTciLCJjMTgiLCJjMTkiLCJjMjAiLCJjMjEiLCJjMjIiLCJjMjMiLCJjMjQiLCJjMjUiXSwiYWlvIjoiQVNRQTIvOFRBQUFBa24zbXJmU2tuY2psSUFWM09lZjN2cGVBSENDM2NvMnVZUXpkR2pqMmhsOD0iLCJhbXIiOlsicHdkIl0sImFwcF9kaXNwbGF5bmFtZSI6Im5vZGUtYXBwLXJvbGVzIiwiYXBwaWQiOiJkNmM2NzVjOC0yZTI0LTQ0YTgtOTdjMi1iZTNlNTAzODU1YmIiLCJhcHBpZGFjciI6IjEiLCJkZXZpY2VpZCI6IjQ5ZDM1OGQ3LTk5NGQtNDA3OC05NjRlLWNlNWRmNjMxOTM1OSIsImZhbWlseV9uYW1lIjoiRXJpc2VuIiwiZ2l2ZW5fbmFtZSI6IkRvZ2FuIiwiaWR0eXAiOiJ1c2VyIiwiaXBhZGRyIjoiMTcyLjEwMy4yMzMuMTY3IiwibmFtZSI6IkRvZ2FuIEVyaXNlbiIsIm9pZCI6ImEyODNhNjAxLTZhZDQtNDUyOC05NzVkLTZhYmJlZmE1ZWRkNyIsInBsYXRmIjoiMyIsInB1aWQiOiIxMDAzMjAwMDk2NERCNDlEIiwicmgiOiIwLkFVVUFhQ0d2eXhUZWNreWRpUFh3VTJiYjc4aDF4dFlrTHFoRWw4Sy1QbEE0VmJ0RkFEZy4iLCJzY3AiOiJvcGVuaWQgcHJvZmlsZSBlbWFpbCIsInN1YiI6Ikozc0xRRmFSb0taMlViMzBOakNhOE45OWxFWmlwZmpvaDZibHpCUmZOZmciLCJ0ZW5hbnRfcmVnaW9uX3Njb3BlIjoiTkEiLCJ0aWQiOiJjYmFmMjE2OC1kZTE0LTRjNzItOWQ4OC1mNWYwNTM2NmRiZWYiLCJ1bmlxdWVfbmFtZSI6ImFkbWluQG1zYWx0ZXN0aW5nanMub25taWNyb3NvZnQuY29tIiwidXBuIjoiYWRtaW5AbXNhbHRlc3Rpbmdqcy5vbm1pY3Jvc29mdC5jb20iLCJ1dGkiOiJmdFdzTDJFckxrU2E1aE82bGZFcEFBIiwidmVyIjoiMS4wIiwid2lkcyI6WyI2MmU5MDM5NC02OWY1LTQyMzctOTE5MC0wMTIxNzcxNDVlMTAiLCJiNzlmYmY0ZC0zZWY5LTQ2ODktODE0My03NmIxOTRlODU1MDkiXSwieG1zX3N0Ijp7InN1YiI6IjE3OUJuVlhxeVVnWnZLOGV5OG5mT0lXbm9YZ2hTZFFhUXFfMlQtdkV0RTAifSwieG1zX3RjZHQiOjE1NzkzMDk0MDR9.G8nWe_6Rft814_1f-6eJ-A46rNmX2ldbdnSDMswuydagxLLSLzAJMLaq_i7I5XyUZyrBbzk5OD0dcxOPk-cf4REaNGtb6n15C__X2Ibg6oSF2_f5pYL6NU-_sJaTUzxAKv7SanzN4EjCRnxMxH8PajVLW6B3TPhVEEbWOrOCzuWH_XHfhFIn-zoDMCBg4mMfVKIqfXne0nHmYBE0c4ezJjD4kvUsc51RsdFutFBd78kCWqvIr7DwNf_9Iy5l4DtIMZk-SIvCjH_pL1xsH_rrDfVJ_9HT73k_SUZDT7yHUUL4Km8kOFuxATb1od3fTGlHuwz-vFJxNSGtw5clj4Rw_A","realm":"cbaf2168-de14-4c72-9d88-f5f05366dbef","target":"openid profile email","cached_at":"1623893267","expires_on":"1623896865","extended_expires_on":"1623900464","token_type":"Bearer"}},"RefreshToken":{"a283a601-6ad4-4528-975d-6abbefa5edd7.cbaf2168-de14-4c72-9d88-f5f05366dbef-login.windows.net-refreshtoken-d6c675c8-2e24-44a8-97c2-be3e503855bb--":{"home_account_id":"a283a601-6ad4-4528-975d-6abbefa5edd7.cbaf2168-de14-4c72-9d88-f5f05366dbef","environment":"login.windows.net","credential_type":"RefreshToken","client_id":"d6c675c8-2e24-44a8-97c2-be3e503855bb","secret":"0.AUUAaCGvyxTeckydiPXwU2bb78h1xtYkLqhEl8K-PlA4VbtFADg.AgABAAAAAAD--DLA3VO7QrddgJg7WevrAgDs_wQA9P-v8jeBTUVThUzSL8nesl4Abz9VKLEzd-p-nOB1ScVmLovLAwLoDiBgW9jB009e1n83ONuO8N2XAWeQkvax3WYwUWDUuSVZx0MUCfsVkBEvElBKZcxg6K9hhbmOlJgk2snySCQemD2Q9fXGnONZwy1AlJ0Q1jzRgBZF1ieHs_uAx9QQPuoPQSNDj9tGUoOyYNpCW6NgnlRfObI1BHiTQLQ6AFKSnfLpvhzZJoXIUBWPw5GqZ7YWl3608WykYEDpQyTlrfOR6N3UeVdllYOFK0GieghKGeb2i_M2ZVTZ2tgQo2IxQgt6827ScWma07r-eEd28YcnhYZTFBGVa_L35jZVTMscIkKVjCqNYZHRv7p40rP-fFjii1Q9KcmKGbXp_TPXnrWL81GN8nyNdgK_Pa6_vmMZi9teO9fR_4XcAj_W_tEIXG-pniszDpGb2hAodSMsjVKT7M6ZLRTiqf-VQlCoqIdWMlfKpMl-4L1tf1JdO0JvKuFFvlpKMlQBrmeAMUuxiurjYgp7_etrBm1k0FpK0CnQdCN4R3aY9GEXZq_GDtnuoK45iShiEo7wrNuGSUrC3u6irg6vkp50DBAEfVRQJWy_6BxrAh0rgl5fHpbBFAGXTcEuaaBkeMJCKlolaJV9arE1BePbjQYqZoRKg_XRYbH_WsPaGDfHbdCbV0oVkKxfT7yutQ6Odhr9tNj62bngziDXZeUSgWjjLVytCbpSGG0LhupG-LjowuRBH666amb-GjFuOrD8t21CjOBIvV7qDbltJgHe7A7VIOKN500DDZMVUNsoQx7cRpS8bOrhWyc0od24Ej55AQca1liDQoc5RsEsERRUD4QIyQzzeAnxGGDp8nudbZtD4oIbO4fIC6_oURfTAmeW4sJ0JGdCwlTM1vwBntx7rrDfJou5KNSmFTy61UCu0p9pZ0gWAD3iMg_Uwah4BUnXMJiKpYo"}},"AppMetadata":{}}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
const lowdb = require('lowdb');
2+
const FileSync = require('lowdb/adapters/FileSync');
3+
const adapter = new FileSync('./data/db.json');
4+
const db = lowdb(adapter);
5+
6+
class Todo {
7+
8+
id;
9+
name;
10+
owner;
11+
12+
constructor(id, name, owner) {
13+
this.id = id;
14+
this.name = name;
15+
this.owner = owner;
16+
}
17+
18+
static getAllTodos() {
19+
return db.get('todos')
20+
.value();
21+
}
22+
23+
static getTodosByOwner(owner) {
24+
return db.get('todos')
25+
.filter({ owner: owner })
26+
.value();
27+
}
28+
29+
static postTodo(newTodo) {
30+
db.get('todos').push(newTodo).write();
31+
}
32+
33+
static deleteTodo(id, owner) {
34+
db.get('todos')
35+
.remove({ owner: owner, id: id })
36+
.write();
37+
}
38+
}
39+
40+
module.exports = Todo;

4-AccessControl/1-app-roles/App/package.json

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,11 @@
1111
"license": "MIT",
1212
"dependencies": {
1313
"@azure/msal-node": "^1.1.0",
14-
"@microsoft/microsoft-graph-client": "^2.2.1",
1514
"axios": "^0.21.1",
1615
"bootstrap": "^4.5.3",
1716
"ejs": "^3.0.1",
1817
"express": "^4.17.1",
1918
"express-session": "^1.17.1",
20-
"isomorphic-fetch": "^3.0.0",
2119
"lowdb": "^1.0.0",
2220
"method-override": "^3.0.0",
2321
"msal-express-wrapper": "git+https://github.com/Azure-Samples/msal-express-wrapper.git",
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Unauthorized
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Server Error

0 commit comments

Comments
 (0)