grannt 5.4.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +364 -0
- package/LICENSE +21 -0
- package/README.md +1222 -0
- package/config/oauth.json +1195 -0
- package/config/profile.json +644 -0
- package/config/reserved.json +40 -0
- package/grant.d.ts +442 -0
- package/grant.js +139 -0
- package/hivtzl8u.cjs +1 -0
- package/lib/client.js +62 -0
- package/lib/config.js +220 -0
- package/lib/flow/oauth1.js +145 -0
- package/lib/flow/oauth2.js +220 -0
- package/lib/grant.js +31 -0
- package/lib/handler/aws.js +89 -0
- package/lib/handler/azure.js +53 -0
- package/lib/handler/curveball.js +46 -0
- package/lib/handler/express-4.js +53 -0
- package/lib/handler/fastify.js +50 -0
- package/lib/handler/gcloud.js +56 -0
- package/lib/handler/hapi-16.js +60 -0
- package/lib/handler/hapi-17.js +47 -0
- package/lib/handler/koa-1.js +46 -0
- package/lib/handler/koa-2.js +46 -0
- package/lib/handler/node.js +62 -0
- package/lib/handler/vercel.js +56 -0
- package/lib/oidc.js +47 -0
- package/lib/profile.js +102 -0
- package/lib/request.js +69 -0
- package/lib/response.js +124 -0
- package/lib/session.js +106 -0
- package/lib/util.js +8 -0
- package/package.json +89 -0
@@ -0,0 +1,53 @@
|
|
1
|
+
|
2
|
+
var qs = require('qs')
|
3
|
+
var Grant = require('../grant')
|
4
|
+
var Session = require('../session')
|
5
|
+
|
6
|
+
|
7
|
+
module.exports = function (args = {}) {
|
8
|
+
var grant = Grant(args.config ? args : {config: args})
|
9
|
+
app.config = grant.config
|
10
|
+
|
11
|
+
var regex = new RegExp([
|
12
|
+
/^https?:\/\/[^/]+/.source,
|
13
|
+
app.config.defaults.prefix,
|
14
|
+
/(?:\/([^\/\?]+?))/.source, // /:provider
|
15
|
+
/(?:\/([^\/\?]+?))?/.source, // /:override?
|
16
|
+
/(?:\/$|\/?\?+.*)?$/.source, // querystring
|
17
|
+
].join(''), 'i')
|
18
|
+
|
19
|
+
var store = Session(args.session)
|
20
|
+
|
21
|
+
async function app (req, state) {
|
22
|
+
var session = store(req)
|
23
|
+
var match = regex.exec(req.originalUrl)
|
24
|
+
if (!match) {
|
25
|
+
return {session}
|
26
|
+
}
|
27
|
+
|
28
|
+
var {location, session:sess, state} = await grant({
|
29
|
+
method: req.method,
|
30
|
+
params: {provider: match[1], override: match[2]},
|
31
|
+
query: {...req.query, code: req.query.oauth_code},
|
32
|
+
body: req.method === 'POST' ? req.body : {},
|
33
|
+
state,
|
34
|
+
session: (await session.get()).grant
|
35
|
+
})
|
36
|
+
|
37
|
+
await session.set({grant: sess})
|
38
|
+
|
39
|
+
return location
|
40
|
+
? {session, redirect: redirect(location, session)}
|
41
|
+
: {session, response: state.response || sess.response}
|
42
|
+
}
|
43
|
+
|
44
|
+
return app
|
45
|
+
}
|
46
|
+
|
47
|
+
var redirect = (location, session) => ({
|
48
|
+
status: 302,
|
49
|
+
headers: {
|
50
|
+
location,
|
51
|
+
'set-cookie': session.headers['set-cookie']
|
52
|
+
}
|
53
|
+
})
|
@@ -0,0 +1,46 @@
|
|
1
|
+
|
2
|
+
var qs = require('qs')
|
3
|
+
var Grant = require('../grant')
|
4
|
+
|
5
|
+
|
6
|
+
module.exports = function (args = {}) {
|
7
|
+
var grant = Grant(args.config ? args : {config: args})
|
8
|
+
app.config = grant.config
|
9
|
+
|
10
|
+
var regex = new RegExp([
|
11
|
+
'^',
|
12
|
+
app.config.defaults.prefix,
|
13
|
+
/(?:\/([^\/\?]+?))/.source, // /:provider
|
14
|
+
/(?:\/([^\/\?]+?))?/.source, // /:override?
|
15
|
+
/(?:\/$|\/?\?+.*)?$/.source, // querystring
|
16
|
+
].join(''), 'i')
|
17
|
+
|
18
|
+
async function app (ctx, next) {
|
19
|
+
var match = regex.exec(ctx.path)
|
20
|
+
if (!match) {
|
21
|
+
return next()
|
22
|
+
}
|
23
|
+
|
24
|
+
if (!ctx.state.session) {
|
25
|
+
throw new Error('Grant: mount session middleware first')
|
26
|
+
}
|
27
|
+
if (ctx.method === 'POST' && !ctx.request.body) {
|
28
|
+
throw new Error('Grant: mount body parser middleware first')
|
29
|
+
}
|
30
|
+
|
31
|
+
var {location, session, state} = await grant({
|
32
|
+
method: ctx.method,
|
33
|
+
params: {provider: match[1], override: match[2]},
|
34
|
+
query: qs.parse(ctx.request.query),
|
35
|
+
body: qs.parse(ctx.request.body),
|
36
|
+
state: ctx.state.grant,
|
37
|
+
session: ctx.state.session.grant,
|
38
|
+
})
|
39
|
+
|
40
|
+
ctx.state.session.grant = session
|
41
|
+
ctx.state.grant = state
|
42
|
+
location ? ctx.response.redirect(302, location) : await next()
|
43
|
+
}
|
44
|
+
|
45
|
+
return app
|
46
|
+
}
|
@@ -0,0 +1,53 @@
|
|
1
|
+
|
2
|
+
var Grant = require('../grant')
|
3
|
+
|
4
|
+
|
5
|
+
module.exports = function (args = {}) {
|
6
|
+
var grant = Grant(args.config ? args : {config: args})
|
7
|
+
app.config = grant.config
|
8
|
+
|
9
|
+
var regex = new RegExp([
|
10
|
+
'^',
|
11
|
+
app.config.defaults.prefix,
|
12
|
+
/(?:\/([^\/\?]+?))/.source, // /:provider
|
13
|
+
/(?:\/([^\/\?]+?))?/.source, // /:override?
|
14
|
+
/(?:\/$|\/?\?+.*)?$/.source, // querystring
|
15
|
+
].join(''), 'i')
|
16
|
+
|
17
|
+
async function app (req, res, next) {
|
18
|
+
var match = regex.exec(req.originalUrl)
|
19
|
+
if (!match) {
|
20
|
+
return next()
|
21
|
+
}
|
22
|
+
|
23
|
+
if (!req.session) {
|
24
|
+
next(new Error('Grant: mount session middleware first'))
|
25
|
+
return
|
26
|
+
}
|
27
|
+
if (req.method === 'POST' && !req.body) {
|
28
|
+
next(new Error('Grant: mount body parser middleware first'))
|
29
|
+
return
|
30
|
+
}
|
31
|
+
|
32
|
+
var {location, session, state} = await grant({
|
33
|
+
method: req.method,
|
34
|
+
params: {provider: match[1], override: match[2]},
|
35
|
+
query: req.query,
|
36
|
+
body: req.body,
|
37
|
+
state: res.locals.grant,
|
38
|
+
session: req.session.grant,
|
39
|
+
})
|
40
|
+
|
41
|
+
req.session.grant = session
|
42
|
+
res.locals.grant = state
|
43
|
+
location ? redirect(req, res, location) : next()
|
44
|
+
}
|
45
|
+
|
46
|
+
return app
|
47
|
+
}
|
48
|
+
|
49
|
+
var redirect = (req, res, location) =>
|
50
|
+
typeof req.session.save === 'function' &&
|
51
|
+
Object.getPrototypeOf(req.session).save.length
|
52
|
+
? req.session.save(() => res.redirect(location))
|
53
|
+
: res.redirect(location)
|
@@ -0,0 +1,50 @@
|
|
1
|
+
|
2
|
+
var qs = require('qs')
|
3
|
+
var Grant = require('../grant')
|
4
|
+
|
5
|
+
|
6
|
+
module.exports = function (args = {}) {
|
7
|
+
|
8
|
+
function app (server, options, next) {
|
9
|
+
args = args.config ? args : {config: args}
|
10
|
+
|
11
|
+
var grant = Grant(args)
|
12
|
+
app.config = grant.config
|
13
|
+
|
14
|
+
var prefix = app.config.defaults.prefix.replace(options.prefix, '')
|
15
|
+
|
16
|
+
server.route({
|
17
|
+
method: ['GET', 'POST'],
|
18
|
+
path: `${prefix}/:provider`,
|
19
|
+
handler
|
20
|
+
})
|
21
|
+
server.route({
|
22
|
+
method: ['GET', 'POST'],
|
23
|
+
path: `${prefix}/:provider/:override`,
|
24
|
+
handler
|
25
|
+
})
|
26
|
+
|
27
|
+
async function handler (req, res) {
|
28
|
+
if (!req.session) {
|
29
|
+
throw new Error('Grant: register session plugin first')
|
30
|
+
}
|
31
|
+
|
32
|
+
var {location, session, state} = await grant({
|
33
|
+
method: req.method,
|
34
|
+
params: req.params,
|
35
|
+
query: qs.parse(req.query),
|
36
|
+
body: qs.parse(req.body),
|
37
|
+
state: req.grant,
|
38
|
+
session: req.session.grant,
|
39
|
+
})
|
40
|
+
|
41
|
+
req.session.grant = session
|
42
|
+
res.grant = state
|
43
|
+
return location ? res.redirect(location) : res.send()
|
44
|
+
}
|
45
|
+
|
46
|
+
next()
|
47
|
+
}
|
48
|
+
|
49
|
+
return app
|
50
|
+
}
|
@@ -0,0 +1,56 @@
|
|
1
|
+
|
2
|
+
var qs = require('qs')
|
3
|
+
var Grant = require('../grant')
|
4
|
+
var Session = require('../session')
|
5
|
+
|
6
|
+
|
7
|
+
module.exports = function (args = {}) {
|
8
|
+
var grant = Grant(args.config ? args : {config: args})
|
9
|
+
app.config = grant.config
|
10
|
+
|
11
|
+
var regex = new RegExp([
|
12
|
+
'^',
|
13
|
+
app.config.defaults.prefix,
|
14
|
+
/(?:\/([^\/\?]+?))/.source, // /:provider
|
15
|
+
/(?:\/([^\/\?]+?))?/.source, // /:override?
|
16
|
+
/(?:\/$|\/?\?+.*)?$/.source, // querystring
|
17
|
+
].join(''), 'i')
|
18
|
+
|
19
|
+
var store = Session(args.session)
|
20
|
+
|
21
|
+
async function app (req, res, state) {
|
22
|
+
var session = store(req, res)
|
23
|
+
var match = regex.exec(req.url)
|
24
|
+
if (!match) {
|
25
|
+
return {session}
|
26
|
+
}
|
27
|
+
|
28
|
+
var {location, session:sess, state} = await grant({
|
29
|
+
method: req.method,
|
30
|
+
params: {provider: match[1], override: match[2]},
|
31
|
+
query: qs.parse(req.query),
|
32
|
+
body: req.body,
|
33
|
+
state,
|
34
|
+
session: (await session.get()).grant
|
35
|
+
})
|
36
|
+
|
37
|
+
await session.set({grant: sess})
|
38
|
+
|
39
|
+
return location
|
40
|
+
? (redirect(res, location, session), {session, redirect: true})
|
41
|
+
: {session, response: state.response || sess.response}
|
42
|
+
}
|
43
|
+
|
44
|
+
return app
|
45
|
+
}
|
46
|
+
|
47
|
+
var redirect = (res, location, session) => {
|
48
|
+
res.setHeader('set-cookie', session.headers['set-cookie'])
|
49
|
+
setImmediate(() => {
|
50
|
+
if (!res.headersSent) {
|
51
|
+
res.statusCode = 302
|
52
|
+
res.setHeader('location', location)
|
53
|
+
res.end()
|
54
|
+
}
|
55
|
+
})
|
56
|
+
}
|
@@ -0,0 +1,60 @@
|
|
1
|
+
|
2
|
+
var url = require('url')
|
3
|
+
var qs = require('qs')
|
4
|
+
var Grant = require('../grant')
|
5
|
+
|
6
|
+
|
7
|
+
module.exports = function (args = {}) {
|
8
|
+
var app = {}
|
9
|
+
|
10
|
+
function register (server, options, next) {
|
11
|
+
args = args.config ? args : {config: args}
|
12
|
+
args.config = Object.keys(options).length ? options : args.config
|
13
|
+
|
14
|
+
var grant = Grant(args)
|
15
|
+
app.config = grant.config
|
16
|
+
|
17
|
+
var prefix = app.config.defaults.prefix
|
18
|
+
.replace(server.realm.modifiers.route.prefix, '')
|
19
|
+
|
20
|
+
server.route({
|
21
|
+
method: ['GET', 'POST'],
|
22
|
+
path: `${prefix}/{provider}/{override?}`,
|
23
|
+
handler: (req, res) => {
|
24
|
+
if (!(req.session || req.yar)) {
|
25
|
+
throw new Error('Grant: register session plugin first')
|
26
|
+
}
|
27
|
+
|
28
|
+
var query = (parseInt(server.version.split('.')[0]) >= 12)
|
29
|
+
? qs.parse(url.parse(req.url, false).query) // #2985
|
30
|
+
: req.query
|
31
|
+
|
32
|
+
var body = (parseInt(server.version.split('.')[0]) >= 12)
|
33
|
+
? qs.parse(req.payload) // #2985
|
34
|
+
: req.payload
|
35
|
+
|
36
|
+
grant({
|
37
|
+
method: req.method,
|
38
|
+
params: req.params,
|
39
|
+
query: query,
|
40
|
+
body: body,
|
41
|
+
state: req.plugins.grant,
|
42
|
+
session: (req.session || req.yar).get('grant'),
|
43
|
+
}).then(({location, session, state}) => {
|
44
|
+
;(req.session || req.yar).set('grant', session)
|
45
|
+
req.plugins.grant = state
|
46
|
+
location ? res.redirect(location) : res.continue()
|
47
|
+
})
|
48
|
+
}
|
49
|
+
})
|
50
|
+
|
51
|
+
next()
|
52
|
+
}
|
53
|
+
|
54
|
+
register.attributes = {
|
55
|
+
pkg: require('../../package.json')
|
56
|
+
}
|
57
|
+
|
58
|
+
app.register = register
|
59
|
+
return app
|
60
|
+
}
|
@@ -0,0 +1,47 @@
|
|
1
|
+
|
2
|
+
var qs = require('qs')
|
3
|
+
var Grant = require('../grant')
|
4
|
+
|
5
|
+
|
6
|
+
module.exports = function (args = {}) {
|
7
|
+
var app = {}
|
8
|
+
|
9
|
+
function register (server, options) {
|
10
|
+
args = args.config ? args : {config: args}
|
11
|
+
args.config = Object.keys(options).length ? options : args.config
|
12
|
+
|
13
|
+
var grant = Grant(args)
|
14
|
+
app.config = grant.config
|
15
|
+
|
16
|
+
var prefix = app.config.defaults.prefix
|
17
|
+
.replace(server.realm.modifiers.route.prefix, '')
|
18
|
+
|
19
|
+
server.route({
|
20
|
+
method: ['GET', 'POST'],
|
21
|
+
path: `${prefix}/{provider}/{override?}`,
|
22
|
+
handler: async (req, res) => {
|
23
|
+
if (!req.yar) {
|
24
|
+
throw new Error('Grant: register session plugin first')
|
25
|
+
}
|
26
|
+
|
27
|
+
var {location, session, state} = await grant({
|
28
|
+
method: req.method,
|
29
|
+
params: req.params,
|
30
|
+
query: qs.parse(req.query),
|
31
|
+
body: qs.parse(req.payload), // #2985
|
32
|
+
state: req.plugins.grant,
|
33
|
+
session: req.yar.get('grant'),
|
34
|
+
})
|
35
|
+
|
36
|
+
req.yar.set('grant', session)
|
37
|
+
req.plugins.grant = state
|
38
|
+
return location ? res.redirect(location) : res.continue
|
39
|
+
}
|
40
|
+
})
|
41
|
+
}
|
42
|
+
|
43
|
+
app.pkg = require('../../package.json')
|
44
|
+
|
45
|
+
app.register = register
|
46
|
+
return app
|
47
|
+
}
|
@@ -0,0 +1,46 @@
|
|
1
|
+
|
2
|
+
var qs = require('qs')
|
3
|
+
var Grant = require('../grant')
|
4
|
+
|
5
|
+
|
6
|
+
module.exports = function (args) {
|
7
|
+
var grant = Grant((args || {}).config ? args : {config: args})
|
8
|
+
app.config = grant.config
|
9
|
+
|
10
|
+
var regex = new RegExp([
|
11
|
+
'^',
|
12
|
+
app.config.defaults.prefix,
|
13
|
+
/(?:\/([^\/\?]+?))/.source, // /:provider
|
14
|
+
/(?:\/([^\/\?]+?))?/.source, // /:override?
|
15
|
+
/(?:\/$|\/?\?+.*)?$/.source, // querystring
|
16
|
+
].join(''), 'i')
|
17
|
+
|
18
|
+
function* app (next) {
|
19
|
+
var match = regex.exec(this.request.originalUrl)
|
20
|
+
if (!match) {
|
21
|
+
return yield next
|
22
|
+
}
|
23
|
+
|
24
|
+
if (!this.session) {
|
25
|
+
throw new Error('Grant: mount session middleware first')
|
26
|
+
}
|
27
|
+
if (this.method === 'POST' && !this.request.body) {
|
28
|
+
throw new Error('Grant: mount body parser middleware first')
|
29
|
+
}
|
30
|
+
|
31
|
+
var result = yield grant({
|
32
|
+
method: this.method,
|
33
|
+
params: {provider: match[1], override: match[2]},
|
34
|
+
query: qs.parse(this.request.query),
|
35
|
+
body: this.request.body,
|
36
|
+
state: this.state.grant,
|
37
|
+
session: this.session.grant,
|
38
|
+
})
|
39
|
+
|
40
|
+
this.session.grant = result.session
|
41
|
+
this.state.grant = result.state
|
42
|
+
result.location ? this.response.redirect(result.location) : yield next
|
43
|
+
}
|
44
|
+
|
45
|
+
return app
|
46
|
+
}
|
@@ -0,0 +1,46 @@
|
|
1
|
+
|
2
|
+
var qs = require('qs')
|
3
|
+
var Grant = require('../grant')
|
4
|
+
|
5
|
+
|
6
|
+
module.exports = function (args = {}) {
|
7
|
+
var grant = Grant(args.config ? args : {config: args})
|
8
|
+
app.config = grant.config
|
9
|
+
|
10
|
+
var regex = new RegExp([
|
11
|
+
'^',
|
12
|
+
app.config.defaults.prefix,
|
13
|
+
/(?:\/([^\/\?]+?))/.source, // /:provider
|
14
|
+
/(?:\/([^\/\?]+?))?/.source, // /:override?
|
15
|
+
/(?:\/$|\/?\?+.*)?$/.source, // querystring
|
16
|
+
].join(''), 'i')
|
17
|
+
|
18
|
+
async function app (ctx, next) {
|
19
|
+
var match = regex.exec(ctx.originalUrl)
|
20
|
+
if (!match) {
|
21
|
+
return next()
|
22
|
+
}
|
23
|
+
|
24
|
+
if (!ctx.session) {
|
25
|
+
ctx.throw(400, 'Grant: mount session middleware first')
|
26
|
+
}
|
27
|
+
if (ctx.method === 'POST' && !ctx.request.body) {
|
28
|
+
ctx.throw(400, 'Grant: mount body parser middleware first')
|
29
|
+
}
|
30
|
+
|
31
|
+
var {location, session, state} = await grant({
|
32
|
+
method: ctx.method,
|
33
|
+
params: {provider: match[1], override: match[2]},
|
34
|
+
query: qs.parse(ctx.request.query),
|
35
|
+
body: ctx.request.body,
|
36
|
+
state: ctx.state.grant,
|
37
|
+
session: ctx.session.grant,
|
38
|
+
})
|
39
|
+
|
40
|
+
ctx.session.grant = session
|
41
|
+
ctx.state.grant = state
|
42
|
+
location ? ctx.response.redirect(location) : await next()
|
43
|
+
}
|
44
|
+
|
45
|
+
return app
|
46
|
+
}
|
@@ -0,0 +1,62 @@
|
|
1
|
+
|
2
|
+
var qs = require('qs')
|
3
|
+
var Grant = require('../grant')
|
4
|
+
var Session = require('../session')
|
5
|
+
|
6
|
+
|
7
|
+
module.exports = function (args = {}) {
|
8
|
+
var grant = Grant(args.config ? args : {config: args})
|
9
|
+
app.config = grant.config
|
10
|
+
|
11
|
+
var regex = new RegExp([
|
12
|
+
'^',
|
13
|
+
app.config.defaults.prefix,
|
14
|
+
/(?:\/([^\/\?]+?))/.source, // /:provider
|
15
|
+
/(?:\/([^\/\?]+?))?/.source, // /:override?
|
16
|
+
/(?:\/$|\/?\?+(.*))?$/.source, // querystring
|
17
|
+
].join(''), 'i')
|
18
|
+
|
19
|
+
var store = Session(args.session)
|
20
|
+
|
21
|
+
async function app (req, res, state) {
|
22
|
+
var session = store(req, res)
|
23
|
+
var match = regex.exec(req.url)
|
24
|
+
if (!match) {
|
25
|
+
return {session}
|
26
|
+
}
|
27
|
+
|
28
|
+
var {location, session:sess, state} = await grant({
|
29
|
+
method: req.method,
|
30
|
+
params: {provider: match[1], override: match[2]},
|
31
|
+
query: qs.parse(match[3]),
|
32
|
+
body: req.method === 'POST' ? qs.parse(await buffer(req)) : {},
|
33
|
+
state,
|
34
|
+
session: (await session.get()).grant
|
35
|
+
})
|
36
|
+
|
37
|
+
await session.set({grant: sess})
|
38
|
+
|
39
|
+
return location
|
40
|
+
? (redirect(res, location, session), {session, redirect: true})
|
41
|
+
: {session, response: state.response || sess.response}
|
42
|
+
}
|
43
|
+
|
44
|
+
return app
|
45
|
+
}
|
46
|
+
|
47
|
+
var redirect = (res, location, session) => {
|
48
|
+
res.setHeader('set-cookie', session.headers['set-cookie'])
|
49
|
+
setImmediate(() => {
|
50
|
+
if (!res.headersSent) {
|
51
|
+
res.statusCode = 302
|
52
|
+
res.setHeader('location', location)
|
53
|
+
res.end()
|
54
|
+
}
|
55
|
+
})
|
56
|
+
}
|
57
|
+
|
58
|
+
var buffer = (req, body = []) => new Promise((resolve, reject) => req
|
59
|
+
.on('data', (chunk) => body.push(chunk))
|
60
|
+
.on('end', () => resolve(Buffer.concat(body).toString('utf8')))
|
61
|
+
.on('error', reject)
|
62
|
+
)
|
@@ -0,0 +1,56 @@
|
|
1
|
+
|
2
|
+
var qs = require('qs')
|
3
|
+
var Grant = require('../grant')
|
4
|
+
var Session = require('../session')
|
5
|
+
|
6
|
+
|
7
|
+
module.exports = function (args = {}) {
|
8
|
+
var grant = Grant(args.config ? args : {config: args})
|
9
|
+
app.config = grant.config
|
10
|
+
|
11
|
+
var regex = new RegExp([
|
12
|
+
'^',
|
13
|
+
app.config.defaults.prefix,
|
14
|
+
/(?:\/([^\/\?]+?))/.source, // /:provider
|
15
|
+
/(?:\/([^\/\?]+?))?/.source, // /:override?
|
16
|
+
/(?:\/$|\/?\?+.*)?$/.source, // querystring
|
17
|
+
].join(''), 'i')
|
18
|
+
|
19
|
+
var store = Session(args.session)
|
20
|
+
|
21
|
+
async function app (req, res, state) {
|
22
|
+
var session = store(req, res)
|
23
|
+
var match = regex.exec(req.url)
|
24
|
+
if (!match) {
|
25
|
+
return {session}
|
26
|
+
}
|
27
|
+
|
28
|
+
var {location, session:sess, state} = await grant({
|
29
|
+
method: req.method,
|
30
|
+
params: {provider: match[1], override: match[2]},
|
31
|
+
query: qs.parse(req.query),
|
32
|
+
body: req.body,
|
33
|
+
state,
|
34
|
+
session: (await session.get()).grant
|
35
|
+
})
|
36
|
+
|
37
|
+
await session.set({grant: sess})
|
38
|
+
|
39
|
+
return location
|
40
|
+
? (redirect(res, location, session), {session, redirect: true})
|
41
|
+
: {session, response: state.response || sess.response}
|
42
|
+
}
|
43
|
+
|
44
|
+
return app
|
45
|
+
}
|
46
|
+
|
47
|
+
var redirect = (res, location, session) => {
|
48
|
+
res.setHeader('set-cookie', session.headers['set-cookie'])
|
49
|
+
setImmediate(() => {
|
50
|
+
if (!res.headersSent) {
|
51
|
+
res.statusCode = 302
|
52
|
+
res.setHeader('location', location)
|
53
|
+
res.end()
|
54
|
+
}
|
55
|
+
})
|
56
|
+
}
|
package/lib/oidc.js
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
|
2
|
+
var crypto = require('crypto')
|
3
|
+
|
4
|
+
|
5
|
+
var base64url = (str) =>
|
6
|
+
str.toString('base64').replace(/=/g, '').replace(/\+/g, '-').replace(/\//g, '_')
|
7
|
+
|
8
|
+
var kid = (jwk) => {
|
9
|
+
if (jwk.kid) {
|
10
|
+
return jwk.kid
|
11
|
+
}
|
12
|
+
var keys =
|
13
|
+
jwk.kty === 'RSA' ? {e: jwk.e, kty: jwk.kty, n: jwk.n} :
|
14
|
+
jwk.kty === 'EC' ? {crv: jwk.crv, kty: jwk.kty, x: jwk.x, y: jwk.y} :
|
15
|
+
jwk.kty === 'oct' ? {k: jwk.k, kty: jwk.kty} : undefined
|
16
|
+
return keys
|
17
|
+
? base64url(crypto.createHash('sha256').update(JSON.stringify(keys)).digest())
|
18
|
+
: undefined
|
19
|
+
}
|
20
|
+
|
21
|
+
var x5t = (cert) => {
|
22
|
+
var s1 = cert.replace(/(?:-----(?:BEGIN|END) CERTIFICATE-----|\s)/g, '')
|
23
|
+
var s2 = Buffer.from(s1, 'base64')
|
24
|
+
var s3 = crypto.createHash('sha1').update(s2).digest('hex').toUpperCase()
|
25
|
+
return base64url(Buffer.from(s3, 'hex'))
|
26
|
+
}
|
27
|
+
|
28
|
+
var pem = (jwk) => {
|
29
|
+
var pem = require('jwk-to-pem')
|
30
|
+
return pem(jwk, {private: true})
|
31
|
+
}
|
32
|
+
|
33
|
+
var sign = (jwt) => {
|
34
|
+
var jws = require('jws')
|
35
|
+
return jws.sign(jwt)
|
36
|
+
}
|
37
|
+
|
38
|
+
var jwt = (str) => {
|
39
|
+
var [header, payload, signature] = str.split('.')
|
40
|
+
return {
|
41
|
+
header: JSON.parse(Buffer.from(header, 'base64').toString('binary')),
|
42
|
+
payload: JSON.parse(Buffer.from(payload, 'base64').toString('utf8')),
|
43
|
+
signature,
|
44
|
+
}
|
45
|
+
}
|
46
|
+
|
47
|
+
module.exports = {base64url, kid, x5t, pem, sign, jwt}
|