Aviso:

Para brindarle información de soporte completa de manera más rápida, el contenido de esta página ha sido traducido al español mediante traducción automática. Para consultar la información de soporte más precisa, consulte la versión en inglés de este contenido.

Configurar el client

Configuremos el componente client.

El directorio client contiene:

  • El archivo index.html que contiene el código HTML para la aplicación frontend
  • El archivo main.css que contiene el código CSS para la aplicación frontend
  • El archivo main.js que contiene el código JavaScript
  • El archivo de configuración client-package.json

Codificaremos index.html y main.js. También realizaremos un cambio en el client-package.json para asegurar que la página de inicio de la aplicación sea la página autenticada.

Analizaremos el código al final de esta sección.

Nota: Por favor, revisa el código proporcionado en esta sección para asegurarte de que lo comprendes completamente.

Copia el código a continuación y pégalo en los archivos respectivos ubicados en el directorio client/ de tu proyecto usando un IDE y guarda los archivos.

index.html
copy

<!DOCTYPE html> <html> <head> <title>Profile Information</title> <link rel=“stylesheet” href=“https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" > <script src=“main.js”></script> <script src=“https://static.zohocdn.com/catalyst/sdk/js/4.0.0/catalystWebSDK.js"> </script> <script src=”/__catalyst/sdk/init.js”></script> <style> .card { max-width: 500px; margin: auto; text-align: center; font-family: arial; background-color: #a5a4a4; }

.title { font-size: 23px; color: black; }

button { border: none; outline: 0; display: inline-block; padding: 8px; color: white; background-color: #000; text-align: center; cursor: pointer; width: 50%; font-size: 18px; border-radius: 8px; }

a { text-decoration: none; font-size: 22px; color: black; }

button:hover, a:hover { opacity: 0.7; }

body{ background-color:#a5a4a4; font-size: 20px; visibility: hidden; } p{ font-family: ‘Trebuchet MS’, ‘Lucida Sans Unicode’, ‘Lucida Grande’, ‘Lucida Sans’, Arial, sans-serif; font-size: 10px; font-weight: bold; } </style> </head> <body onload=“showProfile()"> <h1 style=“text-align:center”>User Profile Information</h1> <div class=“card”> <img width=“200px” height=“450px” src=“https://cdn2.iconfinder.com/data/icons/user-management/512/profile_settings-512.png" alt=“John” style=“width:80px;height: 80px;” > <p class=“title” id=“fname”></p> <p class=“title” id=“lname”></p> <p class=“title"id=“mailid” ></p> <p class=“title"id=“tzone” ></p> <p class=“title"id=“ctime” ></p> <p><button onclick=“logout()">Logout</button></p> </div> </body> </html>

View more
main.js
copy

function showProfile() { debugger; //El método catalyst.auth.isUserAuthenticated() permite solo a los usuarios autenticados, es decir, los usuarios que han iniciado sesión, acceder a las páginas //Puedes cargar este método en el body de tu página para permitir que solo los usuarios autenticados accedan a una página específica catalyst.auth.isUserAuthenticated().then(result => {

    //Si el usuario ha iniciado sesión, estos contenidos de la página se mostrarán al usuario
    document.body.style.visibility = "visible";
    const first_name = "First Name: " + result.content.first_name;
    document.getElementById("fname").innerHTML = first_name;
    const last_name = "Last Name: " + result.content.last_name;
    document.getElementById("lname").innerHTML = last_name;
    const mailid = "Email Address: " + result.content.email_id;
    document.getElementById("mailid").innerHTML = mailid;
    const tzone = "Time Zone: " + result.content.time_zone;
    document.getElementById("tzone").innerHTML = tzone;
    const created_time = " Joined On: " + result.content.created_time;
    document.getElementById("ctime").innerHTML = created_time;
}).catch(err => {
    //Si el usuario no ha iniciado sesión, esto se mostrará y será redirigido a la página de inicio de sesión
    document.body.style.visibility = "visible";
    document.body.innerHTML = 'You are not logged in. Please log in to continue. Redirecting you to the login page..';
    setTimeout(function () {
       window.location.href = "/__catalyst/auth/login";
    }, 5000);
});

}

function logout() { //El método signOut se usa para cerrar la sesión del usuario en la aplicación const redirectURL = location.protocol +"//"+ location.hostname + “/__catalyst/auth/login”; catalyst.auth.signOut(redirectURL); }

View more
client-package.json
copy
{
    "name" : "ZylkerTechnologies",
    "version" : "0.0.1",
    "homepage" : "/__catalyst/auth/login", 
    "login_redirect" : "index.html"
}
Nota: La URL de la página de inicio se puede copiar del Access URL generado por Catalyst en la sección Authentication Types de la consola.

El directorio client ahora está configurado.

Repasemos cómo funcionan la función y el código del client:

  • El usuario final primero verá la página de inicio de sesión que configuraste y estilizaste en la consola.
  • Para crear una cuenta, hará clic en la opción Sign Up y será dirigido a la página Sign Up.
Nota: Los usuarios finales pueden registrarse en tu aplicación usando sus Social Logins o usar el método convencional de registro en la aplicación usando su dirección de correo electrónico.
  • Una vez que se ingresa la información y hacen clic en Sign Up, o si intentan registrarse usando un Social Login de su preferencia, sus detalles se proporcionarán como entrada JSON a la función de Custom User Validation (authorization_portal_function/CustomUserValidationFunc.java).

  • La función solo autenticará a los usuarios si se cumple la condición que has codificado. Para este tutorial, los usuarios solo serán autenticados si se registraron en la aplicación usando una dirección de correo electrónico registrada en Zylker.

  • Tras una autenticación exitosa, se enviará un correo electrónico de Email Verification a la cuenta que usaron para registrarse en la aplicación.

Nota: Dado que estamos usando Hosted Login, un tipo de autenticación nativa de Catalyst, no se requiere lógica adicional para activar los correos electrónicos correspondientes. Catalyst lo gestionará automáticamente.
  • Una vez que el usuario verifica su dirección de correo electrónico haciendo clic en el enlace proporcionado en el correo, quedará registrado en la aplicación. Sus detalles se pueden ver en la sección User Management del componente Authentication.

  • El usuario final ahora puede iniciar sesión en la aplicación usando sus credenciales autenticadas.

  • El usuario final también puede restablecer su contraseña haciendo clic en la opción Forgot Password. En este caso, se enviará el correo electrónico de Password Reset a su correo registrado. Siguiendo los pasos mencionados en el correo, pueden restablecer fácilmente sus credenciales.

Configuremos el componente client.

El directorio client de la aplicación web React contiene los siguientes archivos:

  • El directorio raíz del client contiene un archivo client-package.json, que es un archivo de configuración que define el nombre, versión, página de inicio predeterminada y página de redirección del componente client.
  • El directorio client zylkertechnologies contiene dos subcarpetas, según la estructura de proyecto predeterminada de una aplicación React:
    • La carpeta public se usa generalmente para contener archivos que pueden ser accedidos abiertamente por los navegadores mediante URLs públicas, como archivos de íconos de la aplicación web, el archivo index.html y el archivo 404.html.
    • La carpeta src contiene los archivos fuente de la aplicación que se incluirán en la carpeta de compilación cuando compilemos la aplicación React.
    • El directorio client también contiene el archivo de dependencias package.json y un archivo oculto .gitignore.
  • Los archivos presentes en la carpeta public incluyen:
    • Archivos nativos de React como Tests.js, index.js, reportWebVitals.js, logo.svg y App.test.js.
    • index.html - Contiene el SDK web de Catalyst que te permite acceder a los componentes de Catalyst.
    • Crearemos un archivo adicional 404.html que contendrá los elementos de manejo de errores.
  • Los archivos presentes en la carpeta src incluyen:
    • Archivos nativos de React como setupTests.js, reportWebVitals.js, logo.svg y App.test.js.
    • App.js - Contiene las rutas hash de tu aplicación
    • App.css - Contiene los elementos de estilo generales de tu aplicación
    • index.js - El punto de entrada de la aplicación React.
    • index.css - Contiene el estilo de los elementos presentes en el archivo index.js.
    • Crearás los siguientes archivos en la carpeta src:
      • Button.css - Contiene los elementos de estilo para el botón Logout que estará presente en la aplicación.
      • Button.js - Contiene el componente React para el botón Logout presente en la aplicación.
      • Layout.js - Contiene el componente React para la lógica de la aplicación
      • LoginPage.js - Contiene el componente React para las páginas de inicio de sesión que generaste en la consola de Catalyst.
      • UserProfile.css - Contiene los elementos de estilo para la página de información del usuario que se mostrará una vez que inicies sesión en la aplicación.
      • UserProfile.js - Contiene el componente React para renderizar los detalles del usuario después de iniciar sesión.

Codificaremos en los archivos index.html, 404.html, App.js, App.css, index.css, index.js, Button.css, Button.js, Layout.js, LoginPage.js, UserProfile.css y UserProfile.js. También realizaremos un cambio en el client-package.json para asegurar que la página de inicio de la aplicación sea la página autenticada.

Nota: Puedes eliminar los archivos nativos de React ya que no son necesarios para construir esta aplicación.

Instalar paquetes adicionales de React

Es necesario instalar el paquete react-router-dom en el directorio client AuthorizationPortal/zylkertechnologies usando el comando de CLI indicado a continuación:

copy
$
npm install react-router-dom

Este comando instalará el módulo react-router-dom, guardará las dependencias y nos permitirá realizar el enrutamiento hash requerido en nuestra aplicación.

Este es el directorio client después de haber creado los archivos necesarios y eliminado los archivos innecesarios. catalyst_hosted_login_java_react_mod_directory

Nota: Por favor, revisa todo el código proporcionado en esta sección para asegurarte de que lo comprendes completamente.

Copia el código proporcionado a continuación y pégalo en index.html y 404.html, respectivamente, ubicados en el directorio client (zylkertechnologies/public/) usando un IDE y guarda el archivo.

index.html
copy

<!DOCTYPE html> <html lang=“en”> <head> <meta charset=“utf-8” /> <meta name=“viewport” content=“width=device-width, initial-scale=1” /> <meta name=“theme-color” content="#000000" /> <meta name=“description” content=“Web site created using create-react-app” /> <link rel=“manifest” href="%PUBLIC_URL%/manifest.json" /> <title>React App</title> <script src=“https://static.zohocdn.com/catalyst/sdk/js/4.0.0/catalystWebSDK.js"> </script> <script src=”/__catalyst/sdk/init.js"></script> </head> <body> <noscript>You need to enable JavaScript to run this app.</noscript> <div id=“root”></div> </body> </html>

View more
404.html
copy

<!DOCTYPE html> <html lang=“en”> <head> <h2>You are viewing this 404 page since you tried to access a page which does not exist.</h2> </head> </html>

View more

Copia el código proporcionado a continuación y pégalo en App.css, App.js, index.js, index.css, Button.css, Button.js, Layout.js, LoginPage.js, UserProfile.css y UserProfile.js, respectivamente, ubicados en el directorio client (zylkertechnologies/src/) usando un IDE y guarda el archivo.

App.css
copy

.App { text-align: center; }

.App-logo { height: 40vmin; pointer-events: none; }

@media (prefers-reduced-motion: no-preference) { .App-logo { animation: App-logo-spin infinite 20s linear; } }

.App-header { background-color: #282c34; min-height: 100vh; display: flex; flex-direction: column; align-items: center; justify-content: center; font-size: calc(10px + 2vmin); color: white; }

.App-link { color: #61dafb; }

@keyframes App-logo-spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }

.inputs { width: 90%; padding: 15px; margin: 15px 0 22px 0; display: inline-block; border: none; background: #f1f1f1; border-radius: 8px; } #root { background-color: #c0c0c0; } h1, h2, h3, h4, h5, h6, p { margin: 1; }

View more
App.js
copy

import “./App.css”; import { HashRouter, Navigate, Route, Routes } from “react-router-dom”; import Layout from “./Layout”;

function App() { return ( <HashRouter> <Routes> <Route path="/" element={<Layout />} /> <Route path="" element={<Navigate to="/" replace />} /> <Route path="*" element={<Navigate to="/" replace />} /> </Routes> </HashRouter> ); }

export default App;

View more
index.css
copy

body { margin: 0; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; background-color: #c0c0c0; }

View more
index.js
copy

import React from “react”; import “./index.css”; import App from “./App”; import * as ReactDOM from “react-dom/client”;

const root = ReactDOM.createRoot(document.getElementById(“root”)); root.render( <React.StrictMode> <App /> </React.StrictMode> );

View more
Button.css
copy

button { border: none; outline: 0; display: inline-block; padding: 8px; color: white; background-color: #000; text-align: center; cursor: pointer; width: 20%; font-size: 18px; border-radius: 8px; }

button:hover, .forgetPassword-btn:hover, a:hover { opacity: 0.7; } a { text-decoration: none; font-size: 22px; color: black; }

View more
Button.js
copy

import { useCallback } from “react”; import “./Button.css”;

function Button({ title }) { const logout = useCallback(() => { const redirectURL = “/__catalyst/auth/login”; window.catalyst.auth.signOut(redirectURL); }, []); return ( <div id=“logoutbtn” style={{ textAlign: “inline-block” }}> <button onClick={logout} id=“logout” style={{ display: “inline-block” }}> {title} </button> </div> ); }

export default Button;

View more
Layout.js
copy

import UserProfile from “./UserProfile”; import LoginPage from “./LoginPage.js”; import { useEffect, useState } from “react”;

function Layout() { const [isUserAuthenticated, setIsUserAuthenticated] = useState(false); const [isFetching, setIsFetching] = useState(true); const [userDetails, setUserDetails] = useState({ firstName: “”, lastName: “”, mailid: “”, timeZone: “”, createdTime: “”, });

useEffect(() => { window.catalyst.auth .isUserAuthenticated() .then((result) => { let userDetails = { firstName: result.content.first_name, lastName: result.content.last_name, mailid: result.content.email_id, timeZone: result.content.time_zone, createdTime: result.content.created_time, }; setUserDetails(userDetails); setIsUserAuthenticated(true); }) .catch((err) => {}) .finally(() => { setIsFetching(false); }); }, []); return ( <> {isFetching ? ( <p>Loading ….</p> ) : isUserAuthenticated ? ( <UserProfile userDetails={userDetails} /> ) : ( <LoginPage /> )} </> ); }

export default Layout;

View more
LoginPage.js
copy

import { useEffect } from “react”;

function Login() { useEffect(() => { window.location.href = window.origin + “/__catalyst/auth/login”; }, []); return null; }

export default Login;

View more
UserProfile.css
copy

.card { margin: auto; text-align: center; font-family: arial; text-align: center; font-weight: bold; }

.title { font-size: 23px; color: black; } #userimg { height: 20%; width: 15%; }

div.login { padding-top: 10px; height: 260px; width: 500px; margin: 0 auto; }

div.signup { display: none; }

div.forgotpwd { display: none; }

/* Full-width input fields */ input[type=“text”] { width: 90%; padding: 15px; margin: 15px 0 22px 0; display: inline-block; border: none; background: #f1f1f1; border-radius: 8px; }

/* Add a background color when the inputs get focus */ input[type=“text”]:focus, input[type=“password”]:focus { background-color: #ddd; outline: none; }

/* Set a style for all buttons */

/* Float cancel and signup buttons and add an equal width */ .seperatebtn { width: 10%; padding: 8px; border-radius: 8px; }

.signupbtn { width: 10%; padding: 8px; border-radius: 8px; }

.signupfnbtn { width: 20%; padding: 8px; border-radius: 8px; }

.pwdfnbtn { width: 40%; padding: 8px; border-radius: 8px; }

/* The Modal (background) / .modal { display: none; / Hidden by default / position: fixed; / Stay in place / z-index: 1; / Sit on top / left: 0; top: 0; width: 100%; / Full width / height: 100%; / Full height / overflow: auto; / Enable scroll if needed */ background-color: #474e5d; }

/* Modal Content/Box / .modal-content { background-color: #c0c0c0; margin: 5% auto 15% auto; / 5% from the top, 15% from the bottom and centered / width: 25%; / Could be more or less, depending on screen size */ }

/* The Close Button (x) */ .close { position: absolute; right: 35px; top: 15px; font-size: 40px; font-weight: bold; color: #f1f1f1; }

.close:hover, .close:focus { color: #f44336; cursor: pointer; }

/* Clear floats */ .clearfix::after { content: “”; clear: both; display: table; }

p.homepage { font-size: 23px; }

/* Change styles for cancel button and signup button on extra small screens */ @media screen and (max-width: 100px) { .signupbtn { width: 100%; } }

View more
UserProfile.js
copy

import Button from “./Button”; import “./UserProfile.css”;

function UserProfile({ userDetails }) { return ( <div className=“card”> <br> </br> <h1 className=“title”>User Profile Information</h1> <img alt=“usericon” id=“userimg” width=“200px” height=“450px” src=“https://cdn2.iconfinder.com/data/icons/user-management/512/profile_settings-512.png" /> <p className=“title”>First Name : {userDetails.firstName}</p> <p className=“title”>Last Name: {userDetails.lastName}</p> <p className=“title”>Email Address: {userDetails.mailid}</p> <p className=“title”>Time Zone: {userDetails.timeZone}</p> <p className=“title”>Joined On: {userDetails.createdTime}</p> <Button title=“Logout”> </Button> </div> ); } export default UserProfile;

View more
client-package.json
copy
{
    "name": "zylkertechnologies",
    "version": "0.0.1",
    "homepage": "/__catalyst/auth/login",
    "login_redirect": "index.html"
}
Nota: La URL de la página de inicio se puede copiar del Access URL generado por Catalyst en la sección Authentication Types de la consola.

El directorio client ahora está configurado.

Repasemos el funcionamiento de la función y el código del client:

  • El usuario final primero verá la página de inicio de sesión que configuraste y estilizaste en la consola.
  • Para crear una cuenta, hará clic en la opción Sign Up y será dirigido a la página Sign Up.
Nota: Los usuarios finales pueden registrarse en tu aplicación usando sus Social Logins o usar el método convencional de registro en la aplicación usando su dirección de correo electrónico.
  • Una vez que se ingresa la información y hacen clic en Sign Up, o si intentan registrarse usando un Social Login de su preferencia, sus detalles se proporcionarán como entrada JSON a la función de Custom User Validation (authorization_portal_function/CustomUserValidationFunc.java).

  • La función solo autenticará a los usuarios si se cumple la condición que has codificado. Para este tutorial, los usuarios solo serán autenticados si se registraron en la aplicación usando una dirección de correo electrónico registrada en Zylker.

  • Tras una autenticación exitosa, se enviará un correo electrónico de Email Verification a la cuenta que usaron para registrarse en la aplicación.

Nota: Dado que estamos usando Hosted Login, un tipo de autenticación nativa de Catalyst, no se requiere lógica adicional para activar los correos electrónicos correspondientes. Catalyst lo gestionará automáticamente.
  • Una vez que el usuario verifica su dirección de correo electrónico haciendo clic en el enlace proporcionado en el correo, quedará registrado en la aplicación. Sus detalles se pueden ver en la sección User Management del componente Authentication.

  • El usuario final ahora puede iniciar sesión en la aplicación usando sus credenciales autenticadas.

  • El usuario final también puede restablecer su contraseña haciendo clic en la opción Forgot Password. En este caso, se enviará el correo electrónico de Password Reset a su correo registrado. Siguiendo los pasos mencionados en el correo, pueden restablecer fácilmente sus credenciales.

Configuremos el componente client.

El directorio client de la aplicación web Angular contiene:

  • El directorio raíz del client contiene un archivo client-package.json, que es un archivo de configuración que define el nombre, versión, página de inicio predeterminada y página de redirección del componente client. Modificaremos este archivo después de haber codificado el componente client.
  • Archivos nativos de Angular como angular.json, tsconfig.app.json, tsconfig.json y tsconfig.spec.json.
  • El directorio raíz del client también contiene el archivo de dependencias package.json y un archivo .gitignore.
  • La carpeta src contiene los siguientes archivos y directorios según la estructura de proyecto predeterminada de la aplicación Angular:
    • Archivos nativos de Angular como favicon.ico, main.ts, polyfills.ts y test.ts junto con los directorios assets y environment.
    • index.html: El punto de entrada predeterminado de la aplicación.
    • style.css: Contendrá cualquier elemento de estilo requerido por la aplicación en general.
  • Los archivos presentes en el directorio src/app/ son:
    • Archivos nativos de Angular como app.component.css y app.component.spec.ts.
    • app.component.html: Contiene el componente HTML que renderiza el enrutamiento que ocurre en la aplicación.
    • app.component.ts: Contiene la interfaz global de la aplicación donde se declara una variable de Catalyst para usar los métodos del SDK web de Catalyst.
    • app.module.ts: Contiene la lógica de enrutamiento involucrada en la aplicación

Codificaremos los archivos index.html, app.component.html, app.component.ts y app.module.ts.

Crear un componente Layout

Necesitas crear un componente layout en la ruta del directorio src/app/. Este componente contendrá los elementos de estilo, la lógica del client y la lógica de redirección para proporcionar respuestas apropiadas a usuarios autenticados y no autenticados.

Ejecuta el siguiente comando en el directorio src/app/ usando la CLI de Catalyst:

copy
$
ng generate component layout

catalyst_authentication_client_layout_generate_angular

Esto creará una carpeta llamada layout en el directorio src/app/.

Esta carpeta layout contendrá:

  • Un archivo nativo de Angular llamado layout.component.pec.ts.
  • layout.component.html: Contendrá el componente HTML requerido durante la validación del usuario.
  • layout.component.css: Contendrá los elementos de estilo necesarios.
  • layout.component.ts: Contendrá la lógica de enrutamiento y redirección.

Codificaremos los archivos layout.component.html, layout.component.css y layout.component.ts.

Crear un componente Login

Necesitas crear un componente login en la ruta del directorio src/app/. Este componente contendrá la lógica de redirección para proporcionar respuestas apropiadas a usuarios autenticados y no autenticados.

Ejecuta el siguiente comando en el directorio src/app/ usando la CLI de Catalyst:

copy
$
ng generate component login

catalyst_authentication_client_login_generate_angular

Esto creará una carpeta llamada login en el directorio src/app/.

Esta carpeta login contendrá:

  • Un archivo nativo de Angular llamado login.component.pec.ts.
  • login.component.html: Contendrá el componente HTML requerido durante la validación del usuario.
  • login.component.css: Contendrá los elementos de estilo necesarios.
  • login.component.ts: Contendrá la lógica de enrutamiento y redirección.

Codificaremos los archivos login.component.css y login.component.ts.

El directorio client debería verse como el que se muestra en la siguiente imagen. catalyst_authentication_hosted_client_angular_type_last_directory

Ahora puedes comenzar a codificar tu client.

Nota: Por favor, revisa el código proporcionado en esta sección para asegurarte de que lo comprendes completamente.

Copia el código a continuación y pégalo en el archivo index.html presente en el directorio src/.

index.html
copy

<!DOCTYPE html> <html lang=“en”> <head> <meta charset=“utf-8” /> <title>Zylker Technologies</title> <base href="/app/" /> <meta name=“viewport” content=“width=device-width, initial-scale=1” /> <script src=“https://static.zohocdn.com/catalyst/sdk/js/4.2.0/catalystWebSDK.js"> </script> <script src=”/__catalyst/sdk/init.js"> </script> </head> <body> <app-root> </app-root> </body> </html>

View more

Pega el siguiente código en los archivos app.component.html, app.component.ts y app.module.ts presentes en el directorio src/app/.

app.component.html
copy

<router-outlet> </router-outlet>

app.component.ts
copy

import { Component } from ‘@angular/core’;

declare global { interface Window { catalyst: any; //Esta es una variable de Catalyst necesaria para acceder a los métodos del SDK web de Catalyst. } }

@Component({ selector: ‘app-root’, templateUrl: ‘./app.component.html’, styleUrls: [’./app.component.css’], }) export class AppComponent {

}

View more
Nota: La variable any es una variable de Catalyst que hemos declarado globalmente. Esta variable es necesaria para acceder a los métodos del SDK web de Catalyst.
app.module.ts
copy

import { NgModule } from ‘@angular/core’; import { BrowserModule } from ‘@angular/platform-browser’; import { CommonModule } from ‘@angular/common’;

import { AppComponent } from ‘./app.component’; import { FormsModule } from ‘@angular/forms’; import { RouterModule, Routes } from ‘@angular/router’; import { LayoutComponent } from ‘./layout/layout.component’; import { LoginComponent } from ‘./login/login.component’;

const approutes: Routes = [ { path: ‘’, component: LayoutComponent }, { path: ’login’, component: LoginComponent }, { path: ‘**’, redirectTo: ’’ }, ];

@NgModule({ declarations: [AppComponent, LayoutComponent, LoginComponent], imports: [ BrowserModule, CommonModule, FormsModule, RouterModule.forRoot(approutes, { useHash: true }), ], providers: [], bootstrap: [AppComponent], }) export class AppModule {}

View more

Copia el siguiente código y pégalo en los archivos layout.component.html, layout.component.css y layout.component.ts presentes en el directorio src/app/layout.

layout.component.html
copy

<div class=“card” *ngIf=“isAuthenticated”> <div class=“titleDiv”> <h1 class=“title”>User Profile Information</h1> </div> <div class=“imgDiv”> <img id=“userimg” width=“200px” height=“450px” src=“https://cdn2.iconfinder.com/data/icons/user-management/512/profile_settings-512.png" /> </div> <div class=“textDiv”> <p class=“title” id=“fname”>First Name: {{ firstName }}</p> <p class=“title” id=“lname”>Last Name: {{ lastName }}</p> <p class=“title” id=“mailid”>Email ID: {{ mailID }}</p> <p class=“title” id=“tzone”>Time Zone: {{ timezone }}</p> <p class=“title” id=“ctime”>CreatedTime: {{ createdTime }}</p> </div> <div className=“logoutDiv”> <button (click)=“logout()” id=“logoutBtn”>Logout</button> </div> </div>

<div *ngIf=“isFetching” class=“loading-div”> <p class=“loading”>Loading…</p> </div>

View more
layout.component.css
copy

.card { margin: auto; text-align: center; font-family: arial; text-align: center; font-weight: bold; } .title { font-size: 23px; color: black; margin-top: 30px; margin-bottom: 30px; font-weight: bold; } #userimg { height: 20%; width: 15%; }

#logoutBtn { background-color: rgb(2, 136, 2); color: white; border: none; border-radius: 8px; width: 100px; height: 40px; margin-bottom: 30px; cursor: pointer; }

#logoutBtn:hover { background-color: rgb(2, 165, 2); color: white; border: none; border-radius: 8px; width: 100px; height: 40px; margin-bottom: 30px; cursor: pointer; }

body { width: 100%; }

.loading-div { margin-left: 45%; }

.loading { font-weight: bolder; font-size: large; }

#logoutBtn:active { background-color: rgb(2, 172, 2); color: white; border: none; border-radius: 8px; width: 100px; height: 40px; margin-bottom: 30px; cursor: pointer; }

View more
layout.component.ts
copy

import { Component, OnInit } from ‘@angular/core’; //decorador que indica que esto es un componente import { Router } from ‘@angular/router’;

@Component({ selector: ‘app-layout’, templateUrl: ‘./layout.component.html’, styleUrls: [’./layout.component.css’], }) export class LayoutComponent implements OnInit { constructor(private router: Router) {}

firstName: any; lastName: any; mailID: any; timezone: any; createdTime: any; isAuthenticated: boolean = false; isFetching: boolean = true;

ngOnInit(): void { window.catalyst.auth .isUserAuthenticated() .then((result: any) => { console.log(result); console.log(result.content.email_id); this.isAuthenticated = true; this.mailID = result.content.email_id; this.firstName = result.content.first_name; this.lastName = result.content.last_name; this.timezone = result.content.time_zone; this.createdTime = result.content.created_time; })

  .catch((err: any) => {
    console.log(err);
  })
  .finally(() => {
    console.log('finally');
    this.isFetching = false;
this.isAuthenticated
  ? this.router.navigate([''])
  : this.router.navigate(['login']);

});

}

logout() { const redirectURL = ‘/__catalyst/auth/login’; console.log(redirectURL);

var auth = window.catalyst.auth;
auth.signOut(redirectURL);

} }

View more

Copia el siguiente código y pégalo en los archivos login.component.css y login.component.ts presentes en el directorio src/app/login.

layout.component.css
copy

h1 { color: red; }

View more
login.component.ts
copy

import { Component, OnInit } from ‘@angular/core’; //decorador que indica que esto es un componente

@Component({ selector: ‘app-login’, templateUrl: ‘./login.component.html’, styleUrls: [’./login.component.css’], }) export class LoginComponent { ngOnInit(): void { window.location.href = window.origin + ‘/__catalyst/auth/login’; // Gestiona las redirecciones de inicio de sesión } }

View more

Ahora modificaremos el archivo client-package.json presente en el directorio raíz del client.

client-package.json
copy
{
    "name": "zylkertechnologies",
    "version": "0.0.1",
    "homepage": "/__catalyst/auth/login",
    "login_redirect": "index.html"
}
Nota: La URL de la página de inicio se puede copiar del Access URL generado por Catalyst en la sección Authentication Types de la consola.

El directorio client ahora está configurado.

Repasemos el funcionamiento de la función y el código del client.

  • El usuario final primero verá la página de inicio de sesión que configuraste y estilizaste en la consola.

  • Para crear una cuenta, hará clic en la opción Sign Up y será dirigido a la página Sign Up.

Nota: Los usuarios finales pueden registrarse en tu aplicación usando los Social Logins o usar el método convencional de registro en la aplicación usando su dirección de correo electrónico.
  • Después de ingresar la información y hacer clic en Sign Up, o si intentan registrarse usando un Social Login de su preferencia, sus detalles se completarán y proporcionarán como entrada JSON a la función de Custom User Validation: authorization_portal_function/index.js.

  • La función solo autenticará a los usuarios que se hayan registrado en la aplicación usando una dirección de correo electrónico de Zylker.

  • Tras una autenticación exitosa, se enviará un correo electrónico de Email Verification a la cuenta que usaron para registrarse en la aplicación.

Nota: Dado que estamos usando Hosted Login, no se requiere lógica adicional para activar los correos electrónicos correspondientes. Catalyst lo gestionará automáticamente.
  • Después de que el usuario verifica su dirección de correo electrónico haciendo clic en el enlace proporcionado en el correo, quedará registrado en la aplicación. Sus detalles se pueden ver en la sección User Management del componente Authentication.

  • El usuario final ahora puede iniciar sesión en la aplicación usando sus credenciales autenticadas.

  • El usuario final también puede restablecer su contraseña haciendo clic en la opción Forgot Password.

  • En este caso, se enviará el correo electrónico de Password Reset a su correo registrado. Siguiendo los pasos mencionados en el correo, pueden restablecer fácilmente sus credenciales.

Última actualización 2026-03-24 17:38:39 +0530 IST

ENLACES RELACIONADOS

Client Directory Structure