Skip to content

Commit c22d828

Browse files
session state calculation
1 parent 8106062 commit c22d828

File tree

8 files changed

+102
-17
lines changed

8 files changed

+102
-17
lines changed

.bowerrc

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"directory": "public/vendor"
3+
}

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
config
22
hooks
33
node_modules
4+
public/vendor
45
*.swp

bower.json

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
{
2+
"name": "anvil-connect",
3+
"version": "0.1.28",
4+
"homepage": "https://github.com/christiansmith/anvil-connect",
5+
"authors": [
6+
"Christian Smith <smith@anvil.io>"
7+
],
8+
"license": "MIT",
9+
"private": true,
10+
"ignore": [
11+
"**/.*",
12+
"node_modules",
13+
"bower_components",
14+
"test",
15+
"tests"
16+
],
17+
"dependencies": {
18+
"bcryptjs": "~2.1.0"
19+
}
20+
}

oidc/authorize.js

+9
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ var crypto = require('crypto')
1010
, AccessToken = require('../models/AccessToken')
1111
, AuthorizationCode = require('../models/AuthorizationCode')
1212
, nowSeconds = require('../lib/time-utils').nowSeconds
13+
, sessionState = require('../oidc/sessionState')
1314
;
1415

1516

@@ -110,6 +111,14 @@ function authorize (req, res, next) {
110111
response.state = params.state;
111112
}
112113

114+
// if responseTypes includes id_token or token
115+
// calculate session_state and add to response
116+
if (responseTypes.indexOf('id_token') !== -1
117+
|| responseTypes.indexOf('token') !== -1) {
118+
var session= sessionState(req.client, req.client.client_uri, 'authenticated');
119+
response.session_state = session;
120+
}
121+
113122
res.redirect(
114123
params.redirect_uri + responseMode + qs.stringify(response)
115124
);

oidc/index.js

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ var oidc = {
2222
promptToAuthorize: require('./promptToAuthorize'),
2323
requireSignin: require('./requireSignin'),
2424
selectConnectParams: require('./selectConnectParams'),
25+
sessionState: require('./sessionState'),
2526
stashParams: require('./stashParams'),
2627
token: require('./token'),
2728
unstashParams: require('./unstashParams'),

oidc/sessionState.js

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/**
2+
* Module dependencies
3+
*/
4+
5+
var bcrypt = require('bcrypt');
6+
7+
8+
/**
9+
* Session State
10+
*/
11+
12+
function sessionState (client, origin, state) {
13+
var salt = bcrypt.genSaltSync(10);
14+
var value = [client._id, client.client_uri, state, salt].join(' ');
15+
var hash = bcrypt.hashSync(value, salt);
16+
return [hash, salt].join(' ');
17+
}
18+
19+
20+
/**
21+
* Exports
22+
*/
23+
24+
module.exports = sessionState;

public/javascript/session.js

+43-17
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,57 @@
1-
window.addEventListener("message", receiveMessage, false);
1+
/**
2+
* bcrypt
3+
*/
4+
5+
var bcrypt = dcodeIO.bcrypt;
6+
7+
8+
/**
9+
* Handle RP Message
10+
*/
211

3-
function receiveMessage(e){ // e has client_id and session_state
12+
function receiveMessage (e) {
413

514
// Validate message origin
6-
client_id = e.data.split(' ')[0];
7-
session_state = e.data.split(' ')[1];
8-
var salt = session_state.split('.')[1];
15+
var origin = e.origin;
16+
var parser = document.createElement('a');
17+
parser.href = document.referrer;
18+
messenger = parser.protocol + '//' + parser.host;
19+
if (origin !== messenger) {
20+
return; // Ignore the message
21+
}
22+
23+
// Validate message syntax
24+
var parts = e.data.split(' ');
25+
var client_id = parts[0];
26+
var session_state = parts[1];
27+
var salt = parts[2];
928

10-
// if message syntactically invalid
11-
// postMessage('error', e.origin) and return
29+
if (parts.length !== 3) {
30+
e.source.postMessage('error', origin);
31+
}
1232

1333
// get_op_browser_state() is an OP defined function
1434
// that returns the browser's login status at the OP.
1535
// How it is done is entirely up to the OP.
16-
var opbs = get_op_browser_state();
36+
//var opbs = get_op_browser_state();
37+
var opbs = 'authenticated';
1738

1839
// Here, the session_state is calculated in this particular way,
1940
// but it is entirely up to the OP how to do it under the
2041
// requirements defined in this specification.
21-
var ss = CryptoJS.SHA256(client_id + ' ' + e.origin + ' ' +
22-
opbs + [' ' + salt]) [+ "." + salt];
42+
//var ss = CryptoJS.SHA256(client_id + ' ' + e.origin + ' ' +
43+
// opbs + [' ' + salt]) [+ "." + salt];
44+
var value = [client_id, origin, opbs, salt].join(' ')
45+
var hash = bcrypt.hashSync(value, salt);
2346

24-
if (e.session_state == ss) {
25-
stat = 'unchanged';
26-
} else {
27-
stat = 'changed';
28-
}
29-
30-
e.source.postMessage(stat, e.origin);
47+
e.source.postMessage(
48+
(hash === session_state) ? 'unchanged' : 'changed' , origin
49+
);
3150
};
51+
52+
53+
/**
54+
* Register Listener
55+
*/
56+
57+
window.addEventListener("message", receiveMessage, false);

views/session.jade

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ html(lang="en")
33
title
44
| Session
55

6+
script(src="/vendor/bcryptjs/dist/bcrypt.js")
67
script(src="/javascript/session.js")
78
body
89
h1 Session

0 commit comments

Comments
 (0)