Heim > Web-Frontend > js-Tutorial > Echtzeit-Autorisierung in einer Chat-Anwendung mit Permit.io und WebSockets

Echtzeit-Autorisierung in einer Chat-Anwendung mit Permit.io und WebSockets

Patricia Arquette
Freigeben: 2025-01-23 18:41:09
Original
652 Leute haben es durchsucht

Da sich moderne Chat-Anwendungen weiterentwickeln, erfordert die Echtzeitkommunikation immer detailliertere Zugriffskontrollen. Die Verwaltung dynamischer Berechtigungen in Echtzeit für verschiedene Chatrooms und Teilnehmer, insbesondere in komplexen Umgebungen oder Umgebungen mit mehreren Benutzern, kann schnell zu einer Herausforderung werden. Was wäre, wenn Sie problemlos eine differenzierte Autorisierung für Ihre Chat-App implementieren könnten, ohne Kompromisse bei der Leistung einzugehen?

Permit.io vereinfacht die Integration einer robusten Echtzeit-Zugriffskontrolle in Ihre Chat-Anwendung. Durch die Kombination der erweiterten Autorisierungsmodelle von Permit.io mit WebSockets können Sie sicherstellen, dass die richtigen Benutzer zur richtigen Zeit Zugriff haben und gleichzeitig die in Chat-Anwendungen erforderliche Reaktionsfähigkeit beibehalten.

In diesem Tutorial erfahren Sie, wie Sie mit Permit.io Echtzeitautorisierung in einer WebSocket-basierten Chat-Anwendung implementieren. Am Ende werden Sie verstehen, wie Sie rollenbasierte und attributbasierte Zugriffskontrollen dynamisch durchsetzen und so verschiedene Chatrooms, Nachrichtensichtbarkeit und Interaktionen in Echtzeit sichern.

Einführung in die Echtzeitautorisierung in Chat-Anwendungen

Wir alle nutzen Chat-Anwendungen in der einen oder anderen Form, um mit Freunden und Familie in Kontakt zu bleiben, wichtige Angelegenheiten mit Kollegen zu besprechen und sogar Geschäfte abzuwickeln. Angesichts der steigenden Nachfrage nach nahtloser Echtzeitkommunikation ist es leicht, die ausgefeilten Sicherheitsmaßnahmen zum Schutz dieser Interaktionen als selbstverständlich zu betrachten. Da Chat-Anwendungen jedoch immer komplexer werden, steigen auch die Herausforderungen bei der Sicherung von Benutzerdaten und Gesprächen. Durch eine differenzierte Zugriffskontrolle wird sichergestellt, dass nur autorisierte Benutzer Zugriff auf vertrauliche Informationen und Aktionen haben.

Warum Echtzeit-Chat-Apps eine differenzierte Zugriffskontrolle erfordern

Eine fein abgestufte Zugriffskontrolle ist in Echtzeit-Chat-Anwendungen unerlässlich, um Sicherheit, Benutzeranpassung und Einhaltung gesetzlicher Vorschriften zu gewährleisten.
Durch die Einrichtung robuster Authentifizierungsmethoden und rollenbasierter Berechtigungen verhindern Chat-Anwendungen, dass unbefugte Benutzer auf vertrauliche Konversationen zugreifen und ermöglichen Administratoren eine effektive Verwaltung von Benutzerinteraktionen. Dieser Ansatz verbessert auch das Benutzererlebnis, indem er die Teilnahme an verschiedenen Chat-Typen – öffentlich, privat oder in Gruppen – basierend auf individuellen Rollen oder Vorlieben ermöglicht und so ansprechendere Interaktionen schafft.
Darüber hinaus hilft eine differenzierte Zugriffskontrolle Unternehmen dabei, strenge Datenschutzbestimmungen wie die DSGVO einzuhalten, vertrauliche Daten zu schützen und rechtliche Risiken zu minimieren.

Die Herausforderungen bei der Implementierung dynamischer Autorisierung in einem Chat-Kontext

Die Punkte decken alle Hauptgedanken aus den Absätzen ab. Hier ist eine verfeinerte Version, die jedes Detail enthält:

  1. Echtzeit-Chat-Apps erfordern sofortige Berechtigungsprüfungen und -aktualisierungen, was die dynamische Autorisierung zu einer Herausforderung macht, ohne Leistungseinbußen zu riskieren, insbesondere bei der Verarbeitung großer Mengen an Nachrichten und Benutzern.
  2. Chat-Anwendungen umfassen oft mehrere Zugriffsebenen mit Berechtigungen, die je nach Rollen, Gruppenmitgliedschaften oder bestimmten Attributen variieren und eine konsistente und effiziente Durchsetzung erfordern.
  3. Dynamische Rollenänderungen (z. B. Beförderungen von Administratoren, Gruppenentfernungen oder vorübergehender Zugriff) müssen erkannt und sofort auf alle aktiven Sitzungen angewendet werden, ohne laufende Gespräche zu stören.
  4. Um dieses Maß an Flexibilität zu erreichen und gleichzeitig ein nahtloses Benutzererlebnis zu gewährleisten, ist ein fortschrittliches Autorisierungsmodell erforderlich, das eng mit Echtzeitprotokollen wie WebSockets integriert ist.

Überblick darüber, wie die Autorisierungslösungen von Permit.io diesen Prozess mit WebSockets optimieren können

Die Autorisierungslösungen von Permit.io können die Implementierung der Echtzeitautorisierung in Chat-Anwendungen erheblich rationalisieren, insbesondere wenn sie in WebSockets integriert sind. Hier ist ein Überblick darüber, wie diese Kombination die dynamische Zugangskontrolle verbessert:

  1. Nahtlose Integration: Permit.io bietet ein robustes Framework für die Verwaltung fein abgestufter Zugriffskontrollen, das mithilfe von WebSockets problemlos in Chat-Anwendungen integriert werden kann. Diese Integration ermöglicht Berechtigungsprüfungen und -aktualisierungen in Echtzeit und stellt sicher, dass Benutzer basierend auf ihren Rollen und Attributen sofortigen Zugriff auf die entsprechenden Chatrooms und Funktionen haben.
  2. Dynamisches Berechtigungsmanagement: Mit Permit.io können Entwickler dynamische Berechtigungsmodelle implementieren, die sich an Änderungen in Benutzerrollen oder Gruppenmitgliedschaften anpassen. Wenn ein Benutzer beispielsweise in eine Administratorrolle befördert wird oder ihm vorübergehend Sonderzugriff gewährt wird, können diese Änderungen sofort in allen aktiven Sitzungen übernommen werden, ohne dass laufende Gespräche unterbrochen werden. Diese Funktion begegnet einer der größten Herausforderungen bei der dynamischen Autorisierung, indem sie sicherstellt, dass Berechtigungen konsistent in Echtzeit durchgesetzt werden.
  3. Verbesserte Leistung: Durch die Nutzung von WebSockets für die Kommunikation stellt Permit.io sicher, dass Echtzeit-Autorisierungsprozesse die Anwendungsleistung nicht beeinträchtigen. Die Architektur unterstützt große Mengen an Nachrichten und Benutzern und ermöglicht eine effiziente Bearbeitung gleichzeitiger Zugriffsanfragen bei gleichzeitiger Beibehaltung der Reaktionsfähigkeit – eine entscheidende Anforderung für Chat-Anwendungen.
  4. Rollenbasierte und attributbasierte Zugriffskontrolle: Permit.io erleichtert die Durchsetzung sowohl rollenbasierter als auch attributbasierter Zugriffskontrollen in Chat-Umgebungen. Diese Flexibilität ermöglicht es Administratoren, spezifische Berechtigungen für verschiedene Benutzertypen, beispielsweise Moderatoren oder normale Benutzer, zu definieren und so die Sicherheit zu erhöhen und gleichzeitig ein anpassbares Benutzererlebnis zu bieten. Benutzer können je nach den ihnen zugewiesenen Rollen an verschiedenen Chat-Typen teilnehmen – öffentlich, privat oder in Gruppen.
  5. Konformität mit gesetzlichen Vorschriften: Durch die Implementierung der Lösungen von Permit.io können Unternehmen strenge Datenschutzbestimmungen einhalten, indem sichergestellt wird, dass nur autorisierte Benutzer auf vertrauliche Informationen und Funktionen innerhalb der Chat-Anwendung zugreifen können. Diese Einhaltung ist von entscheidender Bedeutung für den Schutz von Benutzerdaten und die Minimierung rechtlicher Risiken im Zusammenhang mit unbefugtem Zugriff.

Einrichten einer WebSocket-basierten Chat-Anwendung

Für unsere Web-Socket-basierte Anwendung verwenden wir Next.js und Ably, einen Dienst, der es uns ermöglicht, Echtzeitfunktionen einfach in unsere Web-Socket-basierten Apps zu integrieren und zu verwalten.

Zusätzlich zu Ably und Next Auth können wir etwas wie Firebase verwenden, um sowohl Authentifizierungs- als auch Echtzeitfunktionen zu verwalten. Auf dem Permit.io-Blog gibt es ein komplettes Tutorial dazu.

Lasst uns ohne weitere Umschweife fortfahren!

Next.js einrichten

Führen Sie den folgenden Befehl aus und befolgen Sie die Anweisungen:

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 
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Navigieren Sie zum neu erstellten Projektordner und installieren Sie ein paar weitere Pakete, die wir zum Erstellen unserer App verwenden werden:

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 
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Installieren Sie außerdem einige UI-Komponenten von der Radix-Benutzeroberfläche:

cd live-chat
npm install -D prettier prettier-plugin-tailwindcss  @tailwindcss/forms 
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Erstellen Sie eine neue Datei im Stammverzeichnis des Projektverzeichnisses – .prettierrc und geben Sie Folgendes ein:

npm install @radix-ui/react-scroll-area
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Geben Sie in der Datei tailwind.config.ts Folgendes ein:

{
  "plugins": ["prettier-plugin-tailwindcss"]
}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
// ./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;
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Richten Sie globale Stile ein

Geben Sie in der Datei ./app/globals.css Folgendes ein:

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;
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Authentifizierung einrichten

Wir verwenden Auth.js, eine Authentifizierungsbibliothek, die ursprünglich für Next.js entwickelt wurde.
Führen Sie den folgenden Befehl aus, um das Paket zu installieren:

/* ./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;
  }
}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Wir müssen eine Umgebungsvariable AUTH_SECRET erstellen. Die Bibliothek verwendet diesen Zufallswert, um Token und E-Mail-Verifizierungs-Hashes zu verschlüsseln. (Weitere Informationen finden Sie unter Bereitstellung). Sie können eine über die offizielle Auth.js-CLI generieren, indem Sie Folgendes ausführen:

npm install next-auth@beta
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Als nächstes erstellen Sie die Auth.js-Konfigurationsdatei und das Objekt – ./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`.
Nach dem Login kopieren

Fügen Sie einen Routenhandler unter ./app/api/auth/[...nextauth]/route.ts hinzu:

// ./auth.ts
import NextAuth from "next-auth";
export const { handlers, signIn, signOut, auth } = NextAuth({
  providers: [],
});
Nach dem Login kopieren

Fügen Sie optionale Middleware hinzu, um die Sitzung am Leben zu halten; Dadurch wird der Sitzungsablauf bei jedem Aufruf aktualisiert - ./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;
Nach dem Login kopieren

Google OAuth einrichten

NextAuth unterstützt mehrere OAuth-Anbieter für die Authentifizierung. Für dieses Tutorial verwenden wir Google.

Um unsere Google-Client-ID und unser Geheimnis zu erhalten, müssen wir ein neues Projekt in der Google Cloud Console einrichten – https://console.cloud.google.com/projectcreate

Google Cloud Console

Als nächstes richten wir im neu erstellten Projekt einen neuen Zustimmungsbildschirm ein:

Consent Screen

Sobald unser Einwilligungsbildschirm erstellt wurde, können wir Anmeldeinformationen einrichten. Navigieren Sie in der Seitenleiste zu Anmeldeinformationen.
Klicken Sie auf die Schaltfläche Anmeldeinformationen erstellen und wählen Sie OAuth-Client-ID aus der Dropdown-Liste aus.

Oauth Client ID

Wählen Sie im folgenden Bildschirm Webanwendung aus, geben Sie die autorisierten JavaScript-Ursprünge und Weiterleitungs-URIs ein: http://localhost:3000 und http://localhost:3000/api/auth/callback/ google bzw..

Create Oauth Client ID

Damit sollten wir unsere Kunden-ID und unser Geheimnis haben:

Client ID and Secret

Kopieren Sie die Werte und geben Sie sie in die .env-Datei ein:

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 
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Als nächstes aktivieren Sie Google als Anmeldeoption in unserer Auth.js-Konfiguration. Wir müssen den Google-Anbieter aus dem Paket importieren und ihn an das Provider-Array übergeben, das wir zuvor in der Auth.js-Konfigurationsdatei festgelegt haben:

cd live-chat
npm install -D prettier prettier-plugin-tailwindcss  @tailwindcss/forms 
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Erstellen Sie eine Site-Header-Komponente

Lassen Sie uns einen Header für unsere App erstellen, der die Anmelde- und Abmeldeschaltflächen enthält. Erstellen Sie eine neue Datei – ./components/Site/Header.tsx:

npm install @radix-ui/react-scroll-area
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Hier dient eine SiteHeader-Komponente als Hauptnavigationsleiste.

Wenn eine Benutzersitzung vorhanden ist (Sitzung? Benutzer), werden der Avatar, der Name und die Schaltfläche „Abmelden“ des Benutzers angezeigt.
Andernfalls zeigen Sie eine Schaltfläche „Anmelden“ an, und da wir Next.js-Serveraktionen verwenden, fügen wir sie in ein Formular ein.

Die SignIn- und SignOut-Funktionen sind in Serveraktionsmarkierungen („Server verwenden“) für die serverseitige Ausführung in Next.js eingeschlossen.

In unserer ./app/layout.tsx-Datei importieren Sie die SiteHeader-Komponente:

{
  "plugins": ["prettier-plugin-tailwindcss"]
}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Geben Sie auf der Startseite unter ./app/page.tsx Folgendes ein:

// ./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;
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Damit sollten wir so etwas haben:

Auth with Google

Nachdem wir nun die Authentifizierung eingerichtet haben, können wir mit Ably WebSockets-Funktionen zu unserer App hinzufügen.

Richten Sie WebSockets mit Ably ein

Um zu beginnen, melden Sie sich bei Ably an und Erstellen Sie eine neue App mit den folgenden Optionen:

  • App-Name: Benennen Sie Ihre App mit einem aussagekräftigen Namen
  • Wählen Sie Ihre bevorzugte(n) Sprache(n):JavaScript
  • Welche Art von App erstellen Sie?Live-Chat

Ably App Set up

Kopieren Sie im nächsten Bildschirm Ihren API-Schlüssel:

Ably API Key

Speichern Sie es in der .env-Datei:

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;
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

In unserer App installieren Sie das Ably React SDK und die Jose-Bibliothek für 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;
  }
}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Sobald jose and ably installiert ist, erstellen Sie ./app/api/ably/route.ts:

npm install next-auth@beta
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Lassen Sie uns zusammenfassen, was hier passiert:

  1. JWT-Token-Erstellung: Die Funktion „createToken“ generiert ein mit Ably kompatibles JSON-Web-Token, einschließlich Benutzerfunktionen und einer Client-ID. Hier kodieren wir den Anspruch im Token, was bedeutet, dass der userClaim in alle von diesem Client veröffentlichten Ereignisse in Themen mit einem mit *.
  2. übereinstimmenden Namen einbezogen wird
  3. Dynamische Funktionen: Die Funktion „generateCapability“ weist Benutzern basierend auf ihrer Rolle (Moderator oder regulärer Benutzer) Berechtigungen für bestimmte Kanäle zu.
  4. Benutzerauthentifizierung: Die Authentifizierungsfunktion wird verwendet, um die Sitzung des Benutzers abzurufen und sicherzustellen, dass nur authentifizierte Benutzer Token anfordern können.
  5. Umgebungsvariablen: Die Umgebungsvariable ABLY_SECRET_KEY speichert sicher das Ably-API-Geheimnis für die Tokensignierung.
  6. API-Antwort: Der Handler verarbeitet die Anfrage, generiert das Token und gibt es als JSON-Antwort oder als leere Zeichenfolge zurück, wenn der Benutzer nicht authentifiziert ist.

Als nächstes bauen wir alle Komponenten auf, die wir für diese Chat-Seite benötigen. Wir beginnen mit der Komponente „Nachrichtenelement“, die eine einzelne von einem Benutzer gesendete Nachricht anzeigt.

Komponente „Nachrichtenelement“.

Erstellen Sie eine neue Datei – ./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 
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Diese MessageItem-Komponente passt ihr Layout basierend auf der fromUser-Requisite dynamisch an und verwendet Flex-Row-Reverse zur Ausrichtung.
Es zeigt den Avatar des Absenders an, der aus message.data.avatarUrl stammt. Der Nachrichtentext (message.data.text) und sein Zeitstempel (message.timestamp) werden angezeigt, formatiert als lokalisierte Zeitzeichenfolge.
Für vom aktuellen Benutzer gesendete Nachrichten wird bedingt eine Löschschaltfläche angezeigt, die mit einem SVG-Symbol dargestellt wird und den onDelete-Rückruf mit message.id auslöst.

Komponente „Nachrichtenliste“.

Erstellen Sie eine neue Datei – ./components/Message/List.tsx:

cd live-chat
npm install -D prettier prettier-plugin-tailwindcss  @tailwindcss/forms 
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Die MessageList-Komponente rendert eine scrollbare Liste von Nachrichten mithilfe einer messages.map()-Schleife, wobei jede Nachricht über die MessageItem-Komponente angezeigt wird.
Es erkennt, ob eine Nachricht vom angemeldeten Benutzer gesendet wird, indem es die Sitzungs-E-Mail (session.data.user.email) mit der Client-ID der Nachricht vergleicht und Benutzernachrichten für die richtige Ausrichtung mit Selbstende formatiert.
Jedes MessageItem erhält seine Nachricht und den onDelete-Rückruf.

Komponente „Nachrichteneingabe“.

Neue Datei erstellen – ./components/Message/Input.tsx:

npm install @radix-ui/react-scroll-area
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Die MessageInput-Komponente verwaltet Benutzereingaben mit useState und sendet Nachrichten über onSubmit, wobei das Feld nach der Übermittlung zurückgesetzt wird. Das Eingabefeld () zeigt kontextbezogene Platzhalter und ist deaktiviert, wenn die deaktivierte Requisite wahr ist.

Komponente „Chat-Kanalliste“.

Erstellen Sie eine neue Datei – ./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 
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Die ChatChannelList-Komponente stellt eine Liste von Kanälen als Links dar. Der aktive Kanal wird mithilfe der Klasse „font-bold“ basierend auf dem aktuellen Pfadnamen hervorgehoben.

Chat-Komponente

Erstellen Sie eine neue Datei – ./components/Chat/index.tsx:

cd live-chat
npm install -D prettier prettier-plugin-tailwindcss  @tailwindcss/forms 
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

In dieser Komponente machen wir ein paar Dinge:

  1. Nachrichtenverarbeitung: Die Komponente lauscht über useChannel auf Nachrichten (ADD, DELETE, PROMOTE) und aktualisiert die Nachrichtenliste entsprechend.
  2. Nachrichten veröffentlichen: Nachrichten werden mit der Funktion „publishMessage“ veröffentlicht, wobei der Nachrichtentext und der Benutzer-Avatar gesendet werden.
  3. ScrollArea: Die ScrollArea der Radix-Benutzeroberfläche wird zum reibungslosen Scrollen in vertikaler und horizontaler Richtung für den Nachrichtenverlauf verwendet.
  4. Abrufen des Nachrichtenverlaufs: Beim Mounten rufen wir die letzten 100 Nachrichten aus dem Verlauf des Kanals ab.

Als nächstes stellen wir alles auf der Chat-Seite zusammen.

Erstellen Sie eine Chat-Seite

Erstellen Sie eine neue Datei – ./app/chat/[[...channel]]/page.tsx:

npm install @radix-ui/react-scroll-area
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Die Seitenkomponente umhüllt die Chat-App mit Anbietern für die Status- und Kontextverwaltung. Der SessionProvider gewährleistet den globalen Zugriff auf die Sitzung des Benutzers, während der AblyProvider und der ChannelProvider eine nahtlose Integration mit Ably ermöglichen, indem sie einen Echtzeit-Client (authUrl: „/api/ably“) und den aktuellen Kanalnamen (z. B. chat:general) teilen.

Das Layout verwendet ein Raster mit drei Abschnitten: einer linken Seitenleiste ( für die Kanalnavigation), einem mittleren Bereich ( für Nachrichten) und einem Platzhalter rechts Seitenleiste (TODO: Benutzerliste) für zukünftige Funktionen wie Online-Benutzer. Die AutoConnect-Option stellt sicher, dass Ably nur im Browser eine Verbindung herstellt, wodurch SSR-Probleme vermieden werden.

Damit sollten wir etwa Folgendes haben, wenn wir zu http://localhost:3000/chat/general:

navigieren

Chat Interface

Jetzt ist unser Cha

Richten Sie Permit.io ein

Erstellen Sie ein neues Konto unter https://www.permit.io/:

Create Permit Account

Erstellen Sie ein neues Projekt

Geben Sie den Namen Ihres Projekts ein. Für dieses Beispiel verwende ich Live-Chat:

Create Permit Project

Neue Ressource erstellen

Um Kanäle für unsere Chat-App zu erstellen, können wir mit Permit Ressourcen erstellen, bei denen es sich um Entitäten handelt, die darstellen, worauf Benutzer Zugriff haben können. Richten wir unseren Kanal als Ressource ein, um fortzufahren:

Create new resource

Ressource bearbeiten

Jetzt können wir die Ressource bearbeiten und Rollen zu unserer Kanalressource hinzufügen:

Edit Resource

Rollen anzeigen

Hier sind die Rollen, die wir erstellt haben. Sie können es anzeigen, indem Sie auf der Seite Richtlinie zur Registerkarte Rollen gehen.

View Roles

Richtlinien aktualisieren

Jetzt können wir unsere Richtlinien aktualisieren, um zu bestimmen, wer Zugriff auf was auf jeder Ressource hat:

Update Policies

Erstellen Sie eine Ressourceninstanz

Erstellen Sie Ressourceninstanzen für jeden Kanal, den wir in unserem Chat haben möchten. Hier erstellen wir eine Instanz für den allgemeinen Kanal, wir können dasselbe für zufällige und Mod.

Create Resource Instance

Instanzen anzeigen

Hier können wir die erstellten Ressourceninstanzen sehen:

View Instance

Da wir nun unser Permit-Dashboard eingerichtet haben, können wir Permit zu unserer Next.js-App hinzufügen.

Hinzufügen von Permit.io zu Ihrer Next.js-Anwendung

Lassen Sie uns eintauchen und mit der Integration von Permit.io in unsere Anwendung beginnen.

Zuerst müssen wir das Permitio-Paket installieren:


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 
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Wir müssen unseren API-Schlüssel von unserem Permit.io-Dashboard erhalten:

Obtain API Key

Fügen Sie den kopierten Schlüssel zur .env-Datei hinzu:


cd live-chat
npm install -D prettier prettier-plugin-tailwindcss  @tailwindcss/forms 
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Richten Sie ein lokales PDP ein

Als nächstes müssen wir unseren Policy Decision Point einrichten, einen Netzwerkknoten, der für die Beantwortung von Autorisierungsanfragen mithilfe von Richtlinien und Kontextdaten verantwortlich ist.

Ziehen Sie den PDP-Container vom Docker Hub (Klicken Sie hier, um Docker zu installieren):


npm install @radix-ui/react-scroll-area
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Führen Sie den Container aus und ersetzen Sie die Umgebungsvariable PDP_API_KEY durch Ihren API-Schlüssel.


{
  "plugins": ["prettier-plugin-tailwindcss"]
}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nachdem wir nun unser PDP eingerichtet haben, beginnen wir mit dem Hinzufügen von Autorisierungen zu unserer App. In diesem Schritt-für-Schritt-Tutorial zu Permit.io können Sie mehr über das Hinzufügen von Permit.io zu einer Next.js-App erfahren Blog.

Für dieses Beispiel müssen wir ein paar wiederverwendbare Funktionen und Routen einrichten. Beginnen wir mit der Erstellung einer Permit-Bibliotheksfunktion in ./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 
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Wir erstellen außerdem die Datei ./utils/permit.ts für alle unsere genehmigungsbezogenen Dienstprogrammfunktionen:

cd live-chat
npm install -D prettier prettier-plugin-tailwindcss  @tailwindcss/forms 
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Benutzer-Hook

Wir müssen einen useUser-Hook erstellen, der es uns ermöglicht, den Permit-Benutzer einfach im Frontend abzurufen. Erstellen Sie eine neue Datei ./hooks/useUser.ts:

npm install @radix-ui/react-scroll-area
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Erstellen Sie während der Authentifizierung Benutzer in Permit

Um Benutzer während der Anmeldung automatisch zu Permit hinzuzufügen, verwenden Sie den SignIn-Rückruf von NextAuth. Während des Rückrufs:

  1. Ressourceninstanzen abrufen: Ressourceninstanzen von Permit abrufen (z. B. einem Standardarbeitsbereich oder einem Standardprojekt).
  2. Benutzerdaten synchronisieren: Verwenden Sie eine Hilfsfunktion (wie handleSyncUser), um die Benutzerinformationen in Permit zu erstellen oder zu aktualisieren. Dazu gehören ihre ID, E-Mail, Name, Rolle (z. B. „Teilnehmer“) und die relevante Ressourceninstanz.
  3. Anmeldung abschließen: Der Anmeldevorgang wird fortgesetzt, indem true zurückgegeben wird.

Ersetzen Sie die Datei ./auth.ts durch diesen aktualisierten Code:

{
  "plugins": ["prettier-plugin-tailwindcss"]
}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Dadurch wird sichergestellt, dass Benutzer authentifiziert und nahtlos in Permit zur Zugriffskontrolle integriert werden.

Wie wir unten sehen können, wird das Konto des Benutzers zu unserem Genehmigungs-Dashboard hinzugefügt, wenn er sich anmeldet:

Echtzeit-Autorisierung in einer Chat-Anwendung mit Permit.io und WebSockets

Wir müssen noch ein paar Dinge einrichten, bevor wir fortfahren können. Beginnen wir mit Typen, um TypeScript bei der Entwicklung unserer App zu beruhigen. Erstellen Sie eine neue ./types/user.ts-Datei und geben Sie Folgendes ein:

// ./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;
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Als nächstes erstellen wir einige API-Routen, um Benutzerdaten und Berechtigungen zu erhalten und Benutzer hoch- und herabzustufen.

Benutzerdaten abrufen

Erstellen Sie eine neue Datei – ./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;
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Benutzerdaten abrufen

Erstellen Sie eine neue Datei *./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;
  }
}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Benutzer befördern

Erstellen Sie eine neue Datei – ./app/api/permit/promoteUser/route.ts und geben Sie Folgendes ein:

npm install next-auth@beta
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Hier haben wir eine Next.js-API-Route, die einen Benutzer befördert, indem ihm mithilfe von Permit.io bestimmte Rollen auf verschiedenen Ressourceninstanzen zugewiesen werden.
Die promoteUser-Funktion prüft, ob der aktuelle Benutzer berechtigt ist, andere zu bewerben, und weist dem Zielbenutzer auf bestimmten Kanälen Rollen wie „Teilnehmer“, „Moderator“ und „Administrator“ zu.
Die GET-Funktion verarbeitet eingehende Anfragen, extrahiert Abfrageparameter, validiert sie, ruft Ressourceninstanzen ab und führt den Hochstufungsprozess aus. Die Ergebnisse werden als JSON-Antwort oder als Fehlermeldung zurückgegeben, wenn Probleme auftreten.

Benutzer herabstufen

Erstellen Sie eine neue Datei – ./app/api/permit/demoteUser/route.ts und geben Sie Folgendes ein:

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 
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Ähnlich haben wir eine Next.js-API-Route, die einen Benutzer herabstuft, indem seine Rollenzuweisung für bestimmte Ressourceninstanzen mithilfe von Permit.io aufgehoben wird. Die demoteUser-Funktion entfernt Rollen wie „Teilnehmer“, „Moderator“ und „Administrator“ vom Benutzer auf bestimmten Kanälen. Die GET-Funktion verarbeitet eingehende Anfragen, extrahiert Abfrageparameter, validiert sie, ruft Ressourceninstanzen ab, ruft die dem Benutzer zugewiesenen Rollen ab und führt den Herabstufungsprozess aus.

Holen Sie sich Ressourcen

Erstellen Sie eine neue Datei – ./app/api/permit/listResourceInstances/route.ts und geben Sie Folgendes ein:

cd live-chat
npm install -D prettier prettier-plugin-tailwindcss  @tailwindcss/forms 
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Aktualisieren Sie die Ably-Berechtigungsroute

Ersetzen Sie es in unserer Datei ./app/api/ably/route.ts durch den folgenden aktualisierten Code:

npm install @radix-ui/react-scroll-area
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Hier integrieren wir Permit.io zur Verwaltung von Rollen und Berechtigungen und ersetzen statische Konfigurationen durch dynamische rollenbasierte Berechtigungen.
Die Funktion „generatePermissions“ verwendet Daten von Permit.io, um Rollen bestimmten Kanalfunktionen zuzuordnen und sicherzustellen, dass Berechtigungen in Echtzeit an Benutzerrollen angepasst werden. Dieser Ansatz verbessert die Flexibilität und stellt sicher, dass sich das System an veränderte Rollen oder Berechtigungen anpasst und sich nahtlos in die JWT-basierte Authentifizierung von Ably integrieren lässt.

Senderliste aktualisieren

Da wir nun die Ressourcen (Kanäle) zu unserem Genehmigungs-Dashboard hinzugefügt haben, können wir sie von dort abrufen, anstatt sie fest zu codieren.
Nehmen Sie in der Datei ./components/Chat/ChannelList.tsx die folgenden Änderungen vor:

{
  "plugins": ["prettier-plugin-tailwindcss"]
}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Erstellen Sie eine Benutzerlistenkomponente

Lassen Sie uns eine Benutzerlistenkomponente erstellen, die alle zugelassenen Benutzer abruft und neben dem Benutzernamen die Schaltflächen heraufstufen oder herabstufen anzeigt.
Erstellen Sie eine neue Datei – ./components/Chat/UserList.tsx und geben Sie Folgendes ein:

// ./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;
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Hier verwenden wir einen benutzerdefinierten Hook „useUser“, um die Informationen des aktuellen Benutzers abzurufen, und den „useChannel“-Hook von Ably für die Kanalkommunikation in Echtzeit. Die Funktion getUserList ruft mithilfe der Permit.io-API die Liste der Benutzer vom Server ab. Die Komponente abonniert den Ably-Kanal für Echtzeitaktualisierungen und ruft die aktualisierte Benutzerliste ab, wenn ein Herauf-/Herabstufungsereignis auftritt. Die Benutzerliste wird im Status der Komponente gespeichert, mit Ausnahme des aktuellen Benutzers.

Endlich können wir es zu unserer Seite hinzufügen, in ./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;
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Damit sollten wir in der Lage sein, Benutzer in Echtzeit zu befördern und herabzustufen:

Real Time Echtzeit-Autorisierung in einer Chat-Anwendung mit Permit.io und WebSockets

Hier ist die Herabstufung in Aktion:

Echtzeit-Autorisierung in einer Chat-Anwendung mit Permit.io und WebSocketstion Action

Abschluss und Fazit

Das Erstellen einer Chat-Anwendung mit Echtzeit-Autorisierung ist ein herausfordernder, aber lohnender Prozess. Durch die Integration leistungsstarker Tools wie Permit.io und WebSockets können Sie ein nahtloses Erlebnis schaffen, das eine sichere und differenzierte Zugriffskontrolle gewährleistet. In diesem Artikel haben wir die Bedeutung der dynamischen Autorisierung in Chat-Anwendungen untersucht, mit Ably eine WebSocket-basierte Architektur eingerichtet und Permit.io für die Autorisierungsverwaltung integriert.

Dieser Workflow zeigt, wie moderne Tools eine ehemals komplexe Implementierung vereinfachen und es Entwicklern ermöglichen, sich mehr auf die Benutzererfahrung und Skalierbarkeit zu konzentrieren als auf die zugrunde liegende Infrastruktur. Mit dem richtigen Ansatz können Sie sicherstellen, dass Ihre Chat-Anwendung sowohl dynamisch als auch sicher ist.

Weiterführende Literatur und Ressourcen

  • GitHub-Code – https://github.com/miracleonyenma/live-chat
  • Permit.io-Dokumentation – Ein umfassender Leitfaden zu den Funktionen und APIs von Permit.io.
  • Ably WebSockets-Dokumentation – Erfahren Sie mehr über die Erstellung von Echtzeit-Apps mit Ably.
  • Next.js-Dokumentation – Entdecken Sie erweiterte Funktionen zum Erstellen von React-Anwendungen mit Next.js.
  • Auth.js-Dokumentation – Richten Sie eine sichere und skalierbare Authentifizierung in Ihren Next.js-Apps ein.
  • WebSockets für Echtzeit-Webanwendungen – Ein ausführlicher Überblick über WebSockets und ihre Anwendungsfälle.

Nächste Schritte

Nachdem die grundlegende Einrichtung abgeschlossen ist, können Sie einfache und erweiterte Funktionen erkunden wie:

  • Moderatoren erlauben, Teilnehmernachrichten zu löschen
  • Hinzufügen KI-gestützter Moderationstools, um missbräuchliche Inhalte im Chat zu erkennen und zu verhindern. Erfahren Sie mehr über die Erstellung von KI-Anwendungen mit Genehmigung
  • Implementierung von Analyse-Dashboards zur Verfolgung von Benutzeraktivitäten und Nachrichtentrends.

Das obige ist der detaillierte Inhalt vonEchtzeit-Autorisierung in einer Chat-Anwendung mit Permit.io und WebSockets. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage