Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Redis

Redis और NextAuth के साथ अपने Next.js ब्लॉग के लिए एक सुरक्षित टिप्पणी प्रणाली बनाएं

<पी> हम इस ट्यूटोरियल में आपके ब्लॉग के लिए एक टिप्पणी अनुभाग बनाएंगे। टेक स्टैक हम होंगे:

  1. नेक्स्टजेएस 13 (ऐप डीआईआर में)
  2. NextAuth (प्रमाणीकरण के लिए)
  3. अपस्टैश रेडिस (टिप्पणियाँ संग्रहीत करने के लिए)
  4. SWR (कैशिंग और टिप्पणियों के पुनर्वैधीकरण के लिए)
<पी> चलिए शुरू करते हैं.

नेक्स्टऑथ के साथ ऑथ को संभालना

<पी> सबसे पहले, हम किसी को भी टिप्पणी पोस्ट करने की अनुमति नहीं दे सकते, है ना? कोई आपके ब्लॉग पर टिप्पणियों को स्पैम करने के लिए कोई स्क्रिप्ट चला सकता है। आइए लोगों को टिप्पणी पोस्ट करने देने से पहले एक प्रमाणीकरण प्रणाली बनाएं। हम NextAuth का उपयोग करेंगे.

<पी> next-auth इंस्टॉल करें आपके प्रोजेक्ट में.

pnpm install next-auth
<पी> यह ऐप डायरेक्टरी

के अंदर निर्देशिका संरचना है
.
├── app
│ ├── api
│ │ └── auth
│ │ └── [...nextauth]
│ │ └── route.ts
│ ├── blog
│ │ ├── page.tsx
│ │ └── [...slug]
│ │ └── page.tsx
│ ├── components
│ │ └── LoginButton.tsx
│ ├── favicon.ico
│ ├── globals.css
│ ├── layout.tsx
<पी> हमारा प्रामाणिक एपीआई रूट सेट करें:

// app/api/auth/[...nextauth]/route.ts
import NextAuth from "next-auth";
import GithubProvider from "next-auth/providers/github";
 
const handler = NextAuth({
 providers: [
 GithubProvider({
 clientId: process.env.GITHUB_CLIENT_ID!,
 clientSecret: process.env.GITHUB_CLIENT_SECRET!,
 }),
 ],
 callbacks: {
 async session({ session, token }) {
 if (session && session.user && token.sub) {
 session.user.sub = token.sub;
 }
 return session;
 },
 },
});
 
export { handler as GET, handler as POST };
<पी> GITHUB_CLIENT_ID प्राप्त करने के लिए यहां से एक नया Github OAuth एप्लिकेशन बनाएं और GITHUB_CLIENT_SECRET .

<पी> Redis और NextAuth के साथ अपने Next.js ब्लॉग के लिए एक सुरक्षित टिप्पणी प्रणाली बनाएं

<पी> अब, NextAuth आपको signIn का उपयोग करके किसी भी क्लाइंट घटक से साइन इन और साइनआउट करने की अनुमति देता है और signOut next-auth से कार्य करता है . लेकिन इससे पहले, आपको एक संदर्भ प्रदाता स्थापित करना होगा जो आपके संपूर्ण एप्लिकेशन को कवर करता है।

// app/layout.tsx
"use client";
 
import "./globals.css";
 
import { SessionProvider } from "next-auth/react";
 
export default function RootLayout({
 children,
}: {
 children: React.ReactNode;
}) {
 return (
 <html lang="en">
 <SessionProvider>
 <body>{children}</body>
 </SessionProvider>
 </html>
 );
}
<पी> SessionProvider आपको एप्लिकेशन में किसी भी क्लाइंट घटक से सत्र स्थिति तक पहुंचने की अनुमति देगा।

<पी> आप useSession का उपयोग करके सत्र स्थिति तक पहुंच सकते हैं next-auth से हुक . यहां लॉगिन बटन का एक नमूना है:

"use Client";
 
import { signIn, signOut, useSession } from "next-auth/react";
 
export default function LoginButton() {
 const { data: session } = useSession();
 if (session) {
 return (
 <div>
 Signed in as {session.user?.name} using {session.user?.email} <br />
 <button onClick={() => signOut()}>Sign out</button>
 </div>
 );
 }
 return (
 <div>
 Not signed in <br />
 <button onClick={() => signIn()}> Sign in </button>
 </div>
 );
}
<पी> इसके साथ, हमारी प्रामाणिक प्रणाली लागू है। अब रेडिस डेटाबेस में टिप्पणियों को संग्रहीत करने के लिए सर्वर साइड रूट शुरू करते हैं।

रेडिस डेटाबेस की स्थापना

  1. अपस्टैश पर जाएं और एक रेडिस डेटाबेस बनाएं।
  2. अपने उपयोगकर्ताओं के नजदीक एक क्षेत्र चुनें और टीएलएस एन्क्रिप्शन का विकल्प चुनें।
  3. इंस्टॉल करें @upstash/redis पैकेज.
pnpm install @upstash/redis
<पी> Redis और NextAuth के साथ अपने Next.js ब्लॉग के लिए एक सुरक्षित टिप्पणी प्रणाली बनाएं

  1. इन टोकन को अपने .env.local में कॉपी करें .
<पी> आइए अब इस निर्देशिका संरचना में अपने एपीआई एंडपॉइंट लिखें:

.
├── app
│ ├── api
│ │ ├── auth
│ │ │ └── [...nextauth]
│ │ │ └── route.ts
│ │ ├── comment
│ │ │ ├── delete
│ │ │ │ └── route.ts
│ │ │ ├── get
│ │ │ │ └── route.ts
│ │ │ └── post
│ │ │ └── route.ts
│ │ └── lib
│ │ ├── getUser.ts
│ │ └── redis.ts
  1. एक रेडिस क्लाइंट इंस्टेंस बनाएं
// app/api/lib/redis.ts
import { Redis } from "@upstash/redis";
 
/*
This tries to load UPSTASH_REDIS_REST_URL
and UPSTASH_REDIS_REST_TOKEN from your environment
using process.env
*/
const redis = Redis.fromEnv();
 
export default redis;
<पी> बस यही था. हमारा रेडिस क्लाइंट अब सेट हो गया है और जो कुछ बचा है वह हमारे एप्लिकेशन में इसके लिए APIroutes सेट करना है।

<पी> हम टिप्पणियों को संग्रहीत करने के लिए रेडिस सूचियों का उपयोग करेंगे। वे एक स्टैक के रूप में कार्य कर सकते हैं इसलिए नवीनतम टिप्पणी शीर्ष पर प्रदर्शित होती है। ज़रूर, हम सॉर्टिंग लॉजिक क्लाइंट साइड को भी लागू कर सकते हैं लेकिन जब रेडिस पहले से ही यह डेटा संरचना प्रदान करता है, तो आइए इसका उपयोग करें।

<पी> आप पूरा कोड यहां देख सकते हैं. इसका सार इस प्रकार है:

  1. <पी> एक टिप्पणी बनाएं:redis.lpush(referer, comment) . यह टिप्पणी को कुंजी referer वाली सूची में धकेल देगा
  2. <पी> सभी टिप्पणियाँ प्राप्त करें redis.lrange(referer, 0, -1)
  3. <पी> एक टिप्पणी हटाएं redis.lrem(referer, 0, comment) . इससे comment की सभी घटनाएं हट जाएंगी सूची में कुंजी referer के साथ .

<पी> हमारी एपीआई अब जगह पर है। आइए फ्रंटएंड को बैकएंड के साथ एकीकृत करें।

क्लाइंट साइड सेट करना

<पी> यह उतना कठिन नहीं है. हमें बस उन अंतिम बिंदुओं तक पहुंचने की जरूरत है जिन्हें हमने अभी fetch का उपयोग करके बनाया है .हम swr नामक लाइब्रेरी का उपयोग करेंगे टिप्पणियों की कैशिंग और पुनर्वैधीकरण के लिए। लेकिन इसके लिए रिएक्ट क्वेरी जैसी अन्य लाइब्रेरी का उपयोग करने में संकोच न करें।

<पी> हम एक useComment() बनाते हैं हुक जिसमें onSubmit() होगा और onDelete() अनुरोध करने के लिए हैंडलर।

"use client";
 
import { useState } from "react";
 
import type { Comment } from "@/app/interfaces/interfaces";
import useSWR from "swr";
 
const fetcher = (url: string) => fetch(url).then((res) => res.json());
 
const useComment = () => {
 const [text, setText] = useState("");
 const { data: comments, mutate } = useSWR<Comment[]>(
 "/api/comment/get",
 fetcher,
 {
 fallbackData: [],
 },
 );
 const onSubmit = async (e: React.FormEvent<HTMLFormElement>) => {
 e.preventDefault();
 try {
 await fetch("/api/comment/post", {
 method: "POST",
 body: JSON.stringify({ text }),
 headers: {
 "Content-Type": "application/json",
 },
 });
 setText("");
 await mutate();
 } catch (error) {
 console.log(error);
 }
 };
 const onDelete = async (comment: Comment) => {
 try {
 await fetch("/api/comment/delete", {
 method: "POST",
 body: JSON.stringify({ comment }),
 headers: {
 "Content-Type": "application/json",
 },
 });
 await mutate();
 } catch (error) {
 console.log(error);
 }
 };
 return { text, setText, comments, onSubmit, onDelete };
};
 
export default useComment;
<पी> अब हमारा टिप्पणी अनुभाग पूरा हो गया है। हम टिप्पणियाँ लाने, पोस्ट करने और हटाने में सक्षम हैं। अगला कदम टिप्पणी बॉक्स और टिप्पणी सूची के लिए घटक बनाना होगा। यहां एक पूरा नमूना है


  1. CSS के साथ रिस्पॉन्सिव टाइपोग्राफी कैसे बनाएं? CSS के साथ रिस्पॉन्सिव टाइपोग्राफी कैसे बनाएं?

    सीएसएस के साथ प्रतिक्रियाशील टाइपोग्राफी बनाने के लिए, कोड इस प्रकार है - उदाहरण <!DOCTYPE html> <html> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <head> <style>    h1 {       font-size: 10vw; &n

  1. जावास्क्रिप्ट में वैकल्पिक कैच बाइंडिंग की व्याख्या करें। जावास्क्रिप्ट में वैकल्पिक कैच बाइंडिंग की व्याख्या करें।

    ES2019 में पेश किया गया वैकल्पिक कैच बाइंडिंग हमें कैच बाइंडिंग के आसपास के कोष्ठकों को हटाने की अनुमति देता है, यानी हमें एरर ऑब्जेक्ट को स्टोर करने के लिए एक वेरिएबल का उपयोग करने की आवश्यकता नहीं है। यह विशेष रूप से तब उपयोगी होता है जब हम त्रुटि के बारे में पहले से जानते हों या किसी त्रुटि के बा

  1. शेल स्क्रिप्टिंग में  लिनक्स वेरिएबल्स  को समझना और लिखना - भाग 10 शेल स्क्रिप्टिंग में 'लिनक्स वेरिएबल्स' को समझना और लिखना - भाग 10

    लिनक्स शेल स्क्रिप्टिंग भाषा हमेशा एक गर्म विषय रहा है और हमेशा भविष्य में रहेगा। शेल स्क्रिप्टिंग भाषा जादुई है और किसी भी अन्य भाषा की तरह स्क्रिप्टिंग भाषा में प्रोग्राम करना इतना आसान है। हालांकि, हम क्या कर रहे हैं और परिणाम क्या अपेक्षित है, इसकी गहन जानकारी की आवश्यकता है। सभी शेल स्क्रिप्ट