@relyper/sp-auth 0.1.0 → 0.4.0
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 +216 -69
- package/dist/client.d.ts +33 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +57 -4
- package/dist/client.js.map +1 -1
- package/dist/coins.d.ts +139 -0
- package/dist/coins.d.ts.map +1 -0
- package/dist/coins.js +210 -0
- package/dist/coins.js.map +1 -0
- package/dist/oidc/claims.d.ts +4 -0
- package/dist/oidc/claims.d.ts.map +1 -0
- package/dist/oidc/claims.js +50 -0
- package/dist/oidc/claims.js.map +1 -0
- package/dist/oidc/client.d.ts +44 -0
- package/dist/oidc/client.d.ts.map +1 -0
- package/dist/oidc/client.js +340 -0
- package/dist/oidc/client.js.map +1 -0
- package/dist/oidc/discovery.d.ts +15 -0
- package/dist/oidc/discovery.d.ts.map +1 -0
- package/dist/oidc/discovery.js +90 -0
- package/dist/oidc/discovery.js.map +1 -0
- package/dist/oidc/pkce.d.ts +6 -0
- package/dist/oidc/pkce.d.ts.map +1 -0
- package/dist/oidc/pkce.js +26 -0
- package/dist/oidc/pkce.js.map +1 -0
- package/dist/oidc/session.d.ts +47 -0
- package/dist/oidc/session.d.ts.map +1 -0
- package/dist/oidc/session.js +119 -0
- package/dist/oidc/session.js.map +1 -0
- package/dist/oidc/types.d.ts +130 -0
- package/dist/oidc/types.d.ts.map +1 -0
- package/dist/oidc/types.js +17 -0
- package/dist/oidc/types.js.map +1 -0
- package/dist/oidc-fastify.d.ts +123 -0
- package/dist/oidc-fastify.d.ts.map +1 -0
- package/dist/oidc-fastify.js +264 -0
- package/dist/oidc-fastify.js.map +1 -0
- package/dist/oidc.d.ts +15 -0
- package/dist/oidc.d.ts.map +1 -0
- package/dist/oidc.js +14 -0
- package/dist/oidc.js.map +1 -0
- package/dist/types.d.ts +13 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +25 -5
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
import fp from 'fastify-plugin';
|
|
2
|
+
import { createRelyperOidcClient, safeReturnTo } from './oidc/client.js';
|
|
3
|
+
import { clearCookie, createLoginCodec, createSessionCodec, createSessionId, parseCookies, serializeCookie } from './oidc/session.js';
|
|
4
|
+
import { RelyperOidcError } from './oidc/types.js';
|
|
5
|
+
const DEFAULTS = {
|
|
6
|
+
sessionCookieName: 'relyper_session',
|
|
7
|
+
loginCookieName: 'relyper_login',
|
|
8
|
+
cookiePath: '/',
|
|
9
|
+
sessionTtlSeconds: 8 * 60 * 60,
|
|
10
|
+
sessionAbsoluteTtlSeconds: 24 * 60 * 60,
|
|
11
|
+
loginTtlSeconds: 10 * 60,
|
|
12
|
+
loginPath: '/auth/login',
|
|
13
|
+
callbackPath: '/auth/callback',
|
|
14
|
+
logoutPath: '/auth/logout',
|
|
15
|
+
postLogoutRedirect: '/'
|
|
16
|
+
};
|
|
17
|
+
async function plugin(app, options) {
|
|
18
|
+
const client = createRelyperOidcClient(options);
|
|
19
|
+
const sessions = createSessionCodec(options.sessionSecret);
|
|
20
|
+
const logins = createLoginCodec(options.sessionSecret);
|
|
21
|
+
const sessionCookieName = options.sessionCookieName ?? DEFAULTS.sessionCookieName;
|
|
22
|
+
const loginCookieName = options.loginCookieName ?? DEFAULTS.loginCookieName;
|
|
23
|
+
const sessionTtl = options.sessionTtlSeconds ?? DEFAULTS.sessionTtlSeconds;
|
|
24
|
+
const absoluteTtl = options.sessionAbsoluteTtlSeconds ?? DEFAULTS.sessionAbsoluteTtlSeconds;
|
|
25
|
+
const loginTtl = options.loginTtlSeconds ?? DEFAULTS.loginTtlSeconds;
|
|
26
|
+
const rolling = options.rollingSession ?? true;
|
|
27
|
+
const keepIdToken = options.keepIdToken ?? false;
|
|
28
|
+
const principalKey = options.principalKey ?? 'principal';
|
|
29
|
+
const hook = options.hook ?? 'onRequest';
|
|
30
|
+
const loginPath = options.loginPath ?? DEFAULTS.loginPath;
|
|
31
|
+
const callbackPath = options.callbackPath ?? DEFAULTS.callbackPath;
|
|
32
|
+
const logoutPath = options.logoutPath ?? DEFAULTS.logoutPath;
|
|
33
|
+
const postLogoutRedirect = safeReturnTo(options.postLogoutRedirect ?? DEFAULTS.postLogoutRedirect);
|
|
34
|
+
const authRoutes = new Set([loginPath, callbackPath, logoutPath]);
|
|
35
|
+
const nodeEnv = process.env.NODE_ENV ?? 'development';
|
|
36
|
+
const cookieBase = {
|
|
37
|
+
path: options.cookiePath ?? DEFAULTS.cookiePath,
|
|
38
|
+
domain: options.cookieDomain,
|
|
39
|
+
httpOnly: true,
|
|
40
|
+
// Lax, not Strict: the callback arrives as a top-level navigation from the
|
|
41
|
+
// IdP, and Strict would withhold the login cookie exactly then.
|
|
42
|
+
sameSite: 'Lax',
|
|
43
|
+
secure: options.cookieSecure ?? (nodeEnv !== 'development' && nodeEnv !== 'test')
|
|
44
|
+
};
|
|
45
|
+
const errorBody = options.errorBody
|
|
46
|
+
?? ((failure) => ({
|
|
47
|
+
error: failure.message,
|
|
48
|
+
code: failure.code,
|
|
49
|
+
loginUrl: loginPath
|
|
50
|
+
}));
|
|
51
|
+
if (!app.hasRequestDecorator('relyperIdentity')) {
|
|
52
|
+
app.decorateRequest('relyperIdentity', null);
|
|
53
|
+
}
|
|
54
|
+
if (!app.hasRequestDecorator('relyperSession')) {
|
|
55
|
+
app.decorateRequest('relyperSession', null);
|
|
56
|
+
}
|
|
57
|
+
if (!app.hasRequestDecorator(principalKey)) {
|
|
58
|
+
app.decorateRequest(principalKey, null);
|
|
59
|
+
}
|
|
60
|
+
if (!app.hasDecorator('relyperOidc')) {
|
|
61
|
+
app.decorate('relyperOidc', client);
|
|
62
|
+
}
|
|
63
|
+
function pathOf(request) {
|
|
64
|
+
const url = request.url ?? '/';
|
|
65
|
+
const index = url.indexOf('?');
|
|
66
|
+
return index === -1 ? url : url.slice(0, index);
|
|
67
|
+
}
|
|
68
|
+
const protect = options.protect ?? ((request) => !authRoutes.has(pathOf(request)));
|
|
69
|
+
function wantsRedirect(request) {
|
|
70
|
+
if (typeof options.redirectUnauthenticated === 'function')
|
|
71
|
+
return options.redirectUnauthenticated(request);
|
|
72
|
+
if (typeof options.redirectUnauthenticated === 'boolean')
|
|
73
|
+
return options.redirectUnauthenticated;
|
|
74
|
+
// A browser navigating to a page accepts HTML and is best served a redirect;
|
|
75
|
+
// an XHR from a single-page app wants a status code it can act on.
|
|
76
|
+
if (request.method !== 'GET')
|
|
77
|
+
return false;
|
|
78
|
+
const accept = String(request.headers.accept ?? '');
|
|
79
|
+
const fetchMode = String(request.headers['sec-fetch-mode'] ?? '');
|
|
80
|
+
if (fetchMode && fetchMode !== 'navigate')
|
|
81
|
+
return false;
|
|
82
|
+
return accept.includes('text/html');
|
|
83
|
+
}
|
|
84
|
+
async function reject(request, reply, failure) {
|
|
85
|
+
if (options.onAuthFailure)
|
|
86
|
+
await options.onAuthFailure(failure, request);
|
|
87
|
+
if (failure.status === 401 && wantsRedirect(request)) {
|
|
88
|
+
const target = loginPath + '?returnTo=' + encodeURIComponent(pathOf(request));
|
|
89
|
+
return reply.redirect(target, 302);
|
|
90
|
+
}
|
|
91
|
+
return reply.code(failure.status).send(errorBody(failure, request));
|
|
92
|
+
}
|
|
93
|
+
function setSessionCookie(reply, payload, ttl) {
|
|
94
|
+
return sessions.seal(payload, ttl).then((token) => {
|
|
95
|
+
reply.header('set-cookie', serializeCookie(sessionCookieName, token, { ...cookieBase, maxAgeSeconds: ttl }));
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
// ------------------------------------------------------------- login ---
|
|
99
|
+
app.get(loginPath, async (request, reply) => {
|
|
100
|
+
const query = (request.query ?? {});
|
|
101
|
+
const { url, transaction } = await client.createAuthorizationRequest({
|
|
102
|
+
returnTo: query.returnTo,
|
|
103
|
+
prompt: query.prompt
|
|
104
|
+
});
|
|
105
|
+
const sealed = await logins.seal(transaction, loginTtl);
|
|
106
|
+
reply.header('set-cookie', serializeCookie(loginCookieName, sealed, { ...cookieBase, maxAgeSeconds: loginTtl }));
|
|
107
|
+
// The IdP decides what to show here; caching that decision would be wrong.
|
|
108
|
+
reply.header('cache-control', 'no-store');
|
|
109
|
+
return reply.redirect(url, 302);
|
|
110
|
+
});
|
|
111
|
+
// ---------------------------------------------------------- callback ---
|
|
112
|
+
app.get(callbackPath, async (request, reply) => {
|
|
113
|
+
reply.header('cache-control', 'no-store');
|
|
114
|
+
const cookies = parseCookies(request.headers.cookie);
|
|
115
|
+
const transaction = await logins.open(cookies[loginCookieName]);
|
|
116
|
+
// The handshake cookie is single-use, whatever the outcome.
|
|
117
|
+
const cleared = clearCookie(loginCookieName, cookieBase);
|
|
118
|
+
if (!transaction) {
|
|
119
|
+
reply.header('set-cookie', cleared);
|
|
120
|
+
return failLogin(request, reply, new RelyperOidcError('missing_transaction', 'The login has expired. Please sign in again.', { status: 400 }));
|
|
121
|
+
}
|
|
122
|
+
let result;
|
|
123
|
+
try {
|
|
124
|
+
result = await client.completeLogin({
|
|
125
|
+
query: (request.query ?? {}),
|
|
126
|
+
transaction
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
reply.header('set-cookie', cleared);
|
|
131
|
+
return failLogin(request, reply, error);
|
|
132
|
+
}
|
|
133
|
+
const now = Math.floor(Date.now() / 1000);
|
|
134
|
+
const sessionId = createSessionId();
|
|
135
|
+
const payload = {
|
|
136
|
+
identity: result.identity,
|
|
137
|
+
authenticatedAt: now,
|
|
138
|
+
sessionId,
|
|
139
|
+
...(keepIdToken ? { idToken: result.tokens.idToken } : {})
|
|
140
|
+
};
|
|
141
|
+
if (options.onLogin)
|
|
142
|
+
await options.onLogin(result, request, sessionId);
|
|
143
|
+
const sealed = await sessions.seal(payload, sessionTtl);
|
|
144
|
+
reply.header('set-cookie', [
|
|
145
|
+
cleared,
|
|
146
|
+
serializeCookie(sessionCookieName, sealed, { ...cookieBase, maxAgeSeconds: sessionTtl })
|
|
147
|
+
]);
|
|
148
|
+
return reply.redirect(transaction.returnTo, 302);
|
|
149
|
+
});
|
|
150
|
+
async function failLogin(request, reply, error) {
|
|
151
|
+
const oidcError = error instanceof RelyperOidcError
|
|
152
|
+
? error
|
|
153
|
+
: new RelyperOidcError('idp_error', 'The login could not be completed.', {
|
|
154
|
+
cause: error,
|
|
155
|
+
detail: error instanceof Error ? error.message : undefined
|
|
156
|
+
});
|
|
157
|
+
const failure = {
|
|
158
|
+
status: oidcError.status,
|
|
159
|
+
code: oidcError.code,
|
|
160
|
+
message: oidcError.message,
|
|
161
|
+
detail: oidcError.detail
|
|
162
|
+
};
|
|
163
|
+
// Logged at warn with the detail, because a login that keeps failing is an
|
|
164
|
+
// operational problem someone has to be able to diagnose.
|
|
165
|
+
request.log.warn({ relyperOidc: failure.code, detail: failure.detail }, '@relyper/sp-auth: OIDC login failed');
|
|
166
|
+
if (options.onAuthFailure)
|
|
167
|
+
await options.onAuthFailure(failure, request);
|
|
168
|
+
if (options.loginErrorRedirect) {
|
|
169
|
+
const target = safeReturnTo(options.loginErrorRedirect)
|
|
170
|
+
+ (options.loginErrorRedirect.includes('?') ? '&' : '?')
|
|
171
|
+
+ 'error=' + encodeURIComponent(failure.code);
|
|
172
|
+
return reply.redirect(target, 302);
|
|
173
|
+
}
|
|
174
|
+
return reply.code(failure.status).send(errorBody(failure, request));
|
|
175
|
+
}
|
|
176
|
+
// ------------------------------------------------------------ logout ---
|
|
177
|
+
async function handleLogout(request, reply) {
|
|
178
|
+
const cookies = parseCookies(request.headers.cookie);
|
|
179
|
+
const session = await sessions.open(cookies[sessionCookieName]);
|
|
180
|
+
reply.header('cache-control', 'no-store');
|
|
181
|
+
reply.header('set-cookie', [
|
|
182
|
+
clearCookie(sessionCookieName, cookieBase),
|
|
183
|
+
clearCookie(loginCookieName, cookieBase)
|
|
184
|
+
]);
|
|
185
|
+
// Clearing the cookie only affects the browser that asked. An application
|
|
186
|
+
// that also wants a copied cookie to stop working records the id here.
|
|
187
|
+
if (session?.sessionId && options.onLogout) {
|
|
188
|
+
await options.onLogout(session.sessionId, session, request);
|
|
189
|
+
}
|
|
190
|
+
// If the IdP supports RP-initiated logout, end its session too -- otherwise
|
|
191
|
+
// the next login would silently sign the same user straight back in.
|
|
192
|
+
const endSession = await client.endSessionUrl({
|
|
193
|
+
idTokenHint: session?.idToken,
|
|
194
|
+
postLogoutRedirectUri: undefined
|
|
195
|
+
});
|
|
196
|
+
return reply.redirect(endSession ?? postLogoutRedirect, 302);
|
|
197
|
+
}
|
|
198
|
+
app.get(logoutPath, handleLogout);
|
|
199
|
+
app.post(logoutPath, handleLogout);
|
|
200
|
+
// ------------------------------------------------------------- guard ---
|
|
201
|
+
app.addHook(hook, async (request, reply) => {
|
|
202
|
+
if (!protect(request))
|
|
203
|
+
return;
|
|
204
|
+
const cookies = parseCookies(request.headers.cookie);
|
|
205
|
+
const session = await sessions.open(cookies[sessionCookieName]);
|
|
206
|
+
if (!session?.identity?.subject) {
|
|
207
|
+
return reject(request, reply, {
|
|
208
|
+
status: 401,
|
|
209
|
+
code: 'unauthenticated',
|
|
210
|
+
message: 'Authentication required.'
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
// An absolute cap on top of the rolling window, so a session cannot be kept
|
|
214
|
+
// alive indefinitely by activity alone.
|
|
215
|
+
const age = Math.floor(Date.now() / 1000) - (session.authenticatedAt ?? 0);
|
|
216
|
+
if (age > absoluteTtl) {
|
|
217
|
+
reply.header('set-cookie', clearCookie(sessionCookieName, cookieBase));
|
|
218
|
+
return reject(request, reply, {
|
|
219
|
+
status: 401,
|
|
220
|
+
code: 'session_expired',
|
|
221
|
+
message: 'Your session has expired. Please sign in again.'
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
if (options.isSessionRevoked && session.sessionId
|
|
225
|
+
&& await options.isSessionRevoked(session.sessionId, request)) {
|
|
226
|
+
reply.header('set-cookie', clearCookie(sessionCookieName, cookieBase));
|
|
227
|
+
return reject(request, reply, {
|
|
228
|
+
status: 401,
|
|
229
|
+
code: 'session_revoked',
|
|
230
|
+
message: 'Your session has ended. Please sign in again.'
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
// Re-checked on every request, not just at login: if the required role is
|
|
234
|
+
// tightened in configuration, sessions issued before that must not survive.
|
|
235
|
+
const requiredRoles = client.options.requiredRoles;
|
|
236
|
+
if (requiredRoles.length && !client.hasRole(session.identity, requiredRoles, client.options.roleMatch)) {
|
|
237
|
+
return reject(request, reply, {
|
|
238
|
+
status: 403,
|
|
239
|
+
code: 'missing_role',
|
|
240
|
+
message: 'Your account does not have access to this application.',
|
|
241
|
+
detail: 'presented roles: ' + (session.identity.roles.join(', ') || '(none)')
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
request.relyperSession = session;
|
|
245
|
+
request.relyperIdentity = session.identity;
|
|
246
|
+
const principal = options.resolveUser
|
|
247
|
+
? await options.resolveUser(session.identity, request)
|
|
248
|
+
: session.identity;
|
|
249
|
+
request[principalKey] = principal;
|
|
250
|
+
if (rolling)
|
|
251
|
+
await setSessionCookie(reply, session, sessionTtl);
|
|
252
|
+
});
|
|
253
|
+
if (options.meRoute) {
|
|
254
|
+
const meResponse = options.meResponse
|
|
255
|
+
?? ((request) => ({ user: request[principalKey] }));
|
|
256
|
+
app.get(options.meRoute, async (request) => meResponse(request));
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
export const relyperOidcAuth = fp(plugin, {
|
|
260
|
+
name: '@relyper/sp-auth/oidc-fastify',
|
|
261
|
+
fastify: '5.x'
|
|
262
|
+
});
|
|
263
|
+
export default relyperOidcAuth;
|
|
264
|
+
//# sourceMappingURL=oidc-fastify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oidc-fastify.js","sourceRoot":"","sources":["../src/oidc-fastify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEhC,OAAO,EAAE,uBAAuB,EAAE,YAAY,EAA0B,MAAM,kBAAkB,CAAC;AACjG,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,eAAe,EAGhB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,gBAAgB,EAAoD,MAAM,iBAAiB,CAAC;AA6HrG,MAAM,QAAQ,GAAG;IACf,iBAAiB,EAAE,iBAAiB;IACpC,eAAe,EAAE,eAAe;IAChC,UAAU,EAAE,GAAG;IACf,iBAAiB,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE;IAC9B,yBAAyB,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE;IACvC,eAAe,EAAE,EAAE,GAAG,EAAE;IACxB,SAAS,EAAE,aAAa;IACxB,YAAY,EAAE,gBAAgB;IAC9B,UAAU,EAAE,cAAc;IAC1B,kBAAkB,EAAE,GAAG;CACxB,CAAC;AAEF,KAAK,UAAU,MAAM,CAAC,GAAoB,EAAE,OAAkC;IAC5E,MAAM,MAAM,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAEvD,MAAM,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,IAAI,QAAQ,CAAC,iBAAiB,CAAC;IAClF,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,IAAI,QAAQ,CAAC,eAAe,CAAC;IAC5E,MAAM,UAAU,GAAG,OAAO,CAAC,iBAAiB,IAAI,QAAQ,CAAC,iBAAiB,CAAC;IAC3E,MAAM,WAAW,GAAG,OAAO,CAAC,yBAAyB,IAAI,QAAQ,CAAC,yBAAyB,CAAC;IAC5F,MAAM,QAAQ,GAAG,OAAO,CAAC,eAAe,IAAI,QAAQ,CAAC,eAAe,CAAC;IACrE,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,IAAI,IAAI,CAAC;IAC/C,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,KAAK,CAAC;IACjD,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,WAAW,CAAC;IACzD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,WAAW,CAAC;IAEzC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,QAAQ,CAAC,SAAS,CAAC;IAC1D,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,QAAQ,CAAC,YAAY,CAAC;IACnE,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,QAAQ,CAAC,UAAU,CAAC;IAC7D,MAAM,kBAAkB,GAAG,YAAY,CAAC,OAAO,CAAC,kBAAkB,IAAI,QAAQ,CAAC,kBAAkB,CAAC,CAAC;IACnG,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC;IAElE,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,aAAa,CAAC;IACtD,MAAM,UAAU,GAAkB;QAChC,IAAI,EAAE,OAAO,CAAC,UAAU,IAAI,QAAQ,CAAC,UAAU;QAC/C,MAAM,EAAE,OAAO,CAAC,YAAY;QAC5B,QAAQ,EAAE,IAAI;QACd,2EAA2E;QAC3E,gEAAgE;QAChE,QAAQ,EAAE,KAAK;QACf,MAAM,EAAE,OAAO,CAAC,YAAY,IAAI,CAAC,OAAO,KAAK,aAAa,IAAI,OAAO,KAAK,MAAM,CAAC;KAClF,CAAC;IAEF,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS;WAC9B,CAAC,CAAC,OAA+B,EAAE,EAAE,CAAC,CAAC;YACxC,KAAK,EAAE,OAAO,CAAC,OAAO;YACtB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,QAAQ,EAAE,SAAS;SACpB,CAAC,CAAC,CAAC;IAEN,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAChD,GAAG,CAAC,eAAe,CAAC,iBAAiB,EAAE,IAAkC,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC/C,GAAG,CAAC,eAAe,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;IAC9C,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,YAAY,CAAC,EAAE,CAAC;QAC3C,GAAG,CAAC,eAAe,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IAC1C,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,aAAa,CAAC,EAAE,CAAC;QACrC,GAAG,CAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IACtC,CAAC;IAED,SAAS,MAAM,CAAC,OAAuB;QACrC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC;QAC/B,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC/B,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC,OAAuB,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAEnG,SAAS,aAAa,CAAC,OAAuB;QAC5C,IAAI,OAAO,OAAO,CAAC,uBAAuB,KAAK,UAAU;YAAE,OAAO,OAAO,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC;QAC3G,IAAI,OAAO,OAAO,CAAC,uBAAuB,KAAK,SAAS;YAAE,OAAO,OAAO,CAAC,uBAAuB,CAAC;QACjG,6EAA6E;QAC7E,mEAAmE;QACnE,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK;YAAE,OAAO,KAAK,CAAC;QAC3C,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;QACpD,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC;QAClE,IAAI,SAAS,IAAI,SAAS,KAAK,UAAU;YAAE,OAAO,KAAK,CAAC;QACxD,OAAO,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,UAAU,MAAM,CACnB,OAAuB,EACvB,KAAmB,EACnB,OAA+B;QAE/B,IAAI,OAAO,CAAC,aAAa;YAAE,MAAM,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACzE,IAAI,OAAO,CAAC,MAAM,KAAK,GAAG,IAAI,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;YACrD,MAAM,MAAM,GAAG,SAAS,GAAG,YAAY,GAAG,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;YAC9E,OAAO,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACrC,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IACtE,CAAC;IAED,SAAS,gBAAgB,CAAC,KAAmB,EAAE,OAAuB,EAAE,GAAW;QACjF,OAAO,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;YAChD,KAAK,CAAC,MAAM,CACV,YAAY,EACZ,eAAe,CAAC,iBAAiB,EAAE,KAAK,EAAE,EAAE,GAAG,UAAU,EAAE,aAAa,EAAE,GAAG,EAAE,CAAC,CACjF,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED,0EAA0E;IAE1E,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,OAAuB,EAAE,KAAmB,EAAE,EAAE;QACxE,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAuC,CAAC;QAC1E,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,0BAA0B,CAAC;YACnE,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,MAAM,EAAE,KAAK,CAAC,MAAM;SACrB,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QACxD,KAAK,CAAC,MAAM,CACV,YAAY,EACZ,eAAe,CAAC,eAAe,EAAE,MAAM,EAAE,EAAE,GAAG,UAAU,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,CACrF,CAAC;QACF,2EAA2E;QAC3E,KAAK,CAAC,MAAM,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;QAC1C,OAAO,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,0EAA0E;IAE1E,GAAG,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,EAAE,OAAuB,EAAE,KAAmB,EAAE,EAAE;QAC3E,KAAK,CAAC,MAAM,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;QAE1C,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACrD,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC;QAChE,4DAA4D;QAC5D,MAAM,OAAO,GAAG,WAAW,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;QAEzD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,KAAK,CAAC,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YACpC,OAAO,SAAS,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,gBAAgB,CACnD,qBAAqB,EACrB,8CAA8C,EAC9C,EAAE,MAAM,EAAE,GAAG,EAAE,CAChB,CAAC,CAAC;QACL,CAAC;QAED,IAAI,MAA0B,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC;gBAClC,KAAK,EAAE,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAkD;gBAC7E,WAAW;aACZ,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,KAAK,CAAC,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YACpC,OAAO,SAAS,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAC1C,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAC1C,MAAM,SAAS,GAAG,eAAe,EAAE,CAAC;QACpC,MAAM,OAAO,GAAmB;YAC9B,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,eAAe,EAAE,GAAG;YACpB,SAAS;YACT,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC3D,CAAC;QAEF,IAAI,OAAO,CAAC,OAAO;YAAE,MAAM,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QAEvE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACxD,KAAK,CAAC,MAAM,CAAC,YAAY,EAAE;YACzB,OAAO;YACP,eAAe,CAAC,iBAAiB,EAAE,MAAM,EAAE,EAAE,GAAG,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC;SACzF,CAAC,CAAC;QAEH,OAAO,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,KAAK,UAAU,SAAS,CAAC,OAAuB,EAAE,KAAmB,EAAE,KAAc;QACnF,MAAM,SAAS,GAAG,KAAK,YAAY,gBAAgB;YACjD,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,IAAI,gBAAgB,CAAC,WAAW,EAAE,mCAAmC,EAAE;gBACrE,KAAK,EAAE,KAAK;gBACZ,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;aAC3D,CAAC,CAAC;QAEP,MAAM,OAAO,GAA2B;YACtC,MAAM,EAAE,SAAS,CAAC,MAAM;YACxB,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,OAAO,EAAE,SAAS,CAAC,OAAO;YAC1B,MAAM,EAAE,SAAS,CAAC,MAAM;SACzB,CAAC;QAEF,2EAA2E;QAC3E,0DAA0D;QAC1D,OAAO,CAAC,GAAG,CAAC,IAAI,CACd,EAAE,WAAW,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,EACrD,qCAAqC,CACtC,CAAC;QACF,IAAI,OAAO,CAAC,aAAa;YAAE,MAAM,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAEzE,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,kBAAkB,CAAC;kBACnD,CAAC,OAAO,CAAC,kBAAkB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;kBACtD,QAAQ,GAAG,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAChD,OAAO,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACrC,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IACtE,CAAC;IAED,0EAA0E;IAE1E,KAAK,UAAU,YAAY,CAAC,OAAuB,EAAE,KAAmB;QACtE,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAEhE,KAAK,CAAC,MAAM,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;QAC1C,KAAK,CAAC,MAAM,CAAC,YAAY,EAAE;YACzB,WAAW,CAAC,iBAAiB,EAAE,UAAU,CAAC;YAC1C,WAAW,CAAC,eAAe,EAAE,UAAU,CAAC;SACzC,CAAC,CAAC;QAEH,0EAA0E;QAC1E,uEAAuE;QACvE,IAAI,OAAO,EAAE,SAAS,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YAC3C,MAAM,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC9D,CAAC;QAED,4EAA4E;QAC5E,qEAAqE;QACrE,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC;YAC5C,WAAW,EAAE,OAAO,EAAE,OAAO;YAC7B,qBAAqB,EAAE,SAAS;SACjC,CAAC,CAAC;QACH,OAAO,KAAK,CAAC,QAAQ,CAAC,UAAU,IAAI,kBAAkB,EAAE,GAAG,CAAC,CAAC;IAC/D,CAAC;IAED,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IAClC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IAEnC,0EAA0E;IAE1E,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,OAAuB,EAAE,KAAmB,EAAE,EAAE;QACvE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;YAAE,OAAO;QAE9B,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAEhE,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;YAChC,OAAO,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE;gBAC5B,MAAM,EAAE,GAAG;gBACX,IAAI,EAAE,iBAAiB;gBACvB,OAAO,EAAE,0BAA0B;aACpC,CAAC,CAAC;QACL,CAAC;QAED,4EAA4E;QAC5E,wCAAwC;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,IAAI,CAAC,CAAC,CAAC;QAC3E,IAAI,GAAG,GAAG,WAAW,EAAE,CAAC;YACtB,KAAK,CAAC,MAAM,CAAC,YAAY,EAAE,WAAW,CAAC,iBAAiB,EAAE,UAAU,CAAC,CAAC,CAAC;YACvE,OAAO,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE;gBAC5B,MAAM,EAAE,GAAG;gBACX,IAAI,EAAE,iBAAiB;gBACvB,OAAO,EAAE,iDAAiD;aAC3D,CAAC,CAAC;QACL,CAAC;QAED,IAAI,OAAO,CAAC,gBAAgB,IAAI,OAAO,CAAC,SAAS;eAC5C,MAAM,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC;YAChE,KAAK,CAAC,MAAM,CAAC,YAAY,EAAE,WAAW,CAAC,iBAAiB,EAAE,UAAU,CAAC,CAAC,CAAC;YACvE,OAAO,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE;gBAC5B,MAAM,EAAE,GAAG;gBACX,IAAI,EAAE,iBAAiB;gBACvB,OAAO,EAAE,+CAA+C;aACzD,CAAC,CAAC;QACL,CAAC;QAED,0EAA0E;QAC1E,4EAA4E;QAC5E,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC;QACnD,IAAI,aAAa,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YACvG,OAAO,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE;gBAC5B,MAAM,EAAE,GAAG;gBACX,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,wDAAwD;gBACjE,MAAM,EAAE,mBAAmB,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC;aAC9E,CAAC,CAAC;QACL,CAAC;QAED,OAAO,CAAC,cAAc,GAAG,OAAO,CAAC;QACjC,OAAO,CAAC,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC;QAE3C,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW;YACnC,CAAC,CAAC,MAAM,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC;YACtD,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;QACpB,OAA8C,CAAC,YAAY,CAAC,GAAG,SAAS,CAAC;QAE1E,IAAI,OAAO;YAAE,MAAM,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU;eAChC,CAAC,CAAC,OAAuB,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAG,OAA8C,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9G,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,OAAuB,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;IACnF,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,EAAE,CAAC,MAAM,EAAE;IACxC,IAAI,EAAE,+BAA+B;IACrC,OAAO,EAAE,KAAK;CACf,CAAC,CAAC;AAEH,eAAe,eAAe,CAAC"}
|
package/dist/oidc.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OIDC entry point: the Relyper IdP as a real identity provider.
|
|
3
|
+
*
|
|
4
|
+
* The service provider is registered at the IdP as a confidential client and
|
|
5
|
+
* authenticates with its client secret, so no part of the trust chain depends on
|
|
6
|
+
* headers a proxy may or may not have set.
|
|
7
|
+
*/
|
|
8
|
+
export { createRelyperOidcClient, safeReturnTo, type AuthorizationRequestOptions, type RelyperOidcClient } from './oidc/client.js';
|
|
9
|
+
export { defaultClaimsToIdentity } from './oidc/claims.js';
|
|
10
|
+
export { createCodeVerifier, createNonce, createState, codeChallengeFor } from './oidc/pkce.js';
|
|
11
|
+
export { createDiscoveryLoader, discoveryUrl, type DiscoveryLoader, type DiscoveryLoaderOptions } from './oidc/discovery.js';
|
|
12
|
+
export { clearCookie, createLoginCodec, createSessionCodec, createSessionId, parseCookies, safeEqual, serializeCookie, type CookieOptions, type SealedCodec, type SessionPayload } from './oidc/session.js';
|
|
13
|
+
export { RelyperOidcError, type OidcDiscoveryDocument, type RelyperAuthorizationRequest, type RelyperLoginResult, type RelyperLoginTransaction, type RelyperOidcErrorCode, type RelyperOidcOptions, type RelyperTokenSet, type ResolvedRelyperOidcOptions, type TokenEndpointAuthMethod } from './oidc/types.js';
|
|
14
|
+
export type { RelyperIdentity } from './types.js';
|
|
15
|
+
//# sourceMappingURL=oidc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oidc.d.ts","sourceRoot":"","sources":["../src/oidc.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,uBAAuB,EACvB,YAAY,EACZ,KAAK,2BAA2B,EAChC,KAAK,iBAAiB,EACvB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAE3D,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,WAAW,EACX,gBAAgB,EACjB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,qBAAqB,EACrB,YAAY,EACZ,KAAK,eAAe,EACpB,KAAK,sBAAsB,EAC5B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,SAAS,EACT,eAAe,EACf,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,cAAc,EACpB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,gBAAgB,EAChB,KAAK,qBAAqB,EAC1B,KAAK,2BAA2B,EAChC,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,EAC5B,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACpB,KAAK,0BAA0B,EAC/B,KAAK,uBAAuB,EAC7B,MAAM,iBAAiB,CAAC;AAEzB,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/oidc.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OIDC entry point: the Relyper IdP as a real identity provider.
|
|
3
|
+
*
|
|
4
|
+
* The service provider is registered at the IdP as a confidential client and
|
|
5
|
+
* authenticates with its client secret, so no part of the trust chain depends on
|
|
6
|
+
* headers a proxy may or may not have set.
|
|
7
|
+
*/
|
|
8
|
+
export { createRelyperOidcClient, safeReturnTo } from './oidc/client.js';
|
|
9
|
+
export { defaultClaimsToIdentity } from './oidc/claims.js';
|
|
10
|
+
export { createCodeVerifier, createNonce, createState, codeChallengeFor } from './oidc/pkce.js';
|
|
11
|
+
export { createDiscoveryLoader, discoveryUrl } from './oidc/discovery.js';
|
|
12
|
+
export { clearCookie, createLoginCodec, createSessionCodec, createSessionId, parseCookies, safeEqual, serializeCookie } from './oidc/session.js';
|
|
13
|
+
export { RelyperOidcError } from './oidc/types.js';
|
|
14
|
+
//# sourceMappingURL=oidc.js.map
|
package/dist/oidc.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oidc.js","sourceRoot":"","sources":["../src/oidc.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,uBAAuB,EACvB,YAAY,EAGb,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAE3D,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,WAAW,EACX,gBAAgB,EACjB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,qBAAqB,EACrB,YAAY,EAGb,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,SAAS,EACT,eAAe,EAIhB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,gBAAgB,EAUjB,MAAM,iBAAiB,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,10 +1,22 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/**
|
|
2
|
+
* Identity of a user as this service provider sees it.
|
|
3
|
+
*
|
|
4
|
+
* Produced either by the OIDC login (verified ID token) or, in a gateway
|
|
5
|
+
* deployment, by the trusted request headers. The tenant fields are only filled
|
|
6
|
+
* in by the OIDC path, because a gateway header set does not carry them.
|
|
7
|
+
*/
|
|
2
8
|
export type RelyperIdentity = {
|
|
3
9
|
/** Stable, unique identifier of the user at the IdP. Never the local database ID. */
|
|
4
10
|
subject: string;
|
|
5
11
|
email: string;
|
|
6
12
|
displayName: string;
|
|
7
13
|
roles: string[];
|
|
14
|
+
/** Tenant the user is acting in, or null if the IdP sent none. */
|
|
15
|
+
tenantId?: string | null;
|
|
16
|
+
/** Every tenant the user belongs to; the first one is {@link tenantId}. */
|
|
17
|
+
tenantIds?: string[];
|
|
18
|
+
tenantName?: string | null;
|
|
19
|
+
teams?: string[];
|
|
8
20
|
};
|
|
9
21
|
export type RelyperAuthFailureCode = 'missing_subject' | 'missing_email' | 'missing_role';
|
|
10
22
|
export type RelyperAuthFailure = {
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@relyper/sp-auth",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.4.0",
|
|
4
|
+
"description": "Relyper identity for a service provider: an OIDC client (Authorization Code + PKCE) with a Fastify adapter and session cookies, plus the header-based variant for gateway deployments.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Jonas Esser",
|
|
7
7
|
"type": "module",
|
|
@@ -16,7 +16,14 @@
|
|
|
16
16
|
"authorization",
|
|
17
17
|
"service-provider",
|
|
18
18
|
"fastify",
|
|
19
|
-
"rbac"
|
|
19
|
+
"rbac",
|
|
20
|
+
"oidc",
|
|
21
|
+
"openid-connect",
|
|
22
|
+
"oauth2",
|
|
23
|
+
"pkce",
|
|
24
|
+
"sso",
|
|
25
|
+
"coins",
|
|
26
|
+
"billing"
|
|
20
27
|
],
|
|
21
28
|
"repository": {
|
|
22
29
|
"type": "git",
|
|
@@ -33,6 +40,14 @@
|
|
|
33
40
|
"types": "./dist/index.d.ts",
|
|
34
41
|
"import": "./dist/index.js"
|
|
35
42
|
},
|
|
43
|
+
"./oidc": {
|
|
44
|
+
"types": "./dist/oidc.d.ts",
|
|
45
|
+
"import": "./dist/oidc.js"
|
|
46
|
+
},
|
|
47
|
+
"./oidc/fastify": {
|
|
48
|
+
"types": "./dist/oidc-fastify.d.ts",
|
|
49
|
+
"import": "./dist/oidc-fastify.js"
|
|
50
|
+
},
|
|
36
51
|
"./fastify": {
|
|
37
52
|
"types": "./dist/fastify.d.ts",
|
|
38
53
|
"import": "./dist/fastify.js"
|
|
@@ -41,7 +56,11 @@
|
|
|
41
56
|
"types": "./dist/client.d.ts",
|
|
42
57
|
"import": "./dist/client.js"
|
|
43
58
|
},
|
|
44
|
-
"./package.json": "./package.json"
|
|
59
|
+
"./package.json": "./package.json",
|
|
60
|
+
"./coins": {
|
|
61
|
+
"types": "./dist/coins.d.ts",
|
|
62
|
+
"import": "./dist/coins.js"
|
|
63
|
+
}
|
|
45
64
|
},
|
|
46
65
|
"files": [
|
|
47
66
|
"dist",
|
|
@@ -55,7 +74,8 @@
|
|
|
55
74
|
"prepublishOnly": "npm run build"
|
|
56
75
|
},
|
|
57
76
|
"dependencies": {
|
|
58
|
-
"fastify-plugin": "^5.1.0"
|
|
77
|
+
"fastify-plugin": "^5.1.0",
|
|
78
|
+
"jose": "^6.2.10"
|
|
59
79
|
},
|
|
60
80
|
"peerDependencies": {
|
|
61
81
|
"fastify": ">=5"
|