Skip to content

Commit ba11592

Browse files
committed
Consent screen structure - everything except rdf
1 parent c89f6cb commit ba11592

File tree

5 files changed

+81
-25
lines changed

5 files changed

+81
-25
lines changed

default-views/auth/consent.hbs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,32 @@
1414
<h1>Authorize this app to use your data?</h1>
1515
<p>You will be authorizing <strong>{{app_origin}}</strong> to have access perform the actions indicated below.</p>
1616
<p>NOTE: This screen is TEMPORARY. Eventually more fine-tuned controls will be available.</p>
17+
<p>For more information see the <a href="https://github.com/solid/node-solid-server/blob/master/docs/login-and-grant-access-to-application.md" target="_blank">full explanation</a>.</p>
1718
</div>
1819

1920
<form method="post" action="/consent">
2021

21-
<input type="checkbox" name="read" value="access_mode" checked> Read your data<br>
22-
<input type="checkbox" name="write" value="access_mode" checked> Write new data<br>
23-
<input type="checkbox" name="append" value="access_mode" checked> Add to existing data<br>
24-
<input type="checkbox" name="control" value="access_mode"> Control who can access your data<br>
22+
<input id="read" type="checkbox" name="access_mode" value="read" checked>
23+
<label for="read">Read your data</label>
24+
<br>
25+
26+
<input id="write" type="checkbox" name="access_mode" value="write" checked>
27+
<label for="write">Write new data</label>
28+
<br>
29+
30+
<input id="append" type="checkbox" name="access_mode" value="append" checked>
31+
<label for="append">Add to existing data</label>
32+
<br>
33+
34+
<input id="control" type="checkbox" name="access_mode" value="control">
35+
<label for="control">Control who can access your data</label>
36+
<br>
37+
<br>
2538

2639
<button type="submit" class="btn btn-primary" name="consent" value="true">Authorize</button>
2740
<button type="submit" class="btn btn-default" name="cancel" value="true">Cancel</button>
2841
{{> auth/auth-hidden-fields}}
42+
<input type="hidden" name="web_id" id="web_id" value="{{web_id}}" />
2943
</form>
3044
</div>
3145
</body>

lib/api/authn/webid-oidc.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ function middleware (oidc) {
8585
router.post('/login/tls', bodyParser, LoginRequest.loginTls)
8686

8787
router.get('/consent', ConsentRequest.get)
88-
router.post('/consent', ConsentRequest.giveConsent)
88+
router.post('/consent', bodyParser, ConsentRequest.giveConsent)
8989

9090
router.get('/account/password/reset', restrictToTopDomain, PasswordResetEmailRequest.get)
9191
router.post('/account/password/reset', restrictToTopDomain, bodyParser, PasswordResetEmailRequest.post)

lib/requests/auth-request.js

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
const url = require('url')
44
const debug = require('./../debug').authentication
5+
const IDToken = require('@solid/oidc-op/src/IDToken')
56

67
/**
78
* Hidden form fields from the login page that must be passed through to the
@@ -10,7 +11,7 @@ const debug = require('./../debug').authentication
1011
* @type {Array<string>}
1112
*/
1213
const AUTH_QUERY_PARAMS = ['response_type', 'display', 'scope',
13-
'client_id', 'redirect_uri', 'state', 'nonce', 'request']
14+
'client_id', 'redirect_uri', 'state', 'nonce', 'request', 'web_id']
1415

1516
/**
1617
* Base authentication request (used for login and password reset workflows).
@@ -134,6 +135,11 @@ class AuthRequest {
134135
extracted[p] = value
135136
}
136137

138+
// Special case because solid-auth-client does not include redirect in params
139+
if (!extracted['redirect_uri'] && params.request) {
140+
extracted['redirect_uri'] = IDToken.decode(params.request).payload.redirect_uri
141+
}
142+
137143
return extracted
138144
}
139145

@@ -211,11 +217,14 @@ class AuthRequest {
211217
return url.format(signupUrl)
212218
}
213219

214-
consentUrl () {
220+
consentUrl (validUser) {
215221
let host = this.accountManager.host
216222
let consentUrl = url.parse(url.resolve(host.serverUri, '/consent'))
217223

218-
consentUrl.query = this.authQueryParams
224+
consentUrl.query = {
225+
...this.authQueryParams,
226+
web_id: validUser.webId
227+
}
219228

220229
return url.format(consentUrl)
221230
}

lib/requests/consent-request.js

Lines changed: 49 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ const debug = require('./../debug').authentication
44

55
const AuthRequest = require('./auth-request')
66

7+
const url = require('url')
8+
79
/**
810
* Models a local Login request
911
*/
@@ -57,10 +59,18 @@ class ConsentRequest extends AuthRequest {
5759
* @param req {IncomingRequest}
5860
* @param res {ServerResponse}
5961
*/
60-
static get (req, res) {
62+
static async get (req, res) {
6163
const request = ConsentRequest.fromParams(req, res)
62-
63-
request.renderForm(null, req)
64+
const appOrigin = request.getAppOrigin()
65+
// Check if is already registered or is data browser
66+
if (
67+
appOrigin === req.app.locals.ldp.serverUri ||
68+
await request.isAppRegistered(appOrigin, request.authQueryParams.web_id)
69+
) {
70+
request.redirectPostConsent()
71+
} else {
72+
request.renderForm(null, req)
73+
}
6474
}
6575

6676
/**
@@ -72,19 +82,43 @@ class ConsentRequest extends AuthRequest {
7282
*
7383
* @return {Promise}
7484
*/
75-
static giveConsent (req, res) {
85+
static async giveConsent (req, res) {
86+
let accessModes = []
87+
let consented = false
88+
if (req.body) {
89+
accessModes = req.body.access_mode
90+
consented = req.body.consent
91+
}
92+
7693
let request = ConsentRequest.fromParams(req, res)
77-
console.log(request.authQueryParams)
78-
// debug('Providing consent for app sharing')
79-
// return request.authenticator.findValidUser()
94+
const appOrigin = request.getAppOrigin()
95+
debug('Providing consent for app sharing')
8096

81-
// .then(validUser => {
82-
// request.initUserSession(validUser)
97+
if (consented) {
98+
await request.registerApp(appOrigin, accessModes, request.authQueryParams.web_id)
99+
}
83100

84-
// request.redirectPostLogin(validUser)
85-
// })
101+
// Redirect once that's all done
102+
return request.authenticator.findValidUser()
103+
.then(validUser => {
104+
request.initUserSession(validUser)
105+
request.redirectPostConsent(validUser)
106+
})
107+
108+
.catch(error => request.error(error))
109+
}
110+
111+
getAppOrigin () {
112+
const parsed = url.parse(this.authQueryParams.redirect_uri)
113+
return `${parsed.protocol}//${parsed.host}`
114+
}
115+
116+
async isAppRegistered (appOrigin, webId) {
117+
return false
118+
}
86119

87-
// .catch(error => request.error(error))
120+
async registerApp (appOrigin, accessModes, webId) {
121+
return
88122
}
89123

90124
/**
@@ -96,15 +130,15 @@ class ConsentRequest extends AuthRequest {
96130
*
97131
* @return {string}
98132
*/
99-
postConsentUrl (validUser) {
133+
postConsentUrl () {
100134
return this.authorizeUrl()
101135
}
102136

103137
/**
104138
* Redirects the Login request to continue on the OIDC auth workflow.
105139
*/
106-
redirectPostLogin (validUser) {
107-
let uri = this.postLoginUrl(validUser)
140+
redirectPostConsent () {
141+
let uri = this.postConsentUrl()
108142
debug('Login successful, redirecting to ', uri)
109143
this.response.redirect(uri)
110144
}

lib/requests/login-request.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ class LoginRequest extends AuthRequest {
159159
postLoginUrl (validUser) {
160160
// Login request is part of an app's auth flow
161161
if (/token|code/.test(this.authQueryParams['response_type'])) {
162-
return this.consentUrl()
162+
return this.consentUrl(validUser)
163163
// Login request is a user going to /login in browser
164164
} else if (validUser) {
165165
return this.authQueryParams['redirect_uri'] || validUser.accountUri
@@ -193,7 +193,6 @@ class LoginRequest extends AuthRequest {
193193
params.error = error.message
194194
this.response.status(error.statusCode)
195195
}
196-
197196
this.response.render('auth/login', params)
198197
}
199198
}

0 commit comments

Comments
 (0)