@zauru-sdk/utils 6.14.0 → 6.15.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/dist/esm/index.js +1 -0
- package/dist/esm/zauru/auth.loaders.js +141 -0
- package/dist/index.d.ts +1 -0
- package/dist/zauru/auth.loaders.d.ts +40 -0
- package/package.json +2 -2
package/dist/esm/index.js
CHANGED
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { redirect } from "@remix-run/node";
|
|
2
|
+
import { config } from "@zauru-sdk/config";
|
|
3
|
+
import { commitSession, destroySession, getRefreshSession, getSession, loginWebApp, } from "@zauru-sdk/services";
|
|
4
|
+
const loginErrorPayload = (description, title) => ({
|
|
5
|
+
error: true,
|
|
6
|
+
type: "error",
|
|
7
|
+
title: title ??
|
|
8
|
+
"Ocurrió un error al cargar la información de inicio de sesión (Carga de webapp)",
|
|
9
|
+
description,
|
|
10
|
+
});
|
|
11
|
+
const isDenied = (result) => result === false;
|
|
12
|
+
const authorizeUrl = (request) => {
|
|
13
|
+
const url = new URL(request.url);
|
|
14
|
+
const hostname = `${url.port ? "http://" : "https://"}${url.hostname}${url.port ? `:${url.port}` : ""}`;
|
|
15
|
+
return `${config.oauthBaseURL}/dialog/authorize?client_id=${config.oauthClientID}&response_type=code&redirect_uri=${hostname}/login`;
|
|
16
|
+
};
|
|
17
|
+
export function createLoginLoader() {
|
|
18
|
+
return async () => Response.json({});
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Remix action for `/login`: OAuth authorize, `loginWebApp`, cookie commit.
|
|
22
|
+
* `afterLogin` runs before `commitSession`. `requireAccess` can deny after
|
|
23
|
+
* a successful OAuth exchange or when a session already has `code`.
|
|
24
|
+
*/
|
|
25
|
+
export function createLoginAction(extras) {
|
|
26
|
+
return async ({ request }) => {
|
|
27
|
+
const formData = await request.formData();
|
|
28
|
+
const { action, ...values } = Object.fromEntries(formData);
|
|
29
|
+
if (action === "redirect") {
|
|
30
|
+
const cookie = values?.cookie?.toString() ?? "";
|
|
31
|
+
return redirect("/home", {
|
|
32
|
+
headers: {
|
|
33
|
+
"Set-Cookie": cookie,
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
const codeValue = new URL(request.url).searchParams.get("code") ?? "";
|
|
38
|
+
const cookie = request.headers.get("Cookie") ?? "";
|
|
39
|
+
const session = await getSession(cookie);
|
|
40
|
+
if (!session.has("code") && !codeValue) {
|
|
41
|
+
return redirect(authorizeUrl(request));
|
|
42
|
+
}
|
|
43
|
+
if (session.has("code")) {
|
|
44
|
+
if (isDenied(extras?.requireAccess?.(session))) {
|
|
45
|
+
return redirect("/");
|
|
46
|
+
}
|
|
47
|
+
return redirect("/home");
|
|
48
|
+
}
|
|
49
|
+
const loginResponse = await loginWebApp(session, codeValue, cookie);
|
|
50
|
+
if (loginResponse.error || !loginResponse.data) {
|
|
51
|
+
return Response.json(loginErrorPayload(loginResponse.userMsg?.toString() ?? ""));
|
|
52
|
+
}
|
|
53
|
+
if (isDenied(extras?.requireAccess?.(session))) {
|
|
54
|
+
return Response.json(loginErrorPayload("No tienes permiso para acceder a esta aplicación. Si crees que esto es un error, contacta al administrador.", "Acceso denegado"));
|
|
55
|
+
}
|
|
56
|
+
if (extras?.afterLogin) {
|
|
57
|
+
await extras.afterLogin({
|
|
58
|
+
request,
|
|
59
|
+
session,
|
|
60
|
+
headers: loginResponse.data.headers,
|
|
61
|
+
loginData: loginResponse.data,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
const expires = new Date();
|
|
65
|
+
expires.setSeconds(expires.getSeconds() + Number(config.expirationDurationInSeconds));
|
|
66
|
+
return Response.json({
|
|
67
|
+
...loginResponse.data,
|
|
68
|
+
cookie: await commitSession(session, { expires }),
|
|
69
|
+
});
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Guard for `/home` and `/reload-catalogs`: no `username` → `/`.
|
|
74
|
+
*/
|
|
75
|
+
export function createSessionGuardLoader(extras) {
|
|
76
|
+
return async ({ request }) => {
|
|
77
|
+
const session = await getSession(request.headers.get("Cookie"));
|
|
78
|
+
if (!session.has("username")) {
|
|
79
|
+
return redirect("/");
|
|
80
|
+
}
|
|
81
|
+
if (isDenied(extras?.requireAccess?.(session))) {
|
|
82
|
+
return redirect("/");
|
|
83
|
+
}
|
|
84
|
+
return Response.json({});
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
export function createLogoutLoader(extras) {
|
|
88
|
+
return createSessionGuardLoader(extras);
|
|
89
|
+
}
|
|
90
|
+
export function createLogoutAction() {
|
|
91
|
+
return async ({ request }) => {
|
|
92
|
+
const session = await getSession(request.headers.get("Cookie"));
|
|
93
|
+
return redirect(`${config.oauthBaseURL}/logout`, {
|
|
94
|
+
headers: {
|
|
95
|
+
"Set-Cookie": await destroySession(session),
|
|
96
|
+
},
|
|
97
|
+
});
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* `/` welcome: existing session (and optional access) → `/home`.
|
|
102
|
+
*/
|
|
103
|
+
export function createIndexLoader(extras) {
|
|
104
|
+
return async ({ request }) => {
|
|
105
|
+
const session = await getSession(request.headers.get("Cookie"));
|
|
106
|
+
if (session.has("username")) {
|
|
107
|
+
if (isDenied(extras?.requireAccess?.(session))) {
|
|
108
|
+
return Response.json({});
|
|
109
|
+
}
|
|
110
|
+
return redirect("/home");
|
|
111
|
+
}
|
|
112
|
+
return Response.json({});
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* `/reload-catalogs`: session guard plus optional cookie refresh.
|
|
117
|
+
*/
|
|
118
|
+
export function createReloadCatalogsLoader(extras) {
|
|
119
|
+
return async ({ request }) => {
|
|
120
|
+
const session = await getSession(request.headers.get("Cookie"));
|
|
121
|
+
if (!session.has("username")) {
|
|
122
|
+
return redirect("/");
|
|
123
|
+
}
|
|
124
|
+
if (isDenied(extras?.requireAccess?.(session))) {
|
|
125
|
+
return redirect("/");
|
|
126
|
+
}
|
|
127
|
+
try {
|
|
128
|
+
const refreshSession = await getRefreshSession(request);
|
|
129
|
+
return Response.json({}, refreshSession
|
|
130
|
+
? {
|
|
131
|
+
headers: {
|
|
132
|
+
"Set-Cookie": refreshSession,
|
|
133
|
+
},
|
|
134
|
+
}
|
|
135
|
+
: {});
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
return Response.json({});
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
}
|
package/dist/index.d.ts
CHANGED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { ActionFunction, LoaderFunction } from "@remix-run/node";
|
|
2
|
+
import { getSession, loginWebApp } from "@zauru-sdk/services";
|
|
3
|
+
export type AuthSession = Awaited<ReturnType<typeof getSession>>;
|
|
4
|
+
export type LoginWebAppData = NonNullable<Awaited<ReturnType<typeof loginWebApp>>["data"]>;
|
|
5
|
+
export type AuthAccessExtras = {
|
|
6
|
+
/**
|
|
7
|
+
* Return `false` to deny. Throw `redirect(...)` to send the user elsewhere.
|
|
8
|
+
* Any other return (including `void`) allows access.
|
|
9
|
+
*/
|
|
10
|
+
requireAccess?: (session: AuthSession) => boolean | void;
|
|
11
|
+
};
|
|
12
|
+
export type LoginActionExtras = AuthAccessExtras & {
|
|
13
|
+
afterLogin?: (ctx: {
|
|
14
|
+
request: Request;
|
|
15
|
+
session: AuthSession;
|
|
16
|
+
headers: LoginWebAppData["headers"];
|
|
17
|
+
loginData: LoginWebAppData;
|
|
18
|
+
}) => Promise<void>;
|
|
19
|
+
};
|
|
20
|
+
export declare function createLoginLoader(): LoaderFunction;
|
|
21
|
+
/**
|
|
22
|
+
* Remix action for `/login`: OAuth authorize, `loginWebApp`, cookie commit.
|
|
23
|
+
* `afterLogin` runs before `commitSession`. `requireAccess` can deny after
|
|
24
|
+
* a successful OAuth exchange or when a session already has `code`.
|
|
25
|
+
*/
|
|
26
|
+
export declare function createLoginAction(extras?: LoginActionExtras): ActionFunction;
|
|
27
|
+
/**
|
|
28
|
+
* Guard for `/home` and `/reload-catalogs`: no `username` → `/`.
|
|
29
|
+
*/
|
|
30
|
+
export declare function createSessionGuardLoader(extras?: AuthAccessExtras): LoaderFunction;
|
|
31
|
+
export declare function createLogoutLoader(extras?: AuthAccessExtras): LoaderFunction;
|
|
32
|
+
export declare function createLogoutAction(): ActionFunction;
|
|
33
|
+
/**
|
|
34
|
+
* `/` welcome: existing session (and optional access) → `/home`.
|
|
35
|
+
*/
|
|
36
|
+
export declare function createIndexLoader(extras?: AuthAccessExtras): LoaderFunction;
|
|
37
|
+
/**
|
|
38
|
+
* `/reload-catalogs`: session guard plus optional cookie refresh.
|
|
39
|
+
*/
|
|
40
|
+
export declare function createReloadCatalogsLoader(extras?: AuthAccessExtras): LoaderFunction;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zauru-sdk/utils",
|
|
3
|
-
"version": "6.
|
|
3
|
+
"version": "6.15.0",
|
|
4
4
|
"description": "Utilidades, parseo de request y demás para desarrollo de webapps de Zauru",
|
|
5
5
|
"main": "./dist/esm/index.js",
|
|
6
6
|
"module": "./dist/esm/index.js",
|
|
@@ -37,5 +37,5 @@
|
|
|
37
37
|
"@zauru-sdk/types": "^6.16.0",
|
|
38
38
|
"moment": "^2.30.1"
|
|
39
39
|
},
|
|
40
|
-
"gitHead": "
|
|
40
|
+
"gitHead": "7ccc6b0a3d1c426f8b62579a64a0bb0be73d2fcd"
|
|
41
41
|
}
|