Skip to content

Commit 7a265d1

Browse files
committed
fix fragment callback parsing, parse other possible tokens
- fix parsing response_mode=fragment responses where the token is the first parameter - parse id_token and access_token in addition to value and token
1 parent e2a9ae9 commit 7a265d1

File tree

2 files changed

+29
-10
lines changed

2 files changed

+29
-10
lines changed

src/utils.js

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { KEYUTIL } from 'jsrsasign';
22
import log from 'loglevel';
33
import clipboard from 'clipboard-polyfill';
4+
import { isToken } from './editor/jwt.js';
45

56
export function httpGet(url, cache = true) {
67
return new Promise((resolve, reject) => {
@@ -117,6 +118,25 @@ export function copyTokenLink(token, publicKeyOptional) {
117118
return url;
118119
}
119120

121+
function regexp(body, flag) {
122+
return new RegExp("[?&#]" + body + "(?:=([^&#]*)|&|#|$)", flag);
123+
}
124+
125+
const tokenRegexp = regexp('((?:id_|access_)?token)', 'g');
126+
127+
export function getTokensFromLocation() {
128+
const { href } = window.location;
129+
let name, value;
130+
const val = {};
131+
132+
try {
133+
while ([, name, value] = tokenRegexp.exec(href)) {
134+
if(isToken(value)) val[name] = value;
135+
}
136+
} catch (err) {}
137+
return val;
138+
}
139+
120140
// https://stackoverflow.com/questions/901115/how-can-i-get-query-string-values-in-javascript
121141
export function getParameterByName(name, url) {
122142
if(!url) {
@@ -125,16 +145,16 @@ export function getParameterByName(name, url) {
125145

126146
name = name.replace(/[\[\]]/g, "\\$&");
127147

128-
const regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)");
148+
const regex = regexp(name);
129149
const results = regex.exec(url);
130150
if(!results) {
131151
return null;
132152
}
133-
if(!results[2]) {
153+
if(!results[1]) {
134154
return '';
135155
}
136156

137-
return decodeURIComponent(results[2].replace(/\+/g, " "));
157+
return decodeURIComponent(results[1].replace(/\+/g, " "));
138158
}
139159

140160
export function isWideScreen() {

src/website/index.js

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { setupTokenEditor, setTokenEditorValue } from '../editor';
55
import { setupJwtCounter } from './counter.js';
66
import { setupSmoothScrolling } from './smooth-scrolling.js';
77
import { setupHighlighting } from './highlighting.js';
8-
import { getParameterByName } from '../utils.js';
8+
import { getParameterByName, getTokensFromLocation } from '../utils.js';
99
import { isChrome, isFirefox } from './utils.js';
1010
import { setupShareJwtButton } from '../share-button.js';
1111
import {
@@ -24,18 +24,17 @@ function parseLocationQuery() {
2424
const publicKey = getParameterByName('publicKey');
2525
const value = getParameterByName('value');
2626
const token = getParameterByName('token');
27+
const { id_token, access_token } = getTokensFromLocation();
2728

2829
let scroll = false;
2930
if(publicKey) {
3031
publicKeyTextArea.value = publicKey;
3132
scroll = true;
3233
}
33-
if(value) {
34-
setTokenEditorValue(value);
35-
scroll = true;
36-
}
37-
if(token) {
38-
setTokenEditorValue(token);
34+
35+
const val = value || token || id_token || access_token;
36+
if(val) {
37+
setTokenEditorValue(val);
3938
scroll = true;
4039
}
4140

0 commit comments

Comments
 (0)