Skip to content

Commit 512acb1

Browse files
author
Assaf Gannon
committed
updated auth0 lock version and fixed auth function
1 parent baf15a0 commit 512acb1

File tree

9 files changed

+2201
-124
lines changed

9 files changed

+2201
-124
lines changed
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
node_modules
22
.serverless
33
secrets.json
4-
/frontend/misc.md
4+
public_key
5+
/frontend/misc.md

aws-node-auth0-custom-authorizers-api/frontend/app.js

Lines changed: 64 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -8,63 +8,63 @@ const PUBLIC_ENDPOINT = 'https://your-aws-endpoint-here.amazonaws.com/dev/api/pu
88
const PRIVATE_ENDPOINT = 'https://your-aws-endpoint-here.us-east-1.amazonaws.com/dev/api/private';
99

1010
// initialize auth0 lock
11-
const lock = new Auth0Lock(AUTH0_CLIENT_ID, AUTH0_DOMAIN, {
11+
const lock = new Auth0Lock(AUTH0_CLIENT_ID, AUTH0_DOMAIN, { // eslint-disable-line no-undef
12+
1213
auth: {
1314
params: {
14-
scope: 'openid email'
15-
}
15+
scope: 'openid email',
16+
},
17+
responseType: 'token id_token',
18+
},
19+
});
20+
21+
function updateUI() {
22+
const isLoggedIn = localStorage.getItem('id_token');
23+
if (isLoggedIn) {
24+
// swap buttons
25+
document.getElementById('btn-login').style.display = 'none';
26+
document.getElementById('btn-logout').style.display = 'inline';
27+
const profile = JSON.parse(localStorage.getItem('profile'));
28+
// show username
29+
document.getElementById('nick').textContent = profile.email;
1630
}
17-
})
31+
}
1832

1933
// Handle login
20-
lock.on("authenticated", function(authResult) {
21-
console.log(authResult)
22-
lock.getProfile(authResult.idToken, function(error, profile) {
34+
lock.on('authenticated', (authResult) => {
35+
console.log(authResult);
36+
lock.getUserInfo(authResult.accessToken, (error, profile) => {
2337
if (error) {
2438
// Handle error
25-
alert(JSON.stringify(error))
26-
return false
39+
return;
2740
}
28-
// authResult.accessToken && authResult.idToken
29-
// Save the JWT token.
30-
localStorage.setItem('access_token', authResult.accessToken)
31-
localStorage.setItem('id_token', authResult.idToken)
3241

33-
// Save the profile
34-
localStorage.setItem('profile', JSON.stringify(profile))
42+
document.getElementById('nick').textContent = profile.nickname;
3543

36-
updateUI()
44+
localStorage.setItem('accessToken', authResult.accessToken);
45+
localStorage.setItem('id_token', authResult.idToken);
46+
localStorage.setItem('profile', JSON.stringify(profile));
47+
48+
updateUI();
3749
});
3850
});
3951

40-
function updateUI() {
41-
const isLoggedIn = localStorage.getItem('id_token')
42-
if (isLoggedIn) {
43-
// swap buttons
44-
document.getElementById('btn-login').style.display = 'none'
45-
document.getElementById('btn-logout').style.display = 'inline'
46-
const profile = JSON.parse(localStorage.getItem('profile'))
47-
// show username
48-
document.getElementById('nick').textContent = profile.nickname
49-
}
50-
}
51-
52-
updateUI()
52+
updateUI();
5353

5454
// Handle login
5555
document.getElementById('btn-login').addEventListener('click', () => {
56-
lock.show()
57-
})
56+
lock.show();
57+
});
5858

5959
// Handle logout
6060
document.getElementById('btn-logout').addEventListener('click', () => {
61-
localStorage.removeItem('id_token')
62-
localStorage.removeItem('access_token')
63-
localStorage.removeItem('profile')
64-
document.getElementById('btn-login').style.display = 'flex'
65-
document.getElementById('btn-logout').style.display = 'none'
66-
document.getElementById('nick').textContent = ''
67-
})
61+
localStorage.removeItem('id_token');
62+
localStorage.removeItem('access_token');
63+
localStorage.removeItem('profile');
64+
document.getElementById('btn-login').style.display = 'flex';
65+
document.getElementById('btn-logout').style.display = 'none';
66+
document.getElementById('nick').textContent = '';
67+
});
6868

6969
// Handle public api call
7070
document.getElementById('btn-public').addEventListener('click', () => {
@@ -73,40 +73,43 @@ document.getElementById('btn-public').addEventListener('click', () => {
7373
cache: 'no-store',
7474
method: 'POST',
7575
})
76-
.then(response => response.json())
77-
.then((data) => {
78-
console.log('Message:', data)
79-
document.getElementById('message').textContent = ''
80-
document.getElementById('message').textContent = data.message
81-
}).catch((e) => {
82-
console.log('error', e)
83-
})
84-
})
76+
.then(response => response.json())
77+
.then((data) => {
78+
console.log('Message:', data);
79+
document.getElementById('message').textContent = '';
80+
document.getElementById('message').textContent = data.message;
81+
})
82+
.catch((e) => {
83+
console.log('error', e);
84+
});
85+
});
8586

8687
// Handle private api call
8788
document.getElementById('btn-private').addEventListener('click', () => {
8889
// Call private API with JWT in header
89-
const token = localStorage.getItem('id_token')
90+
const token = localStorage.getItem('id_token');
9091
/*
9192
// block request from happening if no JWT token present
9293
if (!token) {
9394
document.getElementById('message').textContent = ''
94-
document.getElementById('message').textContent = 'You must login to call this protected endpoint!'
95+
document.getElementById('message').textContent =
96+
'You must login to call this protected endpoint!'
9597
return false
9698
}*/
9799
// Do request to private endpoint
98100
fetch(PRIVATE_ENDPOINT, {
99-
method: "POST",
101+
method: 'POST',
100102
headers: {
101-
Authorization: `Bearer ${token}`
102-
}
103+
Authorization: `Bearer ${token}`,
104+
},
103105
})
104-
.then(response => response.json())
105-
.then((data) => {
106-
console.log('Token:', data)
107-
document.getElementById('message').textContent = ''
108-
document.getElementById('message').textContent = data.message
109-
}).catch((e) => {
110-
console.log('error', e)
111-
})
112-
})
106+
.then(response => response.json())
107+
.then((data) => {
108+
console.log('Token:', data);
109+
document.getElementById('message').textContent = '';
110+
document.getElementById('message').textContent = data.message;
111+
})
112+
.catch((e) => {
113+
console.log('error', e);
114+
});
115+
});

aws-node-auth0-custom-authorizers-api/frontend/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<html>
33
<head>
44
<meta charset="utf-8">
5-
<script src="//cdn.auth0.com/js/lock/10.1.0/lock.min.js"></script>
5+
<script src="https://cdn.auth0.com/js/lock/11.4.0/lock.min.js"></script>
66
<meta name="viewport" content="width=device-width, initial-scale=1">
77
<link href="app.css" rel="stylesheet">
88
</head>
Lines changed: 57 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,92 +1,90 @@
1-
const jwt = require('jsonwebtoken')
1+
const jwt = require('jsonwebtoken');
22

33
// Set in `enviroment` of serverless.yml
4-
const AUTH0_CLIENT_ID = process.env.AUTH0_CLIENT_ID
5-
const AUTH0_CLIENT_SECRET = process.env.AUTH0_CLIENT_SECRET
4+
const AUTH0_CLIENT_ID = process.env.AUTH0_CLIENT_ID;
5+
const AUTH0_CLIENT_PUBLIC_KEY = process.env.AUTH0_CLIENT_PUBLIC_KEY;
66

77
// Policy helper function
88
const generatePolicy = (principalId, effect, resource) => {
9-
const authResponse = {}
10-
authResponse.principalId = principalId
9+
const authResponse = {};
10+
authResponse.principalId = principalId;
1111
if (effect && resource) {
12-
const policyDocument = {}
13-
policyDocument.Version = '2012-10-17'
14-
policyDocument.Statement = []
15-
const statementOne = {}
16-
statementOne.Action = 'execute-api:Invoke'
17-
statementOne.Effect = effect
18-
statementOne.Resource = resource
19-
policyDocument.Statement[0] = statementOne
20-
authResponse.policyDocument = policyDocument
12+
const policyDocument = {};
13+
policyDocument.Version = '2012-10-17';
14+
policyDocument.Statement = [];
15+
const statementOne = {};
16+
statementOne.Action = 'execute-api:Invoke';
17+
statementOne.Effect = effect;
18+
statementOne.Resource = resource;
19+
policyDocument.Statement[0] = statementOne;
20+
authResponse.policyDocument = policyDocument;
2121
}
22-
return authResponse
23-
}
22+
return authResponse;
23+
};
2424

2525
// Reusable Authorizer function, set on `authorizer` field in serverless.yml
2626
module.exports.auth = (event, context, callback) => {
27-
console.log('event', event)
27+
console.log('event', event);
2828
if (!event.authorizationToken) {
29-
return callback('Unauthorized')
29+
return callback('Unauthorized');
3030
}
3131

32-
const tokenParts = event.authorizationToken.split(' ')
33-
const tokenValue = tokenParts[1]
32+
const tokenParts = event.authorizationToken.split(' ');
33+
const tokenValue = tokenParts[1];
3434

3535
if (!(tokenParts[0].toLowerCase() === 'bearer' && tokenValue)) {
3636
// no auth token!
37-
return callback('Unauthorized')
37+
return callback('Unauthorized');
3838
}
3939
const options = {
4040
audience: AUTH0_CLIENT_ID,
41-
}
42-
// decode base64 secret. ref: http://bit.ly/2hA6CrO
43-
const secret = new Buffer.from(AUTH0_CLIENT_SECRET, 'base64')
41+
};
42+
4443
try {
45-
jwt.verify(tokenValue, secret, options, (verifyError, decoded) => {
44+
jwt.verify(tokenValue, AUTH0_CLIENT_PUBLIC_KEY, options, (verifyError, decoded) => {
4645
if (verifyError) {
47-
console.log('verifyError', verifyError)
46+
console.log('verifyError', verifyError);
4847
// 401 Unauthorized
49-
console.log(`Token invalid. ${verifyError}`)
50-
return callback('Unauthorized')
48+
console.log(`Token invalid. ${verifyError}`);
49+
return callback('Unauthorized');
5150
}
5251
// is custom authorizer function
53-
console.log('valid from customAuthorizer', decoded)
54-
return callback(null, generatePolicy(decoded.sub, 'Allow', event.methodArn))
55-
})
56-
} catch (err) {
57-
console.log('catch error. Invalid token', err)
58-
return callback('Unauthorized')
52+
console.log('valid from customAuthorizer', decoded);
53+
return callback(null, generatePolicy(decoded.sub, 'Allow', event.methodArn));
54+
});
55+
} catch (err) {
56+
console.log('catch error. Invalid token', err);
57+
return callback('Unauthorized');
5958
}
60-
}
59+
60+
// if for any reason you get here...
61+
return callback('Unauthorized');
62+
};
6163

6264
// Public API
63-
module.exports.publicEndpoint = (event, context, callback) => {
64-
return callback(null, {
65-
statusCode: 200,
66-
headers: {
65+
module.exports.publicEndpoint = (event, context, callback) => callback(null, {
66+
statusCode: 200,
67+
headers: {
6768
/* Required for CORS support to work */
68-
"Access-Control-Allow-Origin": "*",
69+
'Access-Control-Allow-Origin': '*',
6970
/* Required for cookies, authorization headers with HTTPS */
70-
"Access-Control-Allow-Credentials": true
71-
},
72-
body: JSON.stringify({
73-
message: 'Hi ⊂◉‿◉つ from Public API',
74-
}),
75-
})
76-
}
71+
'Access-Control-Allow-Credentials': true,
72+
},
73+
body: JSON.stringify({
74+
message: 'Hi ⊂◉‿◉つ from Public API',
75+
}),
76+
});
7777

7878
// Private API
79-
module.exports.privateEndpoint = (event, context, callback) => {
80-
return callback(null, {
81-
statusCode: 200,
82-
headers: {
79+
module.exports.privateEndpoint = (event, context, callback) => callback(null, {
80+
statusCode: 200,
81+
headers: {
8382
/* Required for CORS support to work */
84-
"Access-Control-Allow-Origin": "*",
83+
'Access-Control-Allow-Origin': '*',
8584
/* Required for cookies, authorization headers with HTTPS */
86-
"Access-Control-Allow-Credentials": true
87-
},
88-
body: JSON.stringify({
89-
message: 'Hi ⊂◉‿◉つ from Private API. Only logged in users can see this',
90-
}),
91-
})
92-
}
85+
'Access-Control-Allow-Credentials': true,
86+
},
87+
body: JSON.stringify({
88+
message: 'Hi ⊂◉‿◉つ from Private API. Only logged in users can see this',
89+
}),
90+
});

aws-node-auth0-custom-authorizers-api/package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,8 @@
55
"license": "MIT",
66
"dependencies": {
77
"jsonwebtoken": "^8.1.0"
8+
},
9+
"devDependencies": {
10+
"serverless-offline": "^3.18.0"
811
}
912
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
-----BEGIN CERTIFICATE-----
2+
PUBLIC KEY - can be found in https://manage.auth0.com -> clients -> advanced settings ->Certivifates
3+
Replace this file with public_key
4+
-----END CERTIFICATE-----

aws-node-auth0-custom-authorizers-api/serverless.yml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11

22
service: aws-custom-authorizer-auth0
33

4+
plugins:
5+
- serverless-offline
6+
47
provider:
58
name: aws
69
runtime: nodejs6.10
710
region: us-west-2
811
environment:
912
AUTH0_CLIENT_ID: ${file(./secrets.json):AUTH0_CLIENT_ID}
10-
AUTH0_CLIENT_SECRET: ${file(./secrets.json):AUTH0_CLIENT_SECRET}
13+
AUTH0_CLIENT_PUBLIC_KEY: ${file(./public_key)}
1114

1215
functions:
1316
auth:
@@ -52,4 +55,4 @@ resources:
5255
ResponseType: UNAUTHORIZED
5356
RestApiId:
5457
Ref: 'ApiGatewayRestApi'
55-
StatusCode: '401'
58+
StatusCode: '401'

0 commit comments

Comments
 (0)