Maison > interface Web > js tutoriel > Autorisation en temps réel dans une application de chat avec Permit.io et WebSockets

Autorisation en temps réel dans une application de chat avec Permit.io et WebSockets

Patricia Arquette
Libérer: 2025-01-23 18:41:09
original
652 Les gens l'ont consulté

À mesure que les applications de chat modernes évoluent, la communication en temps réel nécessite des contrôles d'accès de plus en plus granulaires. La gestion des autorisations dynamiques en temps réel pour diverses salles de discussion et participants, en particulier dans des environnements complexes ou multi-utilisateurs, peut rapidement devenir un défi. Et si vous pouviez facilement mettre en œuvre une autorisation précise pour votre application de chat sans compromettre les performances ?

Permit.io simplifie l'intégration d'un contrôle d'accès robuste et en temps réel dans votre application de chat. En associant les modèles d'autorisation avancés de Permit.io avec WebSockets, vous pouvez garantir que les bons utilisateurs ont accès au bon moment, tout en conservant la réactivité nécessaire dans les applications de chat.

Dans ce didacticiel, vous apprendrez comment implémenter une autorisation en temps réel dans une application de chat basée sur WebSocket à l'aide de Permit.io. À la fin, vous comprendrez comment appliquer dynamiquement des contrôles d'accès basés sur les rôles et les attributs, en sécurisant différentes salles de discussion, la visibilité des messages et les interactions en temps réel.

Introduction à l'autorisation en temps réel dans les applications de chat

Nous utilisons tous des applications de chat sous une forme ou une autre pour rester en contact avec nos amis et notre famille, discuter de sujets importants avec des collègues et même mener des affaires. Face à la demande croissante de communications fluides et en temps réel, il est facile de tenir pour acquis les mesures de sécurité sophistiquées qui protègent ces interactions. Cependant, à mesure que les applications de chat deviennent plus complexes, les défis liés à la sécurisation des données et des conversations des utilisateurs augmentent également. Un contrôle d'accès précis permet de garantir que seuls les utilisateurs autorisés ont accès aux informations et actions sensibles.

Pourquoi les applications de chat en temps réel nécessitent un contrôle d'accès précis

Un contrôle d'accès précis est essentiel dans les applications de chat en temps réel pour garantir la sécurité, la personnalisation des utilisateurs et la conformité réglementaire.
En définissant des méthodes d'authentification robustes et des autorisations basées sur les rôles, les applications de chat empêchent les utilisateurs non autorisés d'accéder aux conversations sensibles et permettent aux administrateurs de gérer efficacement les interactions des utilisateurs. Cette approche améliore également l'expérience utilisateur en permettant la participation à différents types de chat (public, privé ou de groupe) en fonction des rôles ou préférences individuels, créant ainsi des interactions plus engageantes.
De plus, un contrôle d'accès précis aide les organisations à respecter des réglementations strictes en matière de confidentialité des données, comme le RGPD, en protégeant les données confidentielles et en minimisant les risques juridiques.

Les enjeux de la mise en œuvre de l'autorisation dynamique dans un contexte de chat

Les points couvrent toutes les idées principales des paragraphes. Voici une version raffinée qui inclut chaque détail :

  1. Les applications de chat en temps réel nécessitent des vérifications et des mises à jour instantanées des autorisations, ce qui rend l'autorisation dynamique difficile sans risquer d'impacter les performances, en particulier lors du traitement de grands volumes de messages et d'utilisateurs.
  2. Les applications de chat impliquent souvent plusieurs couches d'accès, avec des autorisations qui varient en fonction des rôles, des appartenances à des groupes ou d'attributs spécifiques, nécessitant une application cohérente et efficace.
  3. Les changements dynamiques de rôles (par exemple, promotions d'administrateur, suppressions de groupes ou accès temporaire) doivent être reconnus et appliqués immédiatement dans toutes les sessions actives sans perturber les conversations en cours.
  4. Atteindre ce niveau de flexibilité tout en conservant une expérience utilisateur transparente nécessite un modèle d'autorisation avancé qui s'intègre étroitement aux protocoles en temps réel tels que WebSockets.

Présentation de la manière dont les solutions d'autorisation de Permit.io peuvent rationaliser ce processus avec WebSockets

Les solutions d'autorisation de Permit.io peuvent rationaliser considérablement la mise en œuvre de l'autorisation en temps réel dans les applications de chat, en particulier lorsqu'elles sont intégrées à WebSockets. Voici un aperçu de la façon dont cette combinaison améliore le contrôle d’accès dynamique :

  1. Intégration transparente : Permit.io offre un cadre robuste pour gérer des contrôles d'accès précis qui peuvent être facilement intégrés aux applications de chat utilisant WebSockets. Cette intégration permet des vérifications et des mises à jour des autorisations en temps réel, garantissant ainsi que les utilisateurs ont un accès immédiat aux salles de discussion et aux fonctionnalités appropriées en fonction de leurs rôles et attributs.
  2. Gestion dynamique des autorisations : Avec Permit.io, les développeurs peuvent implémenter des modèles d'autorisation dynamiques qui s'adaptent aux changements de rôles d'utilisateur ou d'appartenances à des groupes. Par exemple, si un utilisateur est promu à un rôle d'administrateur ou s'il bénéficie temporairement d'un accès spécial, ces modifications peuvent être reflétées instantanément dans toutes les sessions actives sans interrompre les conversations en cours. Cette fonctionnalité répond à l'un des principaux défis de l'autorisation dynamique en garantissant que les autorisations sont appliquées de manière cohérente en temps réel.
  3. Performances améliorées : En tirant parti des WebSockets pour la communication, Permit.io garantit que les processus d'autorisation en temps réel ne compromettent pas les performances des applications. L'architecture prend en charge des volumes élevés de messages et d'utilisateurs, permettant un traitement efficace des demandes d'accès simultanées tout en maintenant la réactivité, une exigence essentielle pour les applications de chat.
  4. Contrôle d'accès basé sur les rôles et les attributs : Permit.io facilite l'application de contrôles d'accès basés sur les rôles et les attributs dans les environnements de discussion. Cette flexibilité permet aux administrateurs de définir des autorisations spécifiques pour différents types d'utilisateurs, tels que les modérateurs ou les utilisateurs réguliers, améliorant ainsi la sécurité tout en offrant une expérience utilisateur personnalisable. Les utilisateurs peuvent participer à différents types de discussion : publique, privée ou de groupe en fonction des rôles qui leur sont attribués.
  5. Conformité réglementaire : La mise en œuvre des solutions Permit.io aide les organisations à respecter des réglementations strictes en matière de confidentialité des données en garantissant que seuls les utilisateurs autorisés peuvent accéder aux informations et fonctionnalités sensibles de l'application de chat. Cette conformité est cruciale pour protéger les données des utilisateurs et minimiser les risques juridiques associés à un accès non autorisé.

Configuration d'une application de discussion basée sur WebSocket

Pour notre application basée sur socket Web, nous utiliserons Next.js et Ably, un service qui nous permet d'intégrer et de gérer facilement les fonctionnalités en temps réel dans nos applications alimentées par socket Web.

En plus d'Ably et Next Auth, nous pouvons utiliser quelque chose comme Firebase pour gérer à la fois l'authentification et les fonctionnalités en temps réel. Il y a un tutoriel complet à ce sujet sur le blog Permit.io.

Sans plus tarder, commençons !

Configuration de Next.js

Exécutez la commande suivante et suivez les invites :

npx create-next-app@latest live-chat
Need to install the following packages:
create-next-app@15.1.0
Ok to proceed? (y) y

✔ Would you like to use TypeScript? … No / Yes
✔ Would you like to use ESLint? … No / Yes
✔ Would you like to use Tailwind CSS? … No / Yes
✔ Would you like your code inside a `src/` directory? … No / Yes
✔ Would you like to use App Router? (recommended) … No / Yes
✔ Would you like to use Turbopack for `next dev`? … No / Yes
✔ Would you like to customize the import alias (`@/*` by default)? … No / Yes
Creating a new Next.js app in /Users/miracleio/Documents/writing/permit/real-time-authorization-in-a-chat-application-with-permitio-and-websockets/live-chat.

Using npm.

Initializing project with template: app-tw 


Installing dependencies:
- react
- react-dom
- next

Installing devDependencies:
- typescript
- @types/node
- @types/react
- @types/react-dom
- postcss
- tailwindcss
- eslint
- eslint-config-next
- @eslint/eslintrc


added 371 packages, and audited 372 packages in 1m

141 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
Initialized a git repository.

Success! Created live-chat at /Users/miracleio/Documents/writing/permit/real-time-authorization-in-a-chat-application-with-permitio-and-websockets/live-chat 
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Accédez au dossier du projet nouvellement créé et installez quelques packages supplémentaires que nous utiliserons pour créer notre application :

npx create-next-app@latest live-chat
Need to install the following packages:
create-next-app@15.1.0
Ok to proceed? (y) y

✔ Would you like to use TypeScript? … No / Yes
✔ Would you like to use ESLint? … No / Yes
✔ Would you like to use Tailwind CSS? … No / Yes
✔ Would you like your code inside a `src/` directory? … No / Yes
✔ Would you like to use App Router? (recommended) … No / Yes
✔ Would you like to use Turbopack for `next dev`? … No / Yes
✔ Would you like to customize the import alias (`@/*` by default)? … No / Yes
Creating a new Next.js app in /Users/miracleio/Documents/writing/permit/real-time-authorization-in-a-chat-application-with-permitio-and-websockets/live-chat.

Using npm.

Initializing project with template: app-tw 


Installing dependencies:
- react
- react-dom
- next

Installing devDependencies:
- typescript
- @types/node
- @types/react
- @types/react-dom
- postcss
- tailwindcss
- eslint
- eslint-config-next
- @eslint/eslintrc


added 371 packages, and audited 372 packages in 1m

141 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
Initialized a git repository.

Success! Created live-chat at /Users/miracleio/Documents/writing/permit/real-time-authorization-in-a-chat-application-with-permitio-and-websockets/live-chat 
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Installez également quelques composants d'interface utilisateur à partir de Radix UI :

cd live-chat
npm install -D prettier prettier-plugin-tailwindcss  @tailwindcss/forms 
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Créez un nouveau fichier à la racine du répertoire du projet - .prettierrc et saisissez ce qui suit :

npm install @radix-ui/react-scroll-area
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Dans le fichier tailwind.config.ts, saisissez ce qui suit :

{
  "plugins": ["prettier-plugin-tailwindcss"]
}
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
// ./tailwind.config.ts
import type { Config } from "tailwindcss";
import tailwindForms from "@tailwindcss/forms";
export default {
  content: [
    "./pages/**/*.{js,ts,jsx,tsx,mdx}",
    "./components/**/*.{js,ts,jsx,tsx,mdx}",
    "./app/**/*.{js,ts,jsx,tsx,mdx}",
  ],
  theme: {
    extend: {
      colors: {
        background: "var(--background)",
        foreground: "var(--foreground)",
      },
    },
  },
  plugins: [tailwindForms],
} satisfies Config;
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Configurer des styles globaux

Dans le fichier ./app/globals.css, saisissez ce qui suit :

In the `./next.config.ts`, enter the following:

// ./next.config.ts
import type { NextConfig } from "next";
const nextConfig: NextConfig = {
  /* config options here */
  images: {
    remotePatterns: [
      {
        protocol: "https",
        hostname: "lh3.googleusercontent.com",
      },
      {
        protocol: "https",
        hostname: "www.tapback.co",
      },
    ],
  },
};
export default nextConfig;
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Configuration de l'authentification

Nous utiliserons Auth.js, une bibliothèque d'authentification initialement conçue pour Next.js.
Exécutez la commande suivante pour installer le package :

/* ./app/globals.css */
@tailwind base;
@tailwind components;
@tailwind utilities;
@layer base {
  body {
    @apply bg-white text-gray-800 dark:bg-gray-900 dark:text-gray-300;
  }
}
@layer components {
  .btn {
    @apply inline-flex items-center justify-center gap-2 rounded-full bg-gray-100 px-4 py-2 text-sm font-semibold text-gray-500 hover:brightness-95 focus:outline-none focus:ring-2 focus:ring-gray-200 focus:ring-offset-2 dark:bg-gray-800 dark:text-gray-300 dark:brightness-105 dark:hover:bg-gray-700 dark:focus:ring-gray-800 dark:focus:ring-offset-gray-900;
  }
  .btn:has(> .icon:first-child) {
    @apply pl-2;
  }
  .btn:has(> .icon:last-child) {
    @apply pr-2;
  }
  .icon {
    @apply h-5 w-5 text-current;
  }
  .form-input {
    @apply flex grow rounded-full border border-none bg-gray-100 px-4 py-2 text-sm font-semibold text-gray-500 outline-none hover:brightness-95 focus:border-none focus:outline-none focus:ring-2 focus:ring-gray-200 focus:ring-offset-2 dark:bg-gray-800 dark:text-gray-300 dark:brightness-105 dark:hover:bg-gray-700 dark:focus:ring-gray-800 dark:focus:ring-offset-gray-900;
  }
  .site-section {
    @apply py-16 md:py-24;
  }
  .site-section > .wrapper {
    @apply mx-auto max-w-5xl px-4 sm:px-6 lg:px-8;
  }
  .noscroll {
    @apply overflow-auto;
    scrollbar-width: none;
  }
}
Copier après la connexion
Copier après la connexion
Copier après la connexion

Nous devons créer une variable d'environnement AUTH_SECRET. La bibliothèque utilise cette valeur aléatoire pour chiffrer les jetons et les hachages de vérification des e-mails. (Voir Déploiement pour en savoir plus). Vous pouvez en générer un via la CLI officielle Auth.js en exécutant :

npm install next-auth@beta
Copier après la connexion
Copier après la connexion
Copier après la connexion

Ensuite, créez le fichier de configuration et l'objet Auth.js - ./auth.js :

npx auth secret

? Created /Users/miracleio/Documents/writing/permit/real-time-authorization-in-a-chat-application-with-permitio-and-websockets/live-chat/.env.local with `AUTH_SECRET`.
Copier après la connexion

Ajoutez un gestionnaire de route sous ./app/api/auth/[...nextauth]/route.ts :

// ./auth.ts
import NextAuth from "next-auth";
export const { handlers, signIn, signOut, auth } = NextAuth({
  providers: [],
});
Copier après la connexion

Ajoutez un middleware facultatif pour maintenir la session en vie ; cela mettra à jour l'expiration de la session à chaque appel - ./middleware.ts :

// ./app/api/auth/[...nextauth]/route.ts

import { handlers } from "@/auth"; // Referring to the auth.ts we just created
export const { GET, POST } = handlers;
Copier après la connexion

Configuration de Google OAuth

NextAuth prend en charge plusieurs fournisseurs OAuth pour l'authentification. Pour ce tutoriel, nous utiliserons Google.

Pour obtenir notre identifiant client et notre secret Google, nous devons configurer un nouveau projet dans Google Cloud Console - https://console.cloud.google.com/projectcreate

Google Cloud Console

Ensuite, dans le projet nouvellement créé, nous allons configurer un nouvel écran de consentement :

Consent Screen

Une fois notre écran de consentement créé, nous pouvons configurer les informations d'identification. Accédez à Identifiants dans la barre latérale.
Cliquez sur le bouton Créer des informations d'identification et sélectionnez ID client OAuth dans la liste déroulante.

Oauth Client ID

Dans l'écran suivant, sélectionnez Application Web, saisissez les origines JavaScript autorisées et redirigez les URI : http://localhost:3000 et http://localhost:3000/api/auth/callback/ Google respectivement.

Create Oauth Client ID

Avec cela, nous devrions avoir notre identifiant client et notre secret :

Client ID and Secret

Copiez les valeurs et saisissez-les dans le fichier .env :

npx create-next-app@latest live-chat
Need to install the following packages:
create-next-app@15.1.0
Ok to proceed? (y) y

✔ Would you like to use TypeScript? … No / Yes
✔ Would you like to use ESLint? … No / Yes
✔ Would you like to use Tailwind CSS? … No / Yes
✔ Would you like your code inside a `src/` directory? … No / Yes
✔ Would you like to use App Router? (recommended) … No / Yes
✔ Would you like to use Turbopack for `next dev`? … No / Yes
✔ Would you like to customize the import alias (`@/*` by default)? … No / Yes
Creating a new Next.js app in /Users/miracleio/Documents/writing/permit/real-time-authorization-in-a-chat-application-with-permitio-and-websockets/live-chat.

Using npm.

Initializing project with template: app-tw 


Installing dependencies:
- react
- react-dom
- next

Installing devDependencies:
- typescript
- @types/node
- @types/react
- @types/react-dom
- postcss
- tailwindcss
- eslint
- eslint-config-next
- @eslint/eslintrc


added 371 packages, and audited 372 packages in 1m

141 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
Initialized a git repository.

Success! Created live-chat at /Users/miracleio/Documents/writing/permit/real-time-authorization-in-a-chat-application-with-permitio-and-websockets/live-chat 
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Ensuite, activez Google comme option de connexion dans notre configuration Auth.js. Nous devrons importer le fournisseur Google du package et le transmettre au tableau des fournisseurs que nous avons défini précédemment dans le fichier de configuration Auth.js :

cd live-chat
npm install -D prettier prettier-plugin-tailwindcss  @tailwindcss/forms 
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Créer un composant d'en-tête de site

Créons un en-tête pour notre application contenant les boutons de connexion et de déconnexion. Créez un nouveau fichier - ./components/Site/Header.tsx :

npm install @radix-ui/react-scroll-area
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Ici, un composant SiteHeader sert de barre de navigation principale.

Si une session utilisateur existe (session ?. utilisateur), affichez l'avatar de l'utilisateur, son nom et un bouton « Se déconnecter ».
Sinon, affichez un bouton « Se connecter », et comme nous utilisons les actions du serveur Next.js, nous le mettons dans un formulaire.

Les fonctions de connexion et de déconnexion sont enveloppées dans des marqueurs d'action du serveur ("utiliser le serveur") pour une exécution côté serveur dans Next.js.

Dans notre fichier ./app/layout.tsx importez le composant SiteHeader :

{
  "plugins": ["prettier-plugin-tailwindcss"]
}
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Dans la page d'accueil à l'adresse ./app/page.tsx, saisissez ce qui suit :

// ./tailwind.config.ts
import type { Config } from "tailwindcss";
import tailwindForms from "@tailwindcss/forms";
export default {
  content: [
    "./pages/**/*.{js,ts,jsx,tsx,mdx}",
    "./components/**/*.{js,ts,jsx,tsx,mdx}",
    "./app/**/*.{js,ts,jsx,tsx,mdx}",
  ],
  theme: {
    extend: {
      colors: {
        background: "var(--background)",
        foreground: "var(--foreground)",
      },
    },
  },
  plugins: [tailwindForms],
} satisfies Config;
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Avec ça, on devrait avoir quelque chose comme ça :

Auth with Google

Maintenant que nous avons configuré l'authentification, passons à l'ajout de fonctionnalités de websockets à notre application avec Ably.

Configurer des WebSockets avec Ably

Pour commencer, inscrivez-vous à Ably puis Créez une nouvelle application avec les options suivantes :

  • Nom de l'application : Appelez votre application de manière significative
  • Sélectionnez votre ou vos langues préférées : JavaScript
  • Quel type d'application créez-vous ? Chat en direct

Ably App Set up

Dans l'écran suivant, copiez votre clé API :

Ably API Key

Enregistrez-le dans le fichier .env :

In the `./next.config.ts`, enter the following:

// ./next.config.ts
import type { NextConfig } from "next";
const nextConfig: NextConfig = {
  /* config options here */
  images: {
    remotePatterns: [
      {
        protocol: "https",
        hostname: "lh3.googleusercontent.com",
      },
      {
        protocol: "https",
        hostname: "www.tapback.co",
      },
    ],
  },
};
export default nextConfig;
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Dans notre application, installez le SDK Ably React et la bibliothèque Jose pour JWT :

/* ./app/globals.css */
@tailwind base;
@tailwind components;
@tailwind utilities;
@layer base {
  body {
    @apply bg-white text-gray-800 dark:bg-gray-900 dark:text-gray-300;
  }
}
@layer components {
  .btn {
    @apply inline-flex items-center justify-center gap-2 rounded-full bg-gray-100 px-4 py-2 text-sm font-semibold text-gray-500 hover:brightness-95 focus:outline-none focus:ring-2 focus:ring-gray-200 focus:ring-offset-2 dark:bg-gray-800 dark:text-gray-300 dark:brightness-105 dark:hover:bg-gray-700 dark:focus:ring-gray-800 dark:focus:ring-offset-gray-900;
  }
  .btn:has(> .icon:first-child) {
    @apply pl-2;
  }
  .btn:has(> .icon:last-child) {
    @apply pr-2;
  }
  .icon {
    @apply h-5 w-5 text-current;
  }
  .form-input {
    @apply flex grow rounded-full border border-none bg-gray-100 px-4 py-2 text-sm font-semibold text-gray-500 outline-none hover:brightness-95 focus:border-none focus:outline-none focus:ring-2 focus:ring-gray-200 focus:ring-offset-2 dark:bg-gray-800 dark:text-gray-300 dark:brightness-105 dark:hover:bg-gray-700 dark:focus:ring-gray-800 dark:focus:ring-offset-gray-900;
  }
  .site-section {
    @apply py-16 md:py-24;
  }
  .site-section > .wrapper {
    @apply mx-auto max-w-5xl px-4 sm:px-6 lg:px-8;
  }
  .noscroll {
    @apply overflow-auto;
    scrollbar-width: none;
  }
}
Copier après la connexion
Copier après la connexion
Copier après la connexion

Une fois Jose et habilement installé, créez ./app/api/ably/route.ts :

npm install next-auth@beta
Copier après la connexion
Copier après la connexion
Copier après la connexion

Décomposons ce qui se passe ici :

  1. Création de jeton JWT : La fonction createToken génère un jeton Web JSON compatible avec Ably, comprenant des capacités utilisateur et un identifiant client. Ici, nous codons la revendication dans le jeton, ce qui signifie que userClaim sera inclus dans tous les événements publiés par ce client dans les sujets dont le nom correspond à *.
  2. Capacités dynamiques : la fonction generateCapability attribue des autorisations aux utilisateurs en fonction de leur rôle (modérateur ou utilisateur régulier) pour des canaux spécifiques.
  3. Authentification de l'utilisateur : la fonction d'authentification est utilisée pour récupérer la session de l'utilisateur, garantissant que seuls les utilisateurs authentifiés peuvent demander des jetons.
  4. Variables d'environnement : La variable d'environnement ABLY_SECRET_KEY stocke en toute sécurité le secret de l'API Ably pour la signature des jetons.
  5. Réponse API : le gestionnaire traite la demande, génère le jeton et le renvoie sous forme de réponse JSON ou de chaîne vide si l'utilisateur n'est pas authentifié.

Ensuite, construisons tous les composants dont nous avons besoin pour cette page de discussion. Nous commencerons par le composant Message Item qui affiche un seul message envoyé par un utilisateur.

Composant Élément de message

Créez un nouveau fichier - ./components/Message/Item.tsx :

npx create-next-app@latest live-chat
Need to install the following packages:
create-next-app@15.1.0
Ok to proceed? (y) y

✔ Would you like to use TypeScript? … No / Yes
✔ Would you like to use ESLint? … No / Yes
✔ Would you like to use Tailwind CSS? … No / Yes
✔ Would you like your code inside a `src/` directory? … No / Yes
✔ Would you like to use App Router? (recommended) … No / Yes
✔ Would you like to use Turbopack for `next dev`? … No / Yes
✔ Would you like to customize the import alias (`@/*` by default)? … No / Yes
Creating a new Next.js app in /Users/miracleio/Documents/writing/permit/real-time-authorization-in-a-chat-application-with-permitio-and-websockets/live-chat.

Using npm.

Initializing project with template: app-tw 


Installing dependencies:
- react
- react-dom
- next

Installing devDependencies:
- typescript
- @types/node
- @types/react
- @types/react-dom
- postcss
- tailwindcss
- eslint
- eslint-config-next
- @eslint/eslintrc


added 371 packages, and audited 372 packages in 1m

141 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
Initialized a git repository.

Success! Created live-chat at /Users/miracleio/Documents/writing/permit/real-time-authorization-in-a-chat-application-with-permitio-and-websockets/live-chat 
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Ce composant MessageItem ajuste dynamiquement sa disposition en fonction de la prop fromUser, en utilisant flex-row-reverse pour l'alignement.
Il affiche l’avatar de l’expéditeur provenant de message.data.avatarUrl. Le texte du message (message.data.text) et son horodatage (message.timestamp) sont affichés, formatés sous forme de chaîne d'heure localisée.
Pour les messages envoyés par l'utilisateur actuel, un bouton de suppression, rendu avec une icône SVG, est affiché sous condition et déclenche le rappel onDelete avec message.id.

Composant Liste de messages

Créez un nouveau fichier - ./components/Message/List.tsx :

cd live-chat
npm install -D prettier prettier-plugin-tailwindcss  @tailwindcss/forms 
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Le composant MessageList affiche une liste déroulante de messages à l'aide d'une boucle messages.map(), où chaque message est affiché via le composant MessageItem.
Il identifie si un message est envoyé par l'utilisateur connecté en comparant l'e-mail de session (session.data.user.email) avec l'ID client du message, en stylisant les messages utilisateur avec une fin automatique pour un alignement correct.
Chaque MessageItem reçoit son message et le rappel onDelete.

Composant d'entrée de message

Créer un nouveau fichier - ./components/Message/Input.tsx :

npm install @radix-ui/react-scroll-area
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Le composant MessageInput gère les entrées de l'utilisateur avec useState et soumet les messages via onSubmit, réinitialisant le champ après la soumission. Le champ de saisie () affiche des espaces réservés contextuels et est désactivé lorsque l'accessoire désactivé est vrai.

Composant Liste des canaux de discussion

Créez un nouveau fichier - ./components/Chat/ChannelList.tsx :

npx create-next-app@latest live-chat
Need to install the following packages:
create-next-app@15.1.0
Ok to proceed? (y) y

✔ Would you like to use TypeScript? … No / Yes
✔ Would you like to use ESLint? … No / Yes
✔ Would you like to use Tailwind CSS? … No / Yes
✔ Would you like your code inside a `src/` directory? … No / Yes
✔ Would you like to use App Router? (recommended) … No / Yes
✔ Would you like to use Turbopack for `next dev`? … No / Yes
✔ Would you like to customize the import alias (`@/*` by default)? … No / Yes
Creating a new Next.js app in /Users/miracleio/Documents/writing/permit/real-time-authorization-in-a-chat-application-with-permitio-and-websockets/live-chat.

Using npm.

Initializing project with template: app-tw 


Installing dependencies:
- react
- react-dom
- next

Installing devDependencies:
- typescript
- @types/node
- @types/react
- @types/react-dom
- postcss
- tailwindcss
- eslint
- eslint-config-next
- @eslint/eslintrc


added 371 packages, and audited 372 packages in 1m

141 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
Initialized a git repository.

Success! Created live-chat at /Users/miracleio/Documents/writing/permit/real-time-authorization-in-a-chat-application-with-permitio-and-websockets/live-chat 
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Le composant ChatChannelList affiche une liste de chaînes sous forme de liens. Le canal actif est mis en évidence à l'aide de la classe font-bold en fonction du nom de chemin actuel.

Composant de discussion

Créez un nouveau fichier - ./components/Chat/index.tsx :

cd live-chat
npm install -D prettier prettier-plugin-tailwindcss  @tailwindcss/forms 
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Dans ce composant, nous faisons quelques choses :

  1. Gestion des messages : Le composant écoute les messages (ADD, DELETE, PROMOTE) via useChannel et met à jour la liste des messages en conséquence.
  2. Publication de messages : Les messages sont publiés à l'aide de la fonction publierMessage, en envoyant le texte du message et l'avatar de l'utilisateur.
  3. ScrollArea : ScrollArea de Radix UI est utilisé pour un défilement fluide dans les directions verticale et horizontale pour l'historique des messages.
  4. Récupération de l'historique des messages : Sur Mount, nous récupérons les 100 derniers messages de l'historique de la chaîne.

Ensuite, nous rassemblerons tout dans la page de chat.

Créer une page de discussion

Créez un nouveau fichier - ./app/chat/[[...channel]]/page.tsx :

npm install @radix-ui/react-scroll-area
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Le composant Page enveloppe l'application de chat dans des fournisseurs pour la gestion de l'état et du contexte. Le SessionProvider garantit un accès global à la session de l'utilisateur, tandis que AblyProvider et ChannelProvider permettent une intégration transparente avec Ably en partageant un client en temps réel (authUrl : "/api/ably") et le nom de canal actuel (par exemple, chat:general).

La mise en page utilise une grille comportant trois sections : une barre latérale gauche ( pour la navigation dans les chaînes), une zone centrale ( pour les messages) et un espace réservé à droite. barre latérale (TODO : liste d'utilisateurs) pour les fonctionnalités futures telles que les utilisateurs en ligne. L'option autoConnect garantit qu'Ably se connecte uniquement dans le navigateur, évitant ainsi les problèmes SSR.

Avec cela, nous devrions avoir quelque chose comme ceci, lorsque nous naviguons vers http://localhost:3000/chat/general:

Chat Interface

Maintenant que notre cha

Configurer Permit.io

Créez un nouveau compte sur https://www.permit.io/ :

Create Permit Account

Créer un nouveau projet

Entrez le nom de votre projet, j'utiliserai Live Chat pour cet exemple :

Create Permit Project

Créer une nouvelle ressource

Pour créer des chaînes pour notre application de chat, Permit nous permet de créer des ressources qui sont des entités qui représentent ce à quoi les utilisateurs peuvent avoir accès, configurons notre chaîne en tant que ressource pour continuer :

Create new resource

Modifier la ressource

Nous pouvons maintenant modifier la ressource et ajouter des rôles sur notre ressource de chaîne :

Edit Resource

Afficher les rôles

Voici les rôles que nous avons créés. Vous pouvez le consulter en accédant à l'onglet Rôles de la page Politique.

View Roles

Mettre à jour les politiques

Nous pouvons désormais mettre à jour nos politiques pour déterminer qui a accès à quoi sur chaque ressource :

Update Policies

Créer une instance de ressource

Créez des instances de ressources pour chaque canal que nous voulons dans notre chat, ici nous créons une instance pour le canal général, nous pouvons faire de même pour aléatoire et mod.

Create Resource Instance

Afficher les instances

Ici, nous pouvons voir les instances de ressources créées :

View Instance

Maintenant que nous avons configuré notre tableau de bord Permit, nous pouvons ajouter Permit à notre application Next.js.

Ajout de Permit.io à votre application Next.js

Plongeons-nous et commençons à intégrer Permit.io dans notre application.

Tout d'abord, nous devons installer le package permitio :

npx create-next-app@latest live-chat
Need to install the following packages:
create-next-app@15.1.0
Ok to proceed? (y) y

✔ Would you like to use TypeScript? … No / Yes
✔ Would you like to use ESLint? … No / Yes
✔ Would you like to use Tailwind CSS? … No / Yes
✔ Would you like your code inside a `src/` directory? … No / Yes
✔ Would you like to use App Router? (recommended) … No / Yes
✔ Would you like to use Turbopack for `next dev`? … No / Yes
✔ Would you like to customize the import alias (`@/*` by default)? … No / Yes
Creating a new Next.js app in /Users/miracleio/Documents/writing/permit/real-time-authorization-in-a-chat-application-with-permitio-and-websockets/live-chat.

Using npm.

Initializing project with template: app-tw 


Installing dependencies:
- react
- react-dom
- next

Installing devDependencies:
- typescript
- @types/node
- @types/react
- @types/react-dom
- postcss
- tailwindcss
- eslint
- eslint-config-next
- @eslint/eslintrc


added 371 packages, and audited 372 packages in 1m

141 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
Initialized a git repository.

Success! Created live-chat at /Users/miracleio/Documents/writing/permit/real-time-authorization-in-a-chat-application-with-permitio-and-websockets/live-chat 
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Nous devons obtenir notre clé API depuis notre tableau de bord Permit.io :

Obtain API Key

Ajoutez la clé copiée au fichier .env :

cd live-chat
npm install -D prettier prettier-plugin-tailwindcss  @tailwindcss/forms 
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Configurer un PDP local

Ensuite, nous devrons configurer notre point de décision politique qui est un nœud de réseau chargé de répondre aux requêtes d'autorisation à l'aide de politiques et de données contextuelles.

Tirez le conteneur PDP de Docker Hub (Cliquez ici pour installer Docker) :

npm install @radix-ui/react-scroll-area
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Exécutez le conteneur et remplacez la variable d'environnement PDP_API_KEY par votre clé API.

{
  "plugins": ["prettier-plugin-tailwindcss"]
}
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Maintenant que notre PDP est configuré, passons à l'ajout d'une autorisation à notre application. Vous pouvez en savoir plus sur l'ajout de Permit.io à une application Next.js à partir de ce didacticiel étape par étape sur Permit.io. blog.

Pour cet exemple, nous devrons configurer quelques fonctions et routes réutilisables, commençons par créer une fonction de bibliothèque Permit dans ./lib/permit.ts :

npx create-next-app@latest live-chat
Need to install the following packages:
create-next-app@15.1.0
Ok to proceed? (y) y

✔ Would you like to use TypeScript? … No / Yes
✔ Would you like to use ESLint? … No / Yes
✔ Would you like to use Tailwind CSS? … No / Yes
✔ Would you like your code inside a `src/` directory? … No / Yes
✔ Would you like to use App Router? (recommended) … No / Yes
✔ Would you like to use Turbopack for `next dev`? … No / Yes
✔ Would you like to customize the import alias (`@/*` by default)? … No / Yes
Creating a new Next.js app in /Users/miracleio/Documents/writing/permit/real-time-authorization-in-a-chat-application-with-permitio-and-websockets/live-chat.

Using npm.

Initializing project with template: app-tw 


Installing dependencies:
- react
- react-dom
- next

Installing devDependencies:
- typescript
- @types/node
- @types/react
- @types/react-dom
- postcss
- tailwindcss
- eslint
- eslint-config-next
- @eslint/eslintrc


added 371 packages, and audited 372 packages in 1m

141 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
Initialized a git repository.

Success! Created live-chat at /Users/miracleio/Documents/writing/permit/real-time-authorization-in-a-chat-application-with-permitio-and-websockets/live-chat 
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Nous créerons également le fichier ./utils/permit.ts pour toutes nos fonctions utilitaires liées aux permis :

cd live-chat
npm install -D prettier prettier-plugin-tailwindcss  @tailwindcss/forms 
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Crochet utilisateur

Nous devrons créer un hook useUser qui nous permettra de récupérer facilement le permis utilisateur sur le frontend. Créez un nouveau fichier ./hooks/useUser.ts :

npm install @radix-ui/react-scroll-area
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Créer des utilisateurs autorisés lors de l'authentification

Pour ajouter automatiquement des utilisateurs à Permit lors de la connexion, utilisez le rappel de connexion de NextAuth. Pendant le rappel :

  1. Récupérer les instances de ressources : récupérez les instances de ressources à partir du permis (par exemple, un espace de travail ou un projet par défaut).
  2. Synchroniser les données utilisateur : utilisez une fonction utilitaire (comme handleSyncUser) pour créer ou mettre à jour les informations de l'utilisateur dans Permit. Cela inclut leur identifiant, leur adresse e-mail, leur nom, leur rôle (par exemple, « participant ») et l'instance de ressource pertinente.
  3. Connexion terminée : le processus de connexion se poursuivra en renvoyant true.

Remplacez le fichier ./auth.ts par ce code mis à jour :

{
  "plugins": ["prettier-plugin-tailwindcss"]
}
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Cela garantit que les utilisateurs sont authentifiés et intégrés de manière transparente dans Permit pour le contrôle d'accès.

Comme nous pouvons le voir ci-dessous, lorsque l'utilisateur se connecte, son compte est ajouté à notre tableau de bord Permis :

Autorisation en temps réel dans une application de chat avec Permit.io et WebSockets

Nous devrons configurer quelques éléments supplémentaires avant de pouvoir continuer, commençons par les types pour apaiser TypeScript pendant que nous développons notre application. Créez un nouveau fichier ./types/user.ts et saisissez ce qui suit :

// ./tailwind.config.ts
import type { Config } from "tailwindcss";
import tailwindForms from "@tailwindcss/forms";
export default {
  content: [
    "./pages/**/*.{js,ts,jsx,tsx,mdx}",
    "./components/**/*.{js,ts,jsx,tsx,mdx}",
    "./app/**/*.{js,ts,jsx,tsx,mdx}",
  ],
  theme: {
    extend: {
      colors: {
        background: "var(--background)",
        foreground: "var(--foreground)",
      },
    },
  },
  plugins: [tailwindForms],
} satisfies Config;
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Ensuite, nous créerons quelques routes API pour obtenir les données et les autorisations des utilisateurs, ainsi que pour promouvoir et rétrograder les utilisateurs.

Obtenir les données des utilisateurs

Créez un nouveau fichier - ./app/api/permit/getUsers/route.ts :

In the `./next.config.ts`, enter the following:

// ./next.config.ts
import type { NextConfig } from "next";
const nextConfig: NextConfig = {
  /* config options here */
  images: {
    remotePatterns: [
      {
        protocol: "https",
        hostname: "lh3.googleusercontent.com",
      },
      {
        protocol: "https",
        hostname: "www.tapback.co",
      },
    ],
  },
};
export default nextConfig;
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Obtenir les données utilisateur

Créez un nouveau fichier *./app/api/permit/getUser/route.ts* :

/* ./app/globals.css */
@tailwind base;
@tailwind components;
@tailwind utilities;
@layer base {
  body {
    @apply bg-white text-gray-800 dark:bg-gray-900 dark:text-gray-300;
  }
}
@layer components {
  .btn {
    @apply inline-flex items-center justify-center gap-2 rounded-full bg-gray-100 px-4 py-2 text-sm font-semibold text-gray-500 hover:brightness-95 focus:outline-none focus:ring-2 focus:ring-gray-200 focus:ring-offset-2 dark:bg-gray-800 dark:text-gray-300 dark:brightness-105 dark:hover:bg-gray-700 dark:focus:ring-gray-800 dark:focus:ring-offset-gray-900;
  }
  .btn:has(> .icon:first-child) {
    @apply pl-2;
  }
  .btn:has(> .icon:last-child) {
    @apply pr-2;
  }
  .icon {
    @apply h-5 w-5 text-current;
  }
  .form-input {
    @apply flex grow rounded-full border border-none bg-gray-100 px-4 py-2 text-sm font-semibold text-gray-500 outline-none hover:brightness-95 focus:border-none focus:outline-none focus:ring-2 focus:ring-gray-200 focus:ring-offset-2 dark:bg-gray-800 dark:text-gray-300 dark:brightness-105 dark:hover:bg-gray-700 dark:focus:ring-gray-800 dark:focus:ring-offset-gray-900;
  }
  .site-section {
    @apply py-16 md:py-24;
  }
  .site-section > .wrapper {
    @apply mx-auto max-w-5xl px-4 sm:px-6 lg:px-8;
  }
  .noscroll {
    @apply overflow-auto;
    scrollbar-width: none;
  }
}
Copier après la connexion
Copier après la connexion
Copier après la connexion

Promouvoir l'utilisateur

Créez un nouveau fichier - ./app/api/permit/promoteUser/route.ts et saisissez ce qui suit :

npm install next-auth@beta
Copier après la connexion
Copier après la connexion
Copier après la connexion

Ici, nous avons une route API Next.js qui promeut un utilisateur en lui attribuant des rôles spécifiques sur différentes instances de ressources à l'aide de Permit.io.
La fonction PromoUser vérifie si l'utilisateur actuel est autorisé à en promouvoir d'autres et attribue des rôles tels que « participant », « modérateur » et « administrateur » à l'utilisateur cible sur les canaux spécifiés.
La fonction GET gère les demandes entrantes, extrait les paramètres de requête, les valide, récupère les instances de ressources et exécute le processus de promotion. Il renvoie les résultats sous forme de réponse JSON ou de message d'erreur si des problèmes surviennent.

Rétrograder un utilisateur

Créez un nouveau fichier - ./app/api/permit/demoteUser/route.ts et saisissez ce qui suit :

npx create-next-app@latest live-chat
Need to install the following packages:
create-next-app@15.1.0
Ok to proceed? (y) y

✔ Would you like to use TypeScript? … No / Yes
✔ Would you like to use ESLint? … No / Yes
✔ Would you like to use Tailwind CSS? … No / Yes
✔ Would you like your code inside a `src/` directory? … No / Yes
✔ Would you like to use App Router? (recommended) … No / Yes
✔ Would you like to use Turbopack for `next dev`? … No / Yes
✔ Would you like to customize the import alias (`@/*` by default)? … No / Yes
Creating a new Next.js app in /Users/miracleio/Documents/writing/permit/real-time-authorization-in-a-chat-application-with-permitio-and-websockets/live-chat.

Using npm.

Initializing project with template: app-tw 


Installing dependencies:
- react
- react-dom
- next

Installing devDependencies:
- typescript
- @types/node
- @types/react
- @types/react-dom
- postcss
- tailwindcss
- eslint
- eslint-config-next
- @eslint/eslintrc


added 371 packages, and audited 372 packages in 1m

141 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
Initialized a git repository.

Success! Created live-chat at /Users/miracleio/Documents/writing/permit/real-time-authorization-in-a-chat-application-with-permitio-and-websockets/live-chat 
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

De même, nous avons une route API Next.js qui rétrograde un utilisateur en désattribuant ses rôles sur des instances de ressources spécifiques à l'aide de Permit.io. La fonction demoteUser supprime les rôles tels que « participant », « modérateur » et « administrateur » de l'utilisateur sur les canaux spécifiés. La fonction GET gère les demandes entrantes, extrait les paramètres de requête, les valide, récupère les instances de ressources, récupère les rôles attribués à l'utilisateur et exécute le processus de rétrogradation.

Obtenir des ressources

Créez un nouveau fichier - ./app/api/permit/listResourceInstances/route.ts et saisissez ce qui suit :

cd live-chat
npm install -D prettier prettier-plugin-tailwindcss  @tailwindcss/forms 
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Mettre à jour l’itinéraire des autorisations Ably

Dans notre fichier ./app/api/ably/route.ts, remplacez-le par le code mis à jour suivant :

npm install @radix-ui/react-scroll-area
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Ici, nous incorporons Permit.io pour gérer les rôles et les autorisations, en remplaçant les configurations statiques par des autorisations dynamiques basées sur les rôles.
La fonction generatePermissions utilise les données de Permit.io pour mapper les rôles à des capacités de canal spécifiques, garantissant ainsi que les autorisations sont alignées sur les rôles des utilisateurs en temps réel. Cette approche améliore la flexibilité et garantit que le système s'adapte à mesure que les rôles ou les autorisations changent, s'intégrant de manière transparente à l'authentification basée sur JWT d'Ably.

Mettre à jour la liste des chaînes

Maintenant que nous avons ajouté les ressources (canaux) à notre tableau de bord des permis, nous pouvons les récupérer à partir de là au lieu de les coder en dur.
Dans le fichier ./components/Chat/ChannelList.tsx, apportez les modifications suivantes :

{
  "plugins": ["prettier-plugin-tailwindcss"]
}
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Composant Créer une liste d'utilisateurs

Créons un composant de liste d'utilisateurs qui récupère tous les utilisateurs autorisés et affiche les boutons promouvoir ou rétrograder à côté du nom d'utilisateur.
Créez un nouveau fichier - ./components/Chat/UserList.tsx et entrez ce qui suit :

// ./tailwind.config.ts
import type { Config } from "tailwindcss";
import tailwindForms from "@tailwindcss/forms";
export default {
  content: [
    "./pages/**/*.{js,ts,jsx,tsx,mdx}",
    "./components/**/*.{js,ts,jsx,tsx,mdx}",
    "./app/**/*.{js,ts,jsx,tsx,mdx}",
  ],
  theme: {
    extend: {
      colors: {
        background: "var(--background)",
        foreground: "var(--foreground)",
      },
    },
  },
  plugins: [tailwindForms],
} satisfies Config;
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Ici, nous utilisons un hook personnalisé useUser pour récupérer les informations de l'utilisateur actuel et le hook useChannel d'Ably pour la communication par canal en temps réel. La fonction getUserList récupère la liste des utilisateurs du serveur à l'aide de l'API Permit.io. Le composant s'abonne au canal Ably pour les mises à jour en temps réel et récupère la liste d'utilisateurs mise à jour lorsqu'un événement de promotion/rétrogradation se produit. La liste des utilisateurs est stockée dans l'état du composant, à l'exclusion de l'utilisateur actuel.

Enfin, nous pouvons l'ajouter à notre page, dans ./app/chat/[[...channel]]/page.tsx :

In the `./next.config.ts`, enter the following:

// ./next.config.ts
import type { NextConfig } from "next";
const nextConfig: NextConfig = {
  /* config options here */
  images: {
    remotePatterns: [
      {
        protocol: "https",
        hostname: "lh3.googleusercontent.com",
      },
      {
        protocol: "https",
        hostname: "www.tapback.co",
      },
    ],
  },
};
export default nextConfig;
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Avec cela, nous devrions pouvoir promouvoir et rétrograder des utilisateurs en temps réel :

Real Time Autorisation en temps réel dans une application de chat avec Permit.io et WebSockets

Voici la rétrogradation en action :

Autorisation en temps réel dans une application de chat avec Permit.io et WebSocketstion Action

Clôture et conclusion

Créer une application de chat avec autorisation en temps réel est un processus difficile mais gratifiant. En intégrant des outils puissants tels que Permit.io et WebSockets, vous pouvez créer une expérience transparente qui garantit un contrôle d'accès sécurisé et précis. Dans cet article, nous avons exploré l'importance de l'autorisation dynamique dans les applications de chat, mis en place une architecture basée sur WebSocket avec Ably et intégré Permit.io pour la gestion des autorisations.

Ce flux de travail démontre comment les outils modernes simplifient ce qui était autrefois une mise en œuvre complexe, permettant aux développeurs de se concentrer davantage sur l'expérience utilisateur et l'évolutivité plutôt que sur l'infrastructure sous-jacente. Avec la bonne approche, vous pouvez garantir que votre application de chat est à la fois dynamique et sécurisée.

Lectures complémentaires et ressources

  • Code GitHub - https://github.com/miracleonyenma/live-chat
  • Documentation Permit.io – Un guide complet des capacités et des API de Permit.io.
  • Documentation Ably WebSockets – Apprenez-en davantage sur la création d'applications en temps réel avec Ably.
  • Documentation Next.js – Explorez les fonctionnalités avancées pour créer des applications React avec Next.js.
  • Documentation Auth.js – Configurez une authentification sécurisée et évolutive dans vos applications Next.js.
  • WebSockets pour les applications Web en temps réel – Un aperçu détaillé des WebSockets et de leurs cas d'utilisation.

Prochaines étapes

Une fois la configuration de base terminée, vous pouvez explorer des fonctionnalités simples et avancées telles que :

  • Autoriser les modérateurs à supprimer les messages des participants
  • Ajout d'outils de modération basés sur l'IA pour détecter et empêcher les contenus abusifs dans le chat. Vous pouvez en savoir plus sur la création d'applications d'IA avec permis
  • Mise en œuvre de tableaux de bord d'analyse pour suivre l'activité des utilisateurs et les tendances des messages.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal