@ministryofjustice/hmpps-prisoner-auth 0.0.3 → 0.0.5
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/README.md +32 -93
- package/dist/index.cjs.js +12 -5
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +8 -2
- package/dist/index.esm.js +12 -5
- package/dist/index.esm.js.map +1 -1
- package/dist/main/index.d.ts +1 -0
- package/dist/main/launchpadUser.d.ts +1 -1
- package/dist/main/prisonerAuth.d.ts +6 -0
- package/dist/main/testUtils.d.ts +5 -1
- package/package.json +4 -2
package/README.md
CHANGED
|
@@ -7,29 +7,39 @@
|
|
|
7
7
|
The following steps will give an opinionated out of the box setup for applications where a launchpad user will be the main user in the system.
|
|
8
8
|
|
|
9
9
|
1. Add the package `@ministryofjustice/hmpps-prisoner-auth` to your `package.json`
|
|
10
|
+
```sh
|
|
11
|
+
npm add --save @ministryofjustice/hmpps-prisoner-auth
|
|
12
|
+
npm i
|
|
10
13
|
```
|
|
11
|
-
|
|
12
|
-
$ npm i
|
|
13
|
-
```
|
|
14
|
+
|
|
14
15
|
2. Copy the contents of [src/misc/install.diff](src/misc/install.diff) to your local folder
|
|
16
|
+
```sh
|
|
17
|
+
curl https://raw.githubusercontent.com/ministryofjustice/hmpps-prisoner-facing-typescript-lib/refs/heads/main/packages/prisoner-auth/src/misc/install.diff > install.diff
|
|
15
18
|
```
|
|
16
|
-
|
|
17
|
-
```
|
|
19
|
+
|
|
18
20
|
3. Apply the diff to carry out all the required changes
|
|
21
|
+
```sh
|
|
22
|
+
git apply install.diff
|
|
19
23
|
```
|
|
20
|
-
|
|
21
|
-
```
|
|
24
|
+
|
|
22
25
|
4. Make sure to look through the applied changes and remove the diff file before committing.
|
|
23
26
|
|
|
27
|
+
5. Fill in the configuration options in `server/middleware/setUpPrisonerAuth.ts`:
|
|
28
|
+
|
|
29
|
+
See [PrisonerAuthOptions](https://raw.githubusercontent.com/ministryofjustice/hmpps-prisoner-facing-typescript-lib/refs/heads/main/packages/prisoner-auth/src/main/prisonerAuth.ts) for full documentation on the avaialble options
|
|
30
|
+
|
|
24
31
|
### Manual installation
|
|
25
32
|
|
|
33
|
+
NOTE: see [install.diff](https://raw.githubusercontent.com/ministryofjustice/hmpps-prisoner-facing-typescript-lib/refs/heads/main/packages/prisoner-auth/src/misc/install.diff) for an authorititive list of changes to be made.
|
|
34
|
+
|
|
26
35
|
1. Add the package `@ministryofjustice/hmpps-prisoner-auth` to your `package.json`
|
|
36
|
+
```sh
|
|
37
|
+
npm add --save @ministryofjustice/hmpps-prisoner-auth
|
|
38
|
+
npm i
|
|
27
39
|
```
|
|
28
|
-
|
|
29
|
-
$ npm i
|
|
30
|
-
```
|
|
40
|
+
|
|
31
41
|
2. Modify `interfaces/hmppsUser.ts` to make the following additions:
|
|
32
|
-
```
|
|
42
|
+
```ts
|
|
33
43
|
# add prisoner-auth to the AuthSource type
|
|
34
44
|
export type AuthSource = 'nomis' | 'delius' | 'external' | 'azuread' | 'prisoner-auth'
|
|
35
45
|
|
|
@@ -38,87 +48,16 @@ export type HmppsUser = PrisonUser | ProbationUser | ExternalUser | AzureADUser
|
|
|
38
48
|
```
|
|
39
49
|
These changes will help smooth over alot of assumptions made in the typescript template about the type of fields the user will have.
|
|
40
50
|
|
|
41
|
-
3.
|
|
42
|
-
```
|
|
43
|
-
passport.use(
|
|
44
|
-
'prisoner-auth',
|
|
45
|
-
prisonerAuthStrategy(
|
|
46
|
-
{
|
|
47
|
-
launchpadAuthUrl: 'https://launchpad.instance.etc' ...
|
|
48
|
-
}
|
|
49
|
-
)
|
|
50
|
-
)
|
|
51
|
-
```
|
|
52
|
-
Note: it is recommended to give the strategy a name ('prisoner-auth' here) for later referral with passport.authenticate middleware.
|
|
51
|
+
3. Add `server/middleware/setUpPrisonerAuth.ts` middlware:
|
|
53
52
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
export default function setupAuthentication() {
|
|
57
|
-
const router = Router()
|
|
58
|
-
|
|
59
|
-
router.use(passport.initialize())
|
|
60
|
-
router.use(passport.session())
|
|
61
|
-
router.use(flash())
|
|
62
|
-
|
|
63
|
-
router.get('/autherror', (req, res) => {
|
|
64
|
-
res.status(401)
|
|
65
|
-
return res.render('autherror')
|
|
66
|
-
})
|
|
67
|
-
|
|
68
|
-
router.get('/sign-in', passport.authenticate('prisoner-auth'))
|
|
69
|
-
|
|
70
|
-
router.get('/sign-in/callback', (req, res, next) =>
|
|
71
|
-
passport.authenticate('prisoner-auth', {
|
|
72
|
-
successReturnToOrRedirect: req.session.returnTo || '/',
|
|
73
|
-
failureRedirect: '/autherror',
|
|
74
|
-
})(req, res, next),
|
|
75
|
-
)
|
|
76
|
-
|
|
77
|
-
router.use('/sign-out', (req, res, next) => {
|
|
78
|
-
if (req.user) {
|
|
79
|
-
req.logout(err => {
|
|
80
|
-
if (err) return next(err)
|
|
81
|
-
return req.session.destroy(() => res.redirect('/'))
|
|
82
|
-
})
|
|
83
|
-
} else res.redirect('/')
|
|
84
|
-
})
|
|
85
|
-
|
|
86
|
-
router.use(async (req, res, next) => {
|
|
87
|
-
if (!req.isAuthenticated()) {
|
|
88
|
-
req.session.returnTo = req.originalUrl
|
|
89
|
-
return res.redirect('/sign-in')
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
return prisonerAuth
|
|
93
|
-
.validateAndRefreshUser(req.user as LaunchpadUser)
|
|
94
|
-
.then(user => {
|
|
95
|
-
req.user = user
|
|
96
|
-
next()
|
|
97
|
-
})
|
|
98
|
-
.catch(() => res.redirect('/autherror'))
|
|
99
|
-
})
|
|
100
|
-
|
|
101
|
-
router.use((req, res, next) => {
|
|
102
|
-
res.locals.user = req.user as HmppsUser
|
|
103
|
-
next()
|
|
104
|
-
})
|
|
105
|
-
|
|
106
|
-
return router
|
|
107
|
-
}
|
|
53
|
+
```sh
|
|
54
|
+
curl https://raw.githubusercontent.com/ministryofjustice/hmpps-prisoner-facing-typescript-lib/refs/heads/main/packages/prisoner-auth/src/misc/setUpPrisonerAuth.ts.example > server/middleware/setUpPrisonerAuth.ts
|
|
108
55
|
```
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
| launchpadAuthUrl | The full URL of the launchpad auth instance you wish to authenticate against |
|
|
118
|
-
| clientID | The client ID |
|
|
119
|
-
| clientSecret | The client secret |
|
|
120
|
-
| callbackURL | *Optional, The URL or path you wish launchpad to call back to in the auth flow. Defaults to `/signin/callback` |
|
|
121
|
-
| scope | *Optional, One or more OpenIdConnect Scopes you require for the application. Defaults to `['user.basic.read', 'user.establishment.read', 'user.booking.read']` |
|
|
122
|
-
| tokenMinimumLifespan | The least amount of time a token must have left before it is considered expired. Expressed as a TimeSpan. eg. `minutes(5)` or `nothing()`. |
|
|
123
|
-
|
|
124
|
-
See `PrisonerAuthOptions` for full list and documentation for these options.
|
|
56
|
+
Make sure to fill in the appropriate values.
|
|
57
|
+
|
|
58
|
+
See [PrisonerAuthOptions](https://raw.githubusercontent.com/ministryofjustice/hmpps-prisoner-facing-typescript-lib/refs/heads/main/packages/prisoner-auth/src/main/prisonerAuth.ts) for full documentation on the avaialble options
|
|
59
|
+
|
|
60
|
+
4. Modify `server/app.ts`:
|
|
61
|
+
- ADD `setUpPrisonerAuth()` to enable the middlware.
|
|
62
|
+
- REMOVE reference to `authorisationMiddleware()` - this checks the users `ROLE_` which a launchpad user will not have.
|
|
63
|
+
- REMOVE reference to `setUpCurrentUser()` - this sets up the `res.locals.user` fields which a launchpad will have already (`name`, `displayName` etc).
|
package/dist/index.cjs.js
CHANGED
|
@@ -25,11 +25,12 @@ const tokenFetcher = (userRefreshToken, tokenUrl, authorizationHeader) => {
|
|
|
25
25
|
};
|
|
26
26
|
|
|
27
27
|
const userFromTokens = ({ idToken, accessToken, refreshToken }) => {
|
|
28
|
-
const
|
|
28
|
+
const parsedIdToken = tokenFromJwt(idToken);
|
|
29
|
+
const { establishment, name, given_name: givenName, family_name: familyName, sub } = parsedIdToken;
|
|
29
30
|
const authSource = 'prisoner-auth';
|
|
30
31
|
return {
|
|
31
32
|
authSource,
|
|
32
|
-
idToken,
|
|
33
|
+
idToken: parsedIdToken,
|
|
33
34
|
refreshToken,
|
|
34
35
|
accessToken,
|
|
35
36
|
establishment,
|
|
@@ -99,11 +100,13 @@ class TimeSpan {
|
|
|
99
100
|
}
|
|
100
101
|
}
|
|
101
102
|
|
|
103
|
+
const nullOnLoginSuccessCallback = _ => Promise.resolve();
|
|
102
104
|
class PrisonerAuth {
|
|
103
105
|
launchpadAuthUrl;
|
|
104
106
|
authorizationUrl;
|
|
105
107
|
tokenUrl;
|
|
106
108
|
callbackUrl;
|
|
109
|
+
onLoginSuccessCallback;
|
|
107
110
|
clientId;
|
|
108
111
|
clientSecret;
|
|
109
112
|
scope;
|
|
@@ -115,6 +118,7 @@ class PrisonerAuth {
|
|
|
115
118
|
this.authorizationUrl = options.authorizationUrl ?? `${options.launchpadAuthUrl}/v1/oauth2/authorize`;
|
|
116
119
|
this.tokenUrl = options.tokenUrl ?? `${options.launchpadAuthUrl}/v1/oauth2/token`;
|
|
117
120
|
this.callbackUrl = options.callbackUrl ?? '/sign-in/callback';
|
|
121
|
+
this.onLoginSuccessCallback = options.onLoginSuccessCallback ?? nullOnLoginSuccessCallback;
|
|
118
122
|
this.clientId = options.clientId;
|
|
119
123
|
this.clientSecret = options.clientSecret;
|
|
120
124
|
this.scope = options.scope ?? ['user.basic.read', 'user.establishment.read', 'user.booking.read'];
|
|
@@ -139,7 +143,11 @@ class PrisonerAuth {
|
|
|
139
143
|
skipUserProfile: true,
|
|
140
144
|
nonce: this.nonce ? 'true' : undefined,
|
|
141
145
|
customHeaders: { authorization: this.authorizationToken() },
|
|
142
|
-
}, ((_issuer, _profile, _context, idToken, accessToken, refreshToken, done) =>
|
|
146
|
+
}, (async (_issuer, _profile, _context, idToken, accessToken, refreshToken, done) => {
|
|
147
|
+
const user = userFromTokens({ idToken, accessToken, refreshToken });
|
|
148
|
+
await this.onLoginSuccessCallback(user);
|
|
149
|
+
done(null, user);
|
|
150
|
+
}));
|
|
143
151
|
}
|
|
144
152
|
/**
|
|
145
153
|
* Checks the expiry of a given LaunchpadUser idToken and refreshToken.
|
|
@@ -153,11 +161,10 @@ class PrisonerAuth {
|
|
|
153
161
|
* @throws Error is thrown if the refreshToken has expired, the user must sign in again from scratch.
|
|
154
162
|
*/
|
|
155
163
|
async validateAndRefreshUser(user) {
|
|
156
|
-
const idToken = tokenFromJwt(user.idToken);
|
|
157
164
|
const refreshToken = tokenFromJwt(user.refreshToken);
|
|
158
165
|
const tokenExpiryTime = timeFromNow(this.tokenMinimumLifespan);
|
|
159
166
|
// Id Token still valid, return the current user
|
|
160
|
-
if (seconds(idToken.exp).isGreaterThanOrEqualTo(tokenExpiryTime)) {
|
|
167
|
+
if (seconds(user.idToken.exp).isGreaterThanOrEqualTo(tokenExpiryTime)) {
|
|
161
168
|
return user;
|
|
162
169
|
}
|
|
163
170
|
// Refresh token expired, cannot continue
|
package/dist/index.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs.js","sources":["../src/main/tokens.ts","../src/main/launchpadUser.ts","../src/main/timeSpans.ts","../src/main/prisonerAuth.ts"],"sourcesContent":[null,null,null,null],"names":[],"mappings":";;;;;AA0CO,MAAM,YAAY,GAAG,CAAI,KAAa,KAAQ,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC;AAE/G,MAAM,gBAAgB,GAAG,CAAC,QAAgB,EAAE,YAAoB,KAAY;AACjF,IAAA,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,YAAY,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAC3E,OAAO,CAAA,MAAA,EAAS,KAAK,CAAA,CAAE;AACzB,CAAC;AAIM,MAAM,YAAY,GAAiB,CAAC,gBAAgB,EAAE,QAAQ,EAAE,mBAAmB,KAAI;IAC5F,OAAO,IAAI,OAAO,CAAY,CAAC,OAAO,EAAE,MAAM,KAAI;QAChD;aACG,IAAI,CAAC,QAAQ;AACb,aAAA,GAAG,CAAC,cAAc,EAAE,mCAAmC;AACvD,aAAA,GAAG,CAAC,eAAe,EAAE,mBAAmB;aACxC,KAAK,CAAC,EAAE,aAAa,EAAE,gBAAgB,EAAE,UAAU,EAAE,eAAe,EAAE;AACtE,aAAA,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,KAAI;AAChB,YAAA,IAAI,GAAG;gBAAE,MAAM,CAAC,GAAG,CAAC;AACpB,YAAA,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,GAAG,GAAG,CAAC,IAAI;YAC9F,OAAO,OAAO,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;AACxD,QAAA,CAAC,CAAC;AACN,IAAA,CAAC,CAAC;AACJ,CAAC;;AC5CM,MAAM,cAAc,GAAG,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAa,KAAmB;
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../src/main/tokens.ts","../src/main/launchpadUser.ts","../src/main/timeSpans.ts","../src/main/prisonerAuth.ts"],"sourcesContent":[null,null,null,null],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -30,7 +30,7 @@ type TokenFetcher = (refreshToken: string, tokenUrl: string, authorizationHeader
|
|
|
30
30
|
|
|
31
31
|
type LaunchpadUser = {
|
|
32
32
|
authSource: 'prisoner-auth';
|
|
33
|
-
idToken:
|
|
33
|
+
idToken: IdToken;
|
|
34
34
|
refreshToken: string;
|
|
35
35
|
accessToken: string;
|
|
36
36
|
establishment: IdToken['establishment'];
|
|
@@ -85,6 +85,10 @@ type PrisonerAuthOptions = {
|
|
|
85
85
|
* If omitted, callbackUrl will default to /sign-in/callback
|
|
86
86
|
*/
|
|
87
87
|
callbackUrl?: string;
|
|
88
|
+
/**
|
|
89
|
+
* Optional: A callback that will be invoked on sucessful login, provides the logged in user as a parameter
|
|
90
|
+
*/
|
|
91
|
+
onLoginSuccessCallback?: OnLoginSuccessCallback;
|
|
88
92
|
/** The Client ID of this application to send to Launchpad Auth */
|
|
89
93
|
clientId: string;
|
|
90
94
|
/** The Client Secret of this application to send to Launchpad Auth */
|
|
@@ -126,11 +130,13 @@ type PrisonerAuthOptions = {
|
|
|
126
130
|
*/
|
|
127
131
|
tokenFetcher?: TokenFetcher;
|
|
128
132
|
};
|
|
133
|
+
type OnLoginSuccessCallback = (user: LaunchpadUser) => Promise<void>;
|
|
129
134
|
declare class PrisonerAuth {
|
|
130
135
|
readonly launchpadAuthUrl: string;
|
|
131
136
|
readonly authorizationUrl: string;
|
|
132
137
|
readonly tokenUrl: string;
|
|
133
138
|
readonly callbackUrl: string;
|
|
139
|
+
readonly onLoginSuccessCallback: OnLoginSuccessCallback;
|
|
134
140
|
readonly clientId: string;
|
|
135
141
|
readonly clientSecret: string;
|
|
136
142
|
readonly scope: Scope | Scope[];
|
|
@@ -159,4 +165,4 @@ declare class PrisonerAuth {
|
|
|
159
165
|
}
|
|
160
166
|
|
|
161
167
|
export { PrisonerAuth, TimeSpan, milliseconds, minutes, nothing, seconds };
|
|
162
|
-
export type { LaunchpadUser, PrisonerAuthOptions };
|
|
168
|
+
export type { IdToken, LaunchpadUser, PrisonerAuthOptions };
|
package/dist/index.esm.js
CHANGED
|
@@ -23,11 +23,12 @@ const tokenFetcher = (userRefreshToken, tokenUrl, authorizationHeader) => {
|
|
|
23
23
|
};
|
|
24
24
|
|
|
25
25
|
const userFromTokens = ({ idToken, accessToken, refreshToken }) => {
|
|
26
|
-
const
|
|
26
|
+
const parsedIdToken = tokenFromJwt(idToken);
|
|
27
|
+
const { establishment, name, given_name: givenName, family_name: familyName, sub } = parsedIdToken;
|
|
27
28
|
const authSource = 'prisoner-auth';
|
|
28
29
|
return {
|
|
29
30
|
authSource,
|
|
30
|
-
idToken,
|
|
31
|
+
idToken: parsedIdToken,
|
|
31
32
|
refreshToken,
|
|
32
33
|
accessToken,
|
|
33
34
|
establishment,
|
|
@@ -97,11 +98,13 @@ class TimeSpan {
|
|
|
97
98
|
}
|
|
98
99
|
}
|
|
99
100
|
|
|
101
|
+
const nullOnLoginSuccessCallback = _ => Promise.resolve();
|
|
100
102
|
class PrisonerAuth {
|
|
101
103
|
launchpadAuthUrl;
|
|
102
104
|
authorizationUrl;
|
|
103
105
|
tokenUrl;
|
|
104
106
|
callbackUrl;
|
|
107
|
+
onLoginSuccessCallback;
|
|
105
108
|
clientId;
|
|
106
109
|
clientSecret;
|
|
107
110
|
scope;
|
|
@@ -113,6 +116,7 @@ class PrisonerAuth {
|
|
|
113
116
|
this.authorizationUrl = options.authorizationUrl ?? `${options.launchpadAuthUrl}/v1/oauth2/authorize`;
|
|
114
117
|
this.tokenUrl = options.tokenUrl ?? `${options.launchpadAuthUrl}/v1/oauth2/token`;
|
|
115
118
|
this.callbackUrl = options.callbackUrl ?? '/sign-in/callback';
|
|
119
|
+
this.onLoginSuccessCallback = options.onLoginSuccessCallback ?? nullOnLoginSuccessCallback;
|
|
116
120
|
this.clientId = options.clientId;
|
|
117
121
|
this.clientSecret = options.clientSecret;
|
|
118
122
|
this.scope = options.scope ?? ['user.basic.read', 'user.establishment.read', 'user.booking.read'];
|
|
@@ -137,7 +141,11 @@ class PrisonerAuth {
|
|
|
137
141
|
skipUserProfile: true,
|
|
138
142
|
nonce: this.nonce ? 'true' : undefined,
|
|
139
143
|
customHeaders: { authorization: this.authorizationToken() },
|
|
140
|
-
}, ((_issuer, _profile, _context, idToken, accessToken, refreshToken, done) =>
|
|
144
|
+
}, (async (_issuer, _profile, _context, idToken, accessToken, refreshToken, done) => {
|
|
145
|
+
const user = userFromTokens({ idToken, accessToken, refreshToken });
|
|
146
|
+
await this.onLoginSuccessCallback(user);
|
|
147
|
+
done(null, user);
|
|
148
|
+
}));
|
|
141
149
|
}
|
|
142
150
|
/**
|
|
143
151
|
* Checks the expiry of a given LaunchpadUser idToken and refreshToken.
|
|
@@ -151,11 +159,10 @@ class PrisonerAuth {
|
|
|
151
159
|
* @throws Error is thrown if the refreshToken has expired, the user must sign in again from scratch.
|
|
152
160
|
*/
|
|
153
161
|
async validateAndRefreshUser(user) {
|
|
154
|
-
const idToken = tokenFromJwt(user.idToken);
|
|
155
162
|
const refreshToken = tokenFromJwt(user.refreshToken);
|
|
156
163
|
const tokenExpiryTime = timeFromNow(this.tokenMinimumLifespan);
|
|
157
164
|
// Id Token still valid, return the current user
|
|
158
|
-
if (seconds(idToken.exp).isGreaterThanOrEqualTo(tokenExpiryTime)) {
|
|
165
|
+
if (seconds(user.idToken.exp).isGreaterThanOrEqualTo(tokenExpiryTime)) {
|
|
159
166
|
return user;
|
|
160
167
|
}
|
|
161
168
|
// Refresh token expired, cannot continue
|
package/dist/index.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","sources":["../src/main/tokens.ts","../src/main/launchpadUser.ts","../src/main/timeSpans.ts","../src/main/prisonerAuth.ts"],"sourcesContent":[null,null,null,null],"names":[],"mappings":";;;AA0CO,MAAM,YAAY,GAAG,CAAI,KAAa,KAAQ,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC;AAE/G,MAAM,gBAAgB,GAAG,CAAC,QAAgB,EAAE,YAAoB,KAAY;AACjF,IAAA,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,YAAY,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAC3E,OAAO,CAAA,MAAA,EAAS,KAAK,CAAA,CAAE;AACzB,CAAC;AAIM,MAAM,YAAY,GAAiB,CAAC,gBAAgB,EAAE,QAAQ,EAAE,mBAAmB,KAAI;IAC5F,OAAO,IAAI,OAAO,CAAY,CAAC,OAAO,EAAE,MAAM,KAAI;QAChD;aACG,IAAI,CAAC,QAAQ;AACb,aAAA,GAAG,CAAC,cAAc,EAAE,mCAAmC;AACvD,aAAA,GAAG,CAAC,eAAe,EAAE,mBAAmB;aACxC,KAAK,CAAC,EAAE,aAAa,EAAE,gBAAgB,EAAE,UAAU,EAAE,eAAe,EAAE;AACtE,aAAA,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,KAAI;AAChB,YAAA,IAAI,GAAG;gBAAE,MAAM,CAAC,GAAG,CAAC;AACpB,YAAA,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,GAAG,GAAG,CAAC,IAAI;YAC9F,OAAO,OAAO,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;AACxD,QAAA,CAAC,CAAC;AACN,IAAA,CAAC,CAAC;AACJ,CAAC;;AC5CM,MAAM,cAAc,GAAG,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAa,KAAmB;
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../src/main/tokens.ts","../src/main/launchpadUser.ts","../src/main/timeSpans.ts","../src/main/prisonerAuth.ts"],"sourcesContent":[null,null,null,null],"names":[],"mappings":"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"}
|
package/dist/main/index.d.ts
CHANGED
|
@@ -23,6 +23,10 @@ export type PrisonerAuthOptions = {
|
|
|
23
23
|
* If omitted, callbackUrl will default to /sign-in/callback
|
|
24
24
|
*/
|
|
25
25
|
callbackUrl?: string;
|
|
26
|
+
/**
|
|
27
|
+
* Optional: A callback that will be invoked on sucessful login, provides the logged in user as a parameter
|
|
28
|
+
*/
|
|
29
|
+
onLoginSuccessCallback?: OnLoginSuccessCallback;
|
|
26
30
|
/** The Client ID of this application to send to Launchpad Auth */
|
|
27
31
|
clientId: string;
|
|
28
32
|
/** The Client Secret of this application to send to Launchpad Auth */
|
|
@@ -64,11 +68,13 @@ export type PrisonerAuthOptions = {
|
|
|
64
68
|
*/
|
|
65
69
|
tokenFetcher?: TokenFetcher;
|
|
66
70
|
};
|
|
71
|
+
export type OnLoginSuccessCallback = (user: LaunchpadUser) => Promise<void>;
|
|
67
72
|
export default class PrisonerAuth {
|
|
68
73
|
readonly launchpadAuthUrl: string;
|
|
69
74
|
readonly authorizationUrl: string;
|
|
70
75
|
readonly tokenUrl: string;
|
|
71
76
|
readonly callbackUrl: string;
|
|
77
|
+
readonly onLoginSuccessCallback: OnLoginSuccessCallback;
|
|
72
78
|
readonly clientId: string;
|
|
73
79
|
readonly clientSecret: string;
|
|
74
80
|
readonly scope: Scope | Scope[];
|
package/dist/main/testUtils.d.ts
CHANGED
|
@@ -3,7 +3,11 @@ export declare const aUserWith: ({ idTokenExp, refreshTokenExp }: {
|
|
|
3
3
|
idTokenExp: number;
|
|
4
4
|
refreshTokenExp: number;
|
|
5
5
|
}) => {
|
|
6
|
-
idToken:
|
|
6
|
+
idToken: {
|
|
7
|
+
exp: number;
|
|
8
|
+
iat: number;
|
|
9
|
+
sub: string;
|
|
10
|
+
};
|
|
7
11
|
refreshToken: string;
|
|
8
12
|
accessToken: string;
|
|
9
13
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ministryofjustice/hmpps-prisoner-auth",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.5",
|
|
4
4
|
"description": "Middleware for providing authentication against Launchpad Auth",
|
|
5
5
|
"author": "hmpps-launchpad-devs",
|
|
6
6
|
"license": "MIT",
|
|
@@ -41,5 +41,7 @@
|
|
|
41
41
|
"passport-openidconnect": "^0.1.2",
|
|
42
42
|
"superagent": "^10.3.0"
|
|
43
43
|
},
|
|
44
|
-
"peerDependencies": {
|
|
44
|
+
"peerDependencies": {
|
|
45
|
+
"express": "^5.2.1"
|
|
46
|
+
}
|
|
45
47
|
}
|