Skip to content

Commit 5a2c431

Browse files
Update to open Provider Select popup as fallback
1 parent 2b7a881 commit 5a2c431

5 files changed

Lines changed: 88 additions & 74 deletions

File tree

demo/index.html

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,8 @@
1717
<h3>Solid Auth Demo Page</h3>
1818
</div>
1919
<div class="demo-section" style="width: 100%;">
20-
<p>Login Option 1: Login on the same page (in iframe), allow main window
21-
redirect.</p>
22-
<iframe id="solidLogin" src="login_iframe_inline.html" seamless style="width: 100%; border: none; margin-top: 1em;"></iframe>
20+
<p>Login, invoked by itself, will open a default Provider Select popup window.</p>
21+
<button type="button" id="login" class="btn btn-primary btn-md">Login</button>
2322
</div>
2423
<div class="demo-section">
2524
<h5>App body</h5>
@@ -60,9 +59,8 @@ <h5>App body</h5>
6059

6160
// Using a standard "document loaded" event listener
6261
// (equivalent to jQuery's $(document).ready())
63-
// Trigger a login() check on page load, in case user is logged in already
62+
// Trigger a currentUser() check on page load, in case user is logged in already
6463
document.addEventListener('DOMContentLoaded', function () {
65-
window.addEventListener('message', onMessage)
6664
init()
6765
SolidClient.currentUser()
6866
.then(function (webId) {
@@ -97,15 +95,24 @@ <h5>App body</h5>
9795
function init () {
9896
initButton('getRootAcl', getRootAcl)
9997
initButton('logoutBtn', logout)
98+
initButton('login', login)
10099
}
100+
101101
function initButton(id, action) {
102102
document.getElementById(id).addEventListener('click', action)
103103
}
104+
105+
function login () {
106+
SolidClient.login()
107+
}
108+
104109
function loginSuccess (webId) {
105110
console.log('onLoginSuccess() callback! webId: ', webId)
106111
hide('noWebId')
107112
show('logoutDiv')
108-
setField('webId', webId)
113+
if (webId) {
114+
setField('webId', webId)
115+
}
109116
show('getRootAclDiv')
110117
}
111118

demo/login_iframe_inline.html

Lines changed: 43 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -4,72 +4,59 @@
44
<meta charset="utf-8">
55
<meta http-equiv="Content-type" content="text/html;charset=utf-8">
66
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" />
7-
<script type="text/javascript">
8-
var parent, pageUrl
9-
window.addEventListener('load', function () { init() });
107

11-
function init () {
12-
parent = window.parent
13-
// console.log('Frame parent: ', parent)
14-
pageUrl = parent.window.location.href
15-
// console.log('Parent url: ', pageUrl)
16-
// console.log('Parent origin: ', parent.window.location.origin)
17-
// console.log('iFrame origin: ', window.location.origin)
18-
// var pageOrigin = opener.location.origin;
19-
// opener.postMessage(pageUrl, pageOrigin);
20-
initEvents()
21-
}
22-
function initButton(id, action) {
23-
document.getElementById(id).addEventListener('click', action)
24-
}
25-
function initEvents () {
26-
initButton('local_provider',
27-
function () { selectProvider('https://ldnode.local:8443') })
28-
initButton('db_provider',
29-
function () { selectProvider('https://databox2.com') })
30-
}
31-
function selectProvider (providerUri) {
32-
console.log('Provider selected: ', providerUri)
33-
var message = {
34-
event_type: 'providerSelected',
35-
value: providerUri
36-
}
37-
parent.postMessage(message, parent.window.location.origin)
38-
}
39-
function setField (id, value) {
40-
var field = document.getElementById(id)
41-
if (field) {
42-
field.innerHTML = value
43-
}
44-
}
45-
function hide (id) {
46-
document.getElementById(id).className = 'hidden'
47-
}
48-
function show (id) {
49-
var div = document.getElementById(id)
50-
div.className = div.className.replace('hidden', '')
51-
}
52-
</script>
538
</head>
549
<body>
5510
<div class="container">
5611
<div class="row">
57-
<div class="col-sm-2"><strong>Provider:</strong></div>
58-
<div class="col-sm-2">
59-
<button type="button" class="btn btn-xs btn-primary" id="db_provider">
60-
databox2.com
61-
</button>
12+
<div class="col-xs-12 text-center" style="margin-top: 3em;">
13+
Login with:
6214
</div>
63-
<div class="col-sm-2">
64-
<button type="button" class="btn btn-xs btn-default" id="local_provider">
65-
localhost
15+
</div>
16+
<div class="row">
17+
<div class="col-xs-12 text-center" style="padding-top: 2em;">
18+
<button type="button" class="btn btn-md btn-primary" id="dbProvider">
19+
databox2.com
6620
</button>
6721
</div>
68-
<div class="col-sm-6">
69-
or custom:
70-
<input type="text" id="custom_provider" value="" placeholder="databox.me" />
22+
</div>
23+
<div class="row">
24+
<div class="col-xs-12 text-center" style="padding-top: 2em;">
25+
or custom:<br />
26+
<input type="text" id="customProviderUri" value="https://" placeholder="databox.me" />
27+
<button type="button" class="btn btn-md" id="customProvider">Go</button>
7128
</div>
7229
</div>
7330
</div>
31+
<script type="text/javascript">
32+
window.addEventListener('load', function () { init() });
33+
34+
function init () {
35+
initEvents()
36+
}
37+
function initButton(id, action) {
38+
document.getElementById(id).addEventListener('click', action)
39+
}
40+
function initEvents () {
41+
initButton('dbProvider',
42+
function () { selectProvider('https://databox2.com') })
43+
initButton('customProvider',
44+
function () {
45+
var defaultValue = 'https://'
46+
var customUri = document.getElementById('customProviderUri')
47+
if (customUri && customUri.value !== defaultValue) {
48+
selectProvider(customUri.value)
49+
}
50+
})
51+
}
52+
function selectProvider (providerUri) {
53+
console.log('Provider selected: ', providerUri)
54+
var message = {
55+
event_type: 'providerSelected',
56+
value: providerUri
57+
}
58+
opener.postMessage(message, opener.window.location.origin)
59+
}
60+
</script>
7461
</body>
7562
</html>

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
],
1313
"scripts": {
1414
"build": "npm run build-lib",
15-
"build-dist": "webpack --progress --colors --optimize-occurrence-order --optimize-dedupe",
15+
"build-dist": "webpack --progress --colors --optimize-occurrence-order --optimize-dedupe --optimize-minimize",
1616
"build-lib": "babel src -d lib",
1717
"dist": "npm run build && npm run build-dist",
1818
"karma": "./node_modules/.bin/karma start",

src/index.js

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,9 @@ class ClientAuthOIDC {
6565
return window.location.href
6666
}
6767

68+
/**
69+
* @return {Promise<string>} Resolves to current user's WebID URI
70+
*/
6871
currentUser () {
6972
if (this.webId) {
7073
return Promise.resolve(this.webId)
@@ -177,13 +180,19 @@ class ClientAuthOIDC {
177180
login (providerUri) {
178181
this.clearCurrentUser()
179182
let selectProvider = this.selectProvider.bind(this)
180-
let loadOrRegisterClient = this.loadOrRegisterClient.bind(this)
181-
let validateOrSendAuthRequest = this.validateOrSendAuthRequest.bind(this)
182183

183184
return Promise.resolve(providerUri)
184185
.then(selectProvider)
185-
.then(loadOrRegisterClient)
186-
.then(validateOrSendAuthRequest)
186+
.then(selectedProviderUri => {
187+
if (selectedProviderUri) {
188+
return this.loadOrRegisterClient(selectedProviderUri)
189+
}
190+
})
191+
.then(client => {
192+
if (client) {
193+
return this.validateOrSendAuthRequest(client)
194+
}
195+
})
187196
}
188197

189198
clearCurrentUser () {
@@ -247,9 +256,16 @@ class ClientAuthOIDC {
247256
}
248257

249258
providerFromUI () {
250-
console.log('No state param, getting provider from UI')
251-
this.initEventListeners(window)
252-
// Get the provider from the UI somehow
259+
console.log('Getting provider from default popup UI')
260+
this.initEventListeners(this.window)
261+
262+
if (!this.selectProviderWindow) {
263+
this.selectProviderWindow = this.window.open('login_iframe_inline.html',
264+
'selectProviderWindow', 'menubar=no,resizable=yes,width=300,height=300')
265+
}
266+
if (this.selectProviderWindow) {
267+
this.selectProviderWindow.focus()
268+
}
253269
}
254270

255271
/**
@@ -268,7 +284,8 @@ class ClientAuthOIDC {
268284
* @param uri {string}
269285
*/
270286
redirectTo (uri) {
271-
this.window.location = uri
287+
this.window.location.href = uri
288+
return false
272289
}
273290

274291
/**
@@ -288,7 +305,7 @@ class ClientAuthOIDC {
288305
}
289306
this.saveProviderByState(state, providerUri)
290307
if (this.method === REDIRECT) {
291-
this.redirectTo(authUri)
308+
return this.redirectTo(authUri)
292309
}
293310
})
294311
}
@@ -407,7 +424,10 @@ class ClientAuthOIDC {
407424
if (!event || !event.data) { return }
408425
switch (event.data.event_type) {
409426
case 'providerSelected':
410-
console.log('Provider selected: ', event.data.value)
427+
let providerUri = event.data.value
428+
console.log('Provider selected: ', providerUri)
429+
this.login(providerUri)
430+
this.selectProviderWindow.close()
411431
break
412432
default:
413433
console.error('onMessage - unknown event type: ', event)

test/unit/auth-test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,7 @@ describe('SolidAuthOIDC', () => {
334334
// ensure providerUri was saved
335335
expect(auth.loadProvider(state)).to.equal(providerUri)
336336
// ensure the redirect happened
337-
expect(auth.window.location).to.equal(authUri)
337+
expect(auth.currentLocation()).to.equal(authUri)
338338
done()
339339
})
340340
.catch(err => { console.error(err.message) })

0 commit comments

Comments
 (0)