@stacksjs/auth 0.74.59 → 0.74.60
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/dist/browser-session.d.ts +3 -0
- package/dist/browser-session.js +1 -1
- package/package.json +13 -13
|
@@ -10,6 +10,8 @@ export declare function resolveBrowserSessionPolicy(remember: unknown, auth?: Br
|
|
|
10
10
|
* This prevents a cookie from outliving or prematurely hiding its credential.
|
|
11
11
|
*/
|
|
12
12
|
export declare function authCookieForBrowserSession(token: string, expiresIn: number | undefined): string;
|
|
13
|
+
/** Resolve a configured same-origin logout target for HTML navigation only. */
|
|
14
|
+
export declare function browserSessionLogoutRedirect(request: HeaderRequest | undefined, auth?: BrowserSessionPolicyConfig): string | undefined;
|
|
13
15
|
export declare interface ResolvedBrowserSessionPolicy {
|
|
14
16
|
remembered: boolean
|
|
15
17
|
lifetimeMs: number
|
|
@@ -17,3 +19,4 @@ export declare interface ResolvedBrowserSessionPolicy {
|
|
|
17
19
|
withRefreshToken: boolean
|
|
18
20
|
}
|
|
19
21
|
declare type BrowserSessionPolicyConfig = Pick<Partial<AuthOptions>, 'tokenExpiry' | 'browserSession'>;
|
|
22
|
+
declare type HeaderRequest = { headers?: { get: (name: string) => string | null } }
|
package/dist/browser-session.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{config}from"@stacksjs/config";import{authCookie}from"./cookie";const REMEMBERED_INPUTS=new Set(["1","true","on","yes"]);export function browserSessionRemembered(value){if(value===!0||value===1)return!0;if(typeof value!=="string")return!1;return REMEMBERED_INPUTS.has(value.trim().toLowerCase())}function validLifetime(value,setting){const milliseconds=Number(value);if(!Number.isFinite(milliseconds)||milliseconds<=0)throw TypeError(`[auth] config.auth.${setting} must be a positive lifetime in milliseconds.`);return milliseconds}export function resolveBrowserSessionPolicy(remember,auth=config.auth){const baselineLifetime=validLifetime(auth.browserSession?.baselineLifetime??auth.tokenExpiry??3600000,auth.browserSession?.baselineLifetime===void 0?"tokenExpiry":"browserSession.baselineLifetime"),rememberedLifetime=validLifetime(auth.browserSession?.rememberedLifetime??baselineLifetime,"browserSession.rememberedLifetime"),withRefreshToken=auth.browserSession?.withRefreshToken??!0;if(typeof withRefreshToken!=="boolean")throw TypeError("[auth] config.auth.browserSession.withRefreshToken must be a boolean.");const remembered=browserSessionRemembered(remember),lifetimeMs=remembered?rememberedLifetime:baselineLifetime;return{remembered,lifetimeMs,expiresInMinutes:lifetimeMs/60000,withRefreshToken}}export function authCookieForBrowserSession(token,expiresIn){const seconds=Number(expiresIn);if(!Number.isInteger(seconds)||seconds<=0)throw TypeError("[auth] The issued token lifetime must be a positive integer number of seconds.");return authCookie(token,{maxAge:seconds})}
|
|
1
|
+
import{config}from"@stacksjs/config";import{authCookie}from"./cookie";const REMEMBERED_INPUTS=new Set(["1","true","on","yes"]);export function browserSessionRemembered(value){if(value===!0||value===1)return!0;if(typeof value!=="string")return!1;return REMEMBERED_INPUTS.has(value.trim().toLowerCase())}function validLifetime(value,setting){const milliseconds=Number(value);if(!Number.isFinite(milliseconds)||milliseconds<=0)throw TypeError(`[auth] config.auth.${setting} must be a positive lifetime in milliseconds.`);return milliseconds}export function resolveBrowserSessionPolicy(remember,auth=config.auth){const baselineLifetime=validLifetime(auth.browserSession?.baselineLifetime??auth.tokenExpiry??3600000,auth.browserSession?.baselineLifetime===void 0?"tokenExpiry":"browserSession.baselineLifetime"),rememberedLifetime=validLifetime(auth.browserSession?.rememberedLifetime??baselineLifetime,"browserSession.rememberedLifetime"),withRefreshToken=auth.browserSession?.withRefreshToken??!0;if(typeof withRefreshToken!=="boolean")throw TypeError("[auth] config.auth.browserSession.withRefreshToken must be a boolean.");const remembered=browserSessionRemembered(remember),lifetimeMs=remembered?rememberedLifetime:baselineLifetime;return{remembered,lifetimeMs,expiresInMinutes:lifetimeMs/60000,withRefreshToken}}export function authCookieForBrowserSession(token,expiresIn){const seconds=Number(expiresIn);if(!Number.isInteger(seconds)||seconds<=0)throw TypeError("[auth] The issued token lifetime must be a positive integer number of seconds.");return authCookie(token,{maxAge:seconds})}function mediaPreference(accept,mediaType){const requested=mediaType.toLowerCase(),requestedType=requested.slice(0,requested.indexOf("/"));let best={order:Number.POSITIVE_INFINITY,quality:0,specificity:-1};for(const[order,raw]of accept.split(",").entries()){const[rawType="",...parameters]=raw.trim().toLowerCase().split(";"),type=rawType.trim();if(type!==requested&&type!==`${requestedType}/*`&&type!=="*/*")continue;const qualityParameter=parameters.find((parameter)=>parameter.trim().startsWith("q=")),quality=qualityParameter===void 0?1:Number(qualityParameter.slice(qualityParameter.indexOf("=")+1).trim()),normalizedQuality=Number.isFinite(quality)&&quality>=0&&quality<=1?quality:0,specificity=type===requested?2:type===`${requestedType}/*`?1:0;if(specificity>best.specificity||specificity===best.specificity&&normalizedQuality>best.quality)best={order,quality:normalizedQuality,specificity}}return best}function prefersHtml(accept){if(!accept)return!1;const html=mediaPreference(accept,"text/html"),json=mediaPreference(accept,"application/json");return html.quality>0&&(html.quality>json.quality||html.quality===json.quality&&html.order<json.order)}export function browserSessionLogoutRedirect(request,auth=config.auth){if(!prefersHtml(request?.headers?.get("accept")??null))return;const configured=auth.browserSession?.logoutRedirect;if(typeof configured!=="string")return;const candidate=configured.trim();if(!candidate.startsWith("/")||candidate.startsWith("//"))return;try{const base=new URL("https://stacks.invalid"),resolved=new URL(candidate,base);if(resolved.origin!==base.origin)return;const target=`${resolved.pathname}${resolved.search}${resolved.hash}`;if(!target.startsWith("/")||target.startsWith("//"))return;return target}catch{return}}
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@stacksjs/auth",
|
|
3
3
|
"type": "module",
|
|
4
4
|
"sideEffects": false,
|
|
5
|
-
"version": "0.74.
|
|
5
|
+
"version": "0.74.60",
|
|
6
6
|
"description": "A more simplistic way to authenticate.",
|
|
7
7
|
"author": "Chris Breuer",
|
|
8
8
|
"contributors": [
|
|
@@ -58,18 +58,18 @@
|
|
|
58
58
|
},
|
|
59
59
|
"dependencies": {
|
|
60
60
|
"@stacksjs/bun-router": "^0.1.18",
|
|
61
|
-
"@stacksjs/cache": "0.74.
|
|
62
|
-
"@stacksjs/config": "0.74.
|
|
63
|
-
"@stacksjs/database": "0.74.
|
|
64
|
-
"@stacksjs/email": "0.74.
|
|
65
|
-
"@stacksjs/env": "0.74.
|
|
66
|
-
"@stacksjs/error-handling": "0.74.
|
|
67
|
-
"@stacksjs/logging": "0.74.
|
|
68
|
-
"@stacksjs/orm": "0.74.
|
|
69
|
-
"@stacksjs/path": "0.74.
|
|
70
|
-
"@stacksjs/router": "0.74.
|
|
71
|
-
"@stacksjs/security": "0.74.
|
|
72
|
-
"@stacksjs/storage": "0.74.
|
|
61
|
+
"@stacksjs/cache": "0.74.60",
|
|
62
|
+
"@stacksjs/config": "0.74.60",
|
|
63
|
+
"@stacksjs/database": "0.74.60",
|
|
64
|
+
"@stacksjs/email": "0.74.60",
|
|
65
|
+
"@stacksjs/env": "0.74.60",
|
|
66
|
+
"@stacksjs/error-handling": "0.74.60",
|
|
67
|
+
"@stacksjs/logging": "0.74.60",
|
|
68
|
+
"@stacksjs/orm": "0.74.60",
|
|
69
|
+
"@stacksjs/path": "0.74.60",
|
|
70
|
+
"@stacksjs/router": "0.74.60",
|
|
71
|
+
"@stacksjs/security": "0.74.60",
|
|
72
|
+
"@stacksjs/storage": "0.74.60",
|
|
73
73
|
"@stacksjs/ts-auth": "^0.4.4",
|
|
74
74
|
"ts-qr-codes": "^0.1.8"
|
|
75
75
|
},
|