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

Auth.js और Upstash Redis का उपयोग करके Next.js में सुरक्षित उपयोगकर्ता प्रमाणीकरण

<पी> इस ट्यूटोरियल में, आप Auth.js और Upstash Redis का उपयोग करके Next.js एप्लिकेशन में उपयोगकर्ता प्रमाणीकरण लागू करना सीखेंगे। आप सीखेंगे कि आवश्यक वातावरण कैसे सेट करें, सुरक्षित उपयोगकर्ता साइन-इन और साइन-अप के लिए कस्टम प्रमाणीकरण प्रदाता कैसे बनाएं और सत्रों के प्रबंधन के लिए अपस्टैश रेडिस को डेटाबेस के रूप में एकीकृत करें।

आवश्यकताएँ

<पी> आपको निम्नलिखित की आवश्यकता होगी:

  • Node.js 18 या बाद का संस्करण
  • एक अपस्टैश खाता

टेक स्टैक

प्रौद्योगिकी विवरण Next.js Web.UpstashServerless डेटाबेस प्लेटफॉर्म के लिए रिएक्ट फ्रेमवर्क। आप सत्र और उपयोगकर्ता जानकारी के प्रबंधन के लिए अपस्टैश रेडिस का उपयोग करने जा रहे हैं।

अपस्टैश रेडिस इंस्टेंस सेट करें

<पी> अपने अपस्टैश डैशबोर्ड में, रेडिस पर जाएं टैब करें और एक डेटाबेस बनाएं।

<पी> Auth.js और Upstash Redis का उपयोग करके Next.js में सुरक्षित उपयोगकर्ता प्रमाणीकरण

<पी> REST API अनुभाग मिलने तक नीचे स्क्रॉल करें और .env चुनें बटन. सामग्री को कॉपी करें और इसे किसी सुरक्षित स्थान पर सहेजें।

<पी> Auth.js और Upstash Redis का उपयोग करके Next.js में सुरक्षित उपयोगकर्ता प्रमाणीकरण

एक नया Next.js एप्लिकेशन बनाएं

<पी> आइए एक नया Next.js प्रोजेक्ट बनाकर शुरुआत करें। अपना टर्मिनल खोलें और निम्नलिखित कमांड चलाएँ:

npx create-next-app@latest my-app
<पी> संकेत मिलने पर, चुनें:

  • Yes जब टाइपस्क्रिप्ट का उपयोग करने के लिए कहा जाए।
  • No जब ESLint का उपयोग करने के लिए कहा जाए।
  • Yes जब टेलविंड सीएसएस का उपयोग करने के लिए कहा जाए।
  • No जब src/ का उपयोग करने के लिए कहा जाए निर्देशिका.
  • Yes जब ऐप राउटर का उपयोग करने के लिए कहा जाए।
  • No जब टर्बोपैक का उपयोग करने के लिए कहा जाए।
  • No जब डिफ़ॉल्ट आयात उपनाम (@/*) को अनुकूलित करने के लिए कहा जाए ).
<पी> एक बार यह हो जाने के बाद, प्रोजेक्ट निर्देशिका में जाएँ और निम्नलिखित कमांड निष्पादित करके ऐप को डेवलपमेंट मोड में प्रारंभ करें:

cd my-app
npm run dev
<पी> ऐप लोकलहोस्ट:3000 पर चलना चाहिए। निम्नलिखित आदेशों के साथ आवश्यक निर्भरताएँ स्थापित करने के लिए विकास सर्वर को रोकें:

npm install @upstash/redis nanoid
npm install next-auth @auth/core @auth/upstash-redis-adapter
<पी> स्थापित पुस्तकालयों में शामिल हैं:

  • nanoid :अद्वितीय, सुरक्षित आईडी बनाने के लिए एक लाइब्रेरी।
  • next-auth :Next.js के लिए प्रमाणीकरण समाधान बनाया गया।
  • @auth/core :Auth.js में प्रमाणीकरण को संभालने के लिए कोर पैकेज।
  • @upstash/redis :SDK HTTP अनुरोधों के माध्यम से अपस्टैश रेडिस के साथ इंटरैक्ट करेगा।
  • @auth/upstash-redis-adapter :अपस्टैश रेडिस के साथ Auth.js को एकीकृत करने के लिए एडाप्टर।
<पी> अब, एक .env बनाएं अपने प्रोजेक्ट के मूल में फ़ाइल करें। आप AUTH_SECRET का उपयोग करने जा रहे हैं , UPSTASH_REDIS_REST_URL और UPSTASH_REDIS_REST_TOKEN मान.

<पी> .env फ़ाइल में निम्नलिखित होना चाहिए:

# .env
 
# Auth.js Environment Variable
AUTH_SECRET="..."
 
# Upstash Redis Environment Variables
UPSTASH_REDIS_REST_URL="https://...upstash.io"
UPSTASH_REDIS_REST_TOKEN="..."

अपस्टैश रेडिस क्लाइंट को इंस्टेंट करें

<पी> redis.ts नाम की एक फ़ाइल बनाएं lib में निम्नलिखित कोड वाली निर्देशिका:

// File: lib/redis.ts
 
import { Redis } from '@upstash/redis'
 
export default new Redis({
 url: process.env.UPSTASH_REDIS_REST_URL,
 token: process.env.UPSTASH_REDIS_REST_TOKEN,
})
<पी> उपरोक्त कोड में, एक एज-संगत रेडिस क्लाइंट इंस्टेंस को पूरे एप्लिकेशन में उपयोग करने के लिए निर्यात किया जाता है।

उपयोगकर्ता प्रकार और क्रेडेंशियल हेल्पर्स सेट करें

<पी> types.ts नाम की एक फ़ाइल बनाएं lib में निम्नलिखित कोड वाली निर्देशिका:

// File: lib/types.ts
 
export interface UserType {
 id?: string
 email: string
 name?: string
 image?: string
 password?: string
 emailVerified?: string
}
<पी> UserType इंटरफ़ेस एप्लिकेशन में उपयोगकर्ता ऑब्जेक्ट की संरचना को परिभाषित करता है। इसमें शामिल हैं:

  • id (वैकल्पिक):उपयोगकर्ता के लिए एक विशिष्ट पहचानकर्ता।
  • email (आवश्यक):उपयोगकर्ता का ईमेल पता.
  • name (वैकल्पिक):उपयोगकर्ता का नाम.
  • image (वैकल्पिक):उपयोगकर्ता की प्रोफ़ाइल छवि का URL या पथ।
  • password (वैकल्पिक):उपयोगकर्ता का हैश किया हुआ पासवर्ड।
  • emailVerified (वैकल्पिक):एक टाइमस्टैम्प या स्ट्रिंग जो यह बताती है कि उपयोगकर्ता का ईमेल सत्यापित किया गया था या नहीं।
<पी> यह इंटरफ़ेस पूरे एप्लिकेशन में उपयोगकर्ता डेटा के लिए एक प्रकार की परिभाषा के रूप में कार्य करता है।

<पी> इसके अलावा, credentials.ts नाम की एक फ़ाइल बनाएं lib में निम्नलिखित कोड वाली निर्देशिका:

// File: lib/credentials.ts
 
export function generateRandomToken() {
 const array = new Uint8Array(20)
 crypto.getRandomValues(array)
 return Array.from(array, (byte) => byte.toString(16).padStart(2, '0')).join('')
}
 
export function generateRandomString(inputValue: string) {
 const encoder = new TextEncoder()
 const data = encoder.encode(inputValue)
 return crypto.subtle.digest('SHA-256', data).then((hashBuffer) => {
 return Array.from(new Uint8Array(hashBuffer))
 .map((byte) => byte.toString(16).padStart(2, '0'))
 .join('')
 })
}
 
export async function hashPassword(password: string) {
 const encoder = new TextEncoder()
 const data = encoder.encode(password)
 const hashBuffer = await crypto.subtle.digest('SHA-256', data)
 return Array.from(new Uint8Array(hashBuffer))
 .map((byte) => byte.toString(16).padStart(2, '0'))
 .join('')
}
 
export async function comparePassword(password: string, hash: string) {
 const hashedPassword = await hashPassword(password)
 return hashedPassword === hash
}
<पी> उपरोक्त कोड में, सुरक्षित टोकन और हैशेड पासवर्ड बनाने और प्रबंधित करने के लिए एज-संगत उपयोगिता कार्यों को परिभाषित किया गया है:

  • generateRandomToken :20-बाइट यादृच्छिक सरणी उत्पन्न करके और इसे हेक्साडेसिमल स्ट्रिंग में परिवर्तित करके एक क्रिप्टोग्राफ़िक रूप से सुरक्षित यादृच्छिक टोकन बनाता है।
  • generateRandomString :एक इनपुट स्ट्रिंग स्वीकार करता है, इसे बाइट्स में एन्कोड करता है, इसे SHA-256 का उपयोग करके हैश करता है, और हैश को हेक्साडेसिमल स्ट्रिंग के रूप में लौटाता है। इनपुट मानों से प्राप्त सुसंगत, अद्वितीय स्ट्रिंग उत्पन्न करने के लिए उपयोगी।
  • hashPassword :SHA-256 का उपयोग करके एक प्लेनटेक्स्ट पासवर्ड को हैश करता है और परिणामी हैश को हेक्साडेसिमल स्ट्रिंग में परिवर्तित करता है। इसका उपयोग पासवर्ड को सुरक्षित रूप से संग्रहीत करने के लिए किया जाता है।
  • comparePassword :इनपुट को हैश करके और यह जांच कर कि क्या यह संग्रहीत हैश से मेल खाता है, एक प्लेनटेक्स्ट पासवर्ड की तुलना हैश किए गए पासवर्ड से करता है।

Auth.js के साथ अपस्टैश रेडिस एडाप्टर का उपयोग करना

<पी> auth.ts नाम की एक फ़ाइल बनाएं lib में निम्नलिखित कोड वाली निर्देशिका:

// File: lib/auth.ts
 
import { UpstashRedisAdapter } from '@auth/upstash-redis-adapter'
import NextAuth from 'next-auth'
import providers from './providers'
import redis from './redis'
 
export const { handlers, signIn, signOut, auth } = NextAuth(() => ({
 providers,
 session: { strategy: 'jwt' },
 adapter: UpstashRedisAdapter(redis),
}))
<पी> उपरोक्त कोड में, handlers बनाकर प्रमाणीकरण स्थापित किया जा रहा है , signIn , signOut , और auth कस्टम कॉन्फ़िगरेशन का उपयोग करके कार्य करता है। यह JWT-आधारित सत्र रणनीति, UpstashRedisAdapter का उपयोग करता है उपयोगकर्ता डेटा संग्रहीत करने के लिए अपस्टैश रेडिस डेटाबेस से कनेक्ट करने के लिए, और providers में परिभाषित प्रमाणीकरण प्रदाताओं की एक श्रृंखला से कनेक्ट करने के लिए मॉड्यूल. यह सेटअप बैकएंड के रूप में अपस्टैश रेडिस के साथ प्रमाणीकरण और सत्र प्रबंधन के निर्बाध एकीकरण को सक्षम बनाता है।

Auth.js के साथ कस्टम प्रमाणीकरण प्रदाता सेट करें

<पी> providers.ts नाम की एक फ़ाइल बनाएं lib में निम्नलिखित कोड वाली निर्देशिका:

// File: lib/providers.ts
 
import { nanoid } from 'nanoid'
import Credentials from 'next-auth/providers/credentials'
import { comparePassword, generateRandomString, hashPassword } from './credentials'
import redis from './redis'
import { UserType } from './types'
 
export default [
 Credentials({
 credentials: {
 email: {},
 password: {},
 },
 authorize: async (credentials, request) => {
 let type
 try {
 const tmp = new URL(request.url).searchParams.get('kind')
 if (tmp && typeof tmp === 'string') type = tmp
 } catch (e) {}
 if (!type || !credentials.email || typeof credentials.email !== 'string' || !credentials.password || typeof credentials.password !== 'string') return null
 const randomizedPassword = await generateRandomString(credentials.password)
 const userByEmail = await redis.get<string | null | undefined>(`user:email:${credentials.email}`)
 if (userByEmail) {
 if (type !== 'in') {
 console.log(`can not sign in in a non sign-in mode.`)
 throw new Error(`can not sign in in a non sign-in mode.`)
 }
 const user = await redis.get<UserType>(`user:${userByEmail}`)
 if (!user) {
 console.log(`Found the user by email from user:email:${userByEmail}, but the user object is missing at user:${userByEmail}`)
 return null
 }
 if (user.password) {
 const hashedPassword = await hashPassword(randomizedPassword)
 const isPasswordCorrect = await comparePassword(user.password, hashedPassword)
 if (isPasswordCorrect) {
 const { password, ...rest } = user
 return rest
 }
 throw new Error(`incorrect password for credentials.`)
 }
 throw new Error(`you are using some other authentication method already, but not credentials.`)
 } else {
 if (type !== 'up') {
 console.log(`can not sign up in a non sign-up mode.`)
 throw new Error(`can not sign up in a non sign-up mode.`)
 }
 const newUser = {
 name: null,
 image: null,
 emailVerified: null,
 email: credentials.email,
 password: randomizedPassword,
 }
 const tmp = nanoid()
 await redis.set(`user:email:${credentials.email}`, tmp)
 await redis.set(`user:${tmp}`, newUser)
 return newUser
 }
 },
 }),
]
<पी> उपरोक्त कोड में, कस्टम, क्रेडेंशियल-आधारित प्रमाणीकरण प्रदाता की एक श्रृंखला निर्यात की जाती है। क्रेडेंशियल प्रदाता साइन-इन और साइन-अप तर्क दोनों को संभालता है:यह जांचता है कि उपयोगकर्ता रेडिस में मौजूद है या नहीं और या तो उनके पासवर्ड को मान्य करता है या एक नया उपयोगकर्ता बनाता है। यदि साइन इन किया जाता है, तो यह संग्रहीत पासवर्ड के साथ दिए गए पासवर्ड (यादृच्छिक स्ट्रिंग का उपयोग करके हैश किया गया) की तुलना करता है; यदि साइन अप किया जाता है, तो यह अपस्टैश रेडिस में एक नई उपयोगकर्ता प्रविष्टि बनाता है। कोड उपयोगकर्ता डेटा भंडारण के लिए अपस्टैश रेडिस का उपयोग करता है और यह सुनिश्चित करता है कि प्रक्रिया यूआरएल में प्रकार पैरामीटर के आधार पर साइन-अप या साइन-इन मोड में की जाती है।

प्रमाणीकरण एपीआई रूट सेट करें (Auth.js द्वारा संचालित)

<पी> route.ts नाम की एक फ़ाइल बनाएं app/api/auth/[...nextauth] में निम्नलिखित कोड वाली निर्देशिका:

// File: app/api/auth/[...nextauth]/route.ts
 
export const runtime = 'edge'
 
import { handlers } from '@/lib/auth'
 
export const { GET, POST } = handlers
<पी> उपरोक्त कोड में, दो एंडपॉइंट हैंडलर GET और POST निर्यात किए जाते हैं जिन्हें handlers द्वारा नियंत्रित किया जाता है फ़ंक्शन @/lib/auth.ts से निर्यात किया गया फ़ाइल.

<पी> route.ts नाम की एक फ़ाइल बनाएं app/api/refresh में निम्नलिखित कोड वाली निर्देशिका:

// File: app/api/refresh/route.ts
 
export const runtime = 'edge'
 
export const dynamic = 'force-dynamic'
 
export const fetchCache = 'force-no-store'
 
import { auth } from '@/lib/auth'
import redis from '@/lib/redis'
import { UserType } from '@/lib/types'
import { encode } from '@auth/core/jwt'
import { cookies } from 'next/headers'
import { NextResponse } from 'next/server'
 
export async function GET(request: Request) {
 const useSecureCookie = request.url.startsWith('https:')
 const salt = useSecureCookie ? '__Secure-authjs.session-token' : 'authjs.session-token'
 if (!process.env.AUTH_SECRET) return new NextResponse(null, { status: 500 })
 const [session, cookieStore] = await Promise.all([auth(), cookies()])
 if (!session?.user?.email) return new NextResponse(null, { status: 400 })
 const userByEmail = await redis.get(`user:email:${session.user.email}`)
 const userData = await redis.get<UserType>(`user:${userByEmail}`)
 if (!userData?.email) cookieStore.set(salt, toString(), { secure: useSecureCookie, path: '/', httpOnly: true, sameSite: 'lax', maxAge: 0 })
 else {
 const { image, password, ...rest } = userData
 const saltVal = await encode({ salt, secret: process.env.AUTH_SECRET, token: { ...rest, picture: image } })
 cookieStore.set(salt, saltVal, { secure: useSecureCookie, path: '/', httpOnly: true, sameSite: 'lax' })
 }
 return new NextResponse()
}
<पी> उपरोक्त कोड में, उपयोगकर्ता के सत्र को ताज़ा करने के लिए एक एज-संगत एपीआई मार्ग बनाया जा रहा है। यह Redis से उपयोगकर्ता सत्र और संबंधित डेटा प्राप्त करता है, उपयोगकर्ता के ईमेल को सत्यापित करता है, और सत्र कुकी को अपडेट करता है। यदि उपयोगकर्ता डेटा अमान्य या अनुपलब्ध है, तो सत्र कुकी साफ़ कर दी जाती है; अन्यथा, एक नया हस्ताक्षरित टोकन उत्पन्न होता है और कुकी में संग्रहीत होता है।

<पी> route.ts नाम की एक फ़ाइल बनाएं app/api/user में निम्नलिखित कोड वाली निर्देशिका:

// File: app/api/user/route.ts
 
export const runtime = 'edge'
 
export const dynamic = 'force-dynamic'
 
export const fetchCache = 'force-no-store'
 
import { auth } from '@/lib/auth'
import redis from '@/lib/redis'
import { UserType } from '@/lib/types'
import { NextResponse } from 'next/server'
 
export async function POST(request: Request) {
 try {
 const session = await auth()
 if (!session?.user?.email) return new NextResponse(null, { status: 400 })
 const body = await request.json()
 const userByEmail = await redis.get(`user:email:${session.user.email}`)
 const userData = await redis.get<UserType>(`user:${userByEmail}`)
 if (!userData) return new NextResponse(null, { status: 404 })
 if (body.name) userData.name = body.name
 if (body.image) userData.image = body.image
 await redis.set(`user:${userByEmail}`, userData)
 return new NextResponse()
 } catch (e: any) {
 const message = e.message || e.toString()
 console.log(message)
 return new NextResponse(message, { status: 500 })
 }
}
<पी> उपरोक्त कोड में, उपयोगकर्ता डेटा को अपडेट करने के लिए एक एज-संगत एपीआई रूट बनाया जा रहा है। यह उपयोगकर्ता को प्रमाणित करता है, उनके ईमेल का उपयोग करके रेडिस से उनका डेटा प्राप्त करता है, और अनुरोध निकाय के आधार पर उनकी जानकारी (जैसे, नाम या छवि) को अपडेट करता है। यदि उपयोगकर्ता नहीं मिलता है या कोई त्रुटि होती है, तो उचित स्थिति कोड और प्रतिक्रियाएं लौटा दी जाती हैं।

Auth.js के साथ Next.js मिडिलवेयर सेट करें

<पी> middleware.ts नाम की एक फ़ाइल बनाएं निम्नलिखित कोड के साथ अपने प्रोजेक्ट की मूल निर्देशिका में:

// File: middleware.ts
 
export { auth as middleware } from '@/lib/auth'
 
export const config = {
 matcher: ['/((?!api|_next/static|_next/image|favicon.ico).*)'],
}
<पी> उपरोक्त कोड में, auth को पुनः निर्यात करके मिडलवेयर बनाया जाता है @/lib/auth से कार्य करें मॉड्यूल. मिडलवेयर matcher द्वारा निर्दिष्ट एपीआई मार्गों, स्थिर फ़ाइलों, छवि संपत्तियों और फ़ेविकॉन को छोड़कर सभी मार्गों पर प्रमाणीकरण लागू करता है। विन्यास. यह सुनिश्चित करता है कि गैर-बहिष्कृत मार्ग Auth.js के साथ सेट प्रमाणीकरण तर्क द्वारा संरक्षित हैं।

Next.js ऐप राउटर घटकों में Auth.js का उपयोग करें

<पी> NextAuthProvider.tsx नाम की एक फ़ाइल बनाएं app में निम्नलिखित कोड वाली निर्देशिका:

// File: app/NextAuthProvider.tsx
 
'use client'
 
import { SessionProvider } from 'next-auth/react'
 
type Props = {
 children?: React.ReactNode
}
 
export default function ({ children }: Props) {
 return <SessionProvider>{children}</SessionProvider>
}
<पी> उपरोक्त कोड में, नेक्स्टऑथ के SessionProvider के साथ एप्लिकेशन को लपेटने के लिए एक क्लाइंट-साइड रिएक्ट घटक बनाया गया है। . घटक children स्वीकार करता है प्रॉप्स के रूप में और यह सुनिश्चित करता है कि लपेटे गए घटकों के पास NextAuth द्वारा प्रदान किए गए उपयोगकर्ता सत्र संदर्भ तक पहुंच हो। Next.js.

में एप्लिकेशन में प्रमाणीकरण स्थिति को प्रबंधित करने के लिए यह सेटअप आवश्यक है <पी> csrf.tsx नाम की एक फ़ाइल बनाएं app में निम्नलिखित कोड वाली निर्देशिका:

// File: app/csrf.tsx
 
'use client'
 
import { getCsrfToken } from 'next-auth/react'
import { useEffect, useState } from 'react'
 
export function CSRFInput() {
 const [csrfToken, setCsrfToken] = useState<string>()
 useEffect(() => {
 getCsrfToken().then((res) => setCsrfToken(res))
 }, [])
 return <input type="hidden" name="csrfToken" defaultValue={csrfToken} />
}
<पी> उपरोक्त कोड में, एक क्लाइंट-साइड रिएक्ट घटक निर्यात किया जाता है जो नेक्स्टऑथ के getCsrfToken का उपयोग करके एक सीएसआरएफ टोकन प्राप्त करता है। फ़ंक्शन करता है और इसे एक स्टेट वेरिएबल में संग्रहीत करता है। घटक सीएसआरएफ टोकन युक्त एक छिपे हुए इनपुट फ़ील्ड को प्रस्तुत करता है, जो टोकन को एक छिपे हुए मूल्य के रूप में शामिल करके सुरक्षित फॉर्म सबमिशन की अनुमति देता है। यह क्रॉस-साइट अनुरोध जालसाजी हमलों से बचाने के लिए उपयोगी है।

<पी> provider.tsx नाम की एक फ़ाइल बनाएं app में निम्नलिखित कोड वाली निर्देशिका:

// File: app/provider.tsx
 
'use client'
 
import { Button } from '@/components/ui/button'
import { Icon } from '@iconify/react'
import { signIn } from 'next-auth/react'
 
export default function ({ provider, prefix }: { prefix: string; provider: { name: string; id: string } }) {
 return (
 <Button onClick={() => signIn(provider.id)} key={provider.name} variant="outline" className="flex w-full gap-x-3">
 {provider.id === 'google' && <Icon fontSize={18} icon="flat-color-icons:google" />}
 <span className="text-black">
 {prefix} with {provider.name}
 </span>
 </Button>
 )
}
<पी> उपरोक्त कोड में, विभिन्न प्रमाणीकरण प्रदाताओं के लिए अनुकूलन योग्य साइन-इन बटन प्रस्तुत करने के लिए एक रिएक्ट घटक निर्यात किया जाता है। यह provider स्वीकार करता है (name युक्त और id ) और prefix सहारा के रूप में. बटन signIn को ट्रिगर करता है निर्दिष्ट प्रदाता के लिए फ़ंक्शन और प्रदाता के id के आधार पर गतिशील रूप से एक आइकन और लेबल प्रदर्शित करता है .

<पी> layout.tsx नाम की फ़ाइल को अपडेट करें app में निम्नलिखित कोड वाली निर्देशिका:

// File: app/layout.tsx
 
import './globals.css'
import NextAuthProvider from './NextAuthProvider'
 
export default function ({
 children,
}: Readonly<{
 children: React.ReactNode
}>) {
 return (
 <html lang="en">
 <body className="bg-white text-black antialiased">
 <NextAuthProvider>
 <div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 flex flex-col">{children}</div>
 </NextAuthProvider>
 </body>
 </html>
 )
}
<पी> उपरोक्त कोड में, Next.js लेआउट पूरे पृष्ठ को वैश्विक शैलियों और प्रमाणीकरण संदर्भ में लपेट रहा है। यह globals.css आयात करता है वैश्विक स्टाइल और NextAuthProvider के लिए प्रमाणीकरण स्थिति प्रबंधित करने के लिए. children प्रोप नेस्टेड पृष्ठ सामग्री का प्रतिनिधित्व करता है, जो प्रतिक्रियाशील पैडिंग और अधिकतम चौड़ाई के साथ एक स्टाइल कंटेनर में लपेटा गया है, जो सभी पृष्ठों के लिए एक सुसंगत लेआउट प्रदान करता है।

उपयोगकर्ता प्रमाणीकरण स्थिति को क्लाइंट-साइड पेज में लोड करें

<पी> page.tsx नाम की फ़ाइल को अपडेट करें app में निम्नलिखित कोड वाली निर्देशिका:

// File: app/page.tsx
 
'use client'
 
import { signOut, useSession } from 'next-auth/react'
 
export default function () {
 const { data, status } = useSession()
 return (
 <>
 {JSON.stringify({ data, status })}
 <button onClick={() => signOut()}>Sign Out</button>
 </>
 )
}
<पी> उपरोक्त कोड में, एक क्लाइंट-साइड रिएक्ट घटक जो उपयोगकर्ता के सत्र डेटा को प्रदर्शित करता है और "साइन आउट" बटन प्रदान करता है, निर्यात किया जाता है। यह NextAuth के useSession का उपयोग करता है सत्र डेटा और स्थिति को पुनः प्राप्त करने के लिए हुक, उन्हें JSON स्ट्रिंग के रूप में प्रदर्शित करें। signOut जब बटन क्लिक किया जाता है तो फ़ंक्शन को कॉल किया जाता है, जिससे उपयोगकर्ता को लॉग आउट करने की अनुमति मिलती है।

एक गतिशील साइन-इन पेज बनाएं (Auth.js का उपयोग करके)

<पी> page.tsx नाम की एक फ़ाइल बनाएं app/signin में निम्नलिखित कोड वाली निर्देशिका:

// File: app/signin/page.tsx
 
export const runtime = 'edge'
 
import { CSRFInput } from '@/app/csrf'
import Provider from '@/app/provider'
import { Button } from '@/components/ui/button'
import { Input } from '@/components/ui/input'
import { Label } from '@/components/ui/label'
import { auth } from '@/lib/auth'
import providers from '@/lib/providers'
import { unstable_noStore } from 'next/cache'
import Link from 'next/link'
import { redirect } from 'next/navigation'
 
export default async function () {
 unstable_noStore()
 const session = await auth()
 if (session) redirect('/')
 return (
 <div className="border md:border-white/10 flex items-center justify-center py-12">
 <div className="mx-auto grid w-[350px] gap-6">
 <div className="grid gap-2 text-center">
 <h1 className="text-3xl font-bold">Sign In</h1>
 <p className="text-balance text-muted-foreground">Enter your email below to sign in to your account</p>
 </div>
 {providers
 .filter((provider) => (typeof provider === 'function' ? provider({}).id : provider.id) !== 'credentials')
 .map((provider) => (
 <Provider
 prefix="Sign in"
 key={typeof provider === 'function' ? provider({}).name : provider.name}
 provider={typeof provider === 'function' ? provider({}) : provider}
 />
 ))}
 <p className="text-gray-300 text-xs text-center">OR</p>
 <form method="POST" className="grid gap-4" action="/api/auth/callback/credentials?kind=in">
 <div className="grid gap-2">
 <Label htmlFor="email">Email</Label>
 <Input name="email" id="email" type="email" placeholder="m@example.com" required />
 </div>
 <div className="grid gap-2">
 <Label htmlFor="password">Password</Label>
 <Input name="password" id="password" type="password" required />
 <CSRFInput />
 </div>
 <Button type="submit" className="w-full">
 Sign In
 </Button>
 </form>
 <div className="mt-4 text-center text-sm">
 Don&apos;t have an account?{' '}
 <Link href="/signup" className="underline">
 Sign up
 </Link>
 </div>
 </div>
 </div>
 )
}
<पी> उपरोक्त कोड में, एक साइन-इन पेज बनाया जा रहा है। यह जाँचता है कि कोई उपयोगकर्ता सत्र पहले से मौजूद है या नहीं; यदि हां, तो यह मुखपृष्ठ पर पुनर्निर्देशित हो जाता है। पृष्ठ एक साइन-इन फॉर्म प्रदर्शित करता है जहां उपयोगकर्ता विभिन्न प्रदाताओं का उपयोग करके साइन इन करने के विकल्पों के साथ-साथ अपना ईमेल और पासवर्ड दर्ज कर सकते हैं। इसमें सुरक्षा के लिए सीएसआरएफ टोकन और नए उपयोगकर्ताओं के लिए साइन-अप पेज का लिंक भी शामिल है।

एक गतिशील साइन-अप पेज बनाएं (Auth.js का उपयोग करके)

<पी> page.tsx नाम की एक फ़ाइल बनाएं app/signup में निम्नलिखित कोड वाली निर्देशिका:

// File: app/signup/page.tsx
 
export const runtime = 'edge'
 
import { CSRFInput } from '@/app/csrf'
import Provider from '@/app/provider'
import { Button } from '@/components/ui/button'
import { Input } from '@/components/ui/input'
import { Label } from '@/components/ui/label'
import { auth } from '@/lib/auth'
import providers from '@/lib/providers'
import { unstable_noStore } from 'next/cache'
import Link from 'next/link'
import { redirect } from 'next/navigation'
 
export default async function () {
 unstable_noStore()
 const session = await auth()
 if (session) redirect('/')
 return (
 <div className="border md:border-white/10 flex items-center justify-center py-12">
 <div className="mx-auto grid w-[350px] gap-6">
 <div className="grid gap-2 text-center">
 <h1 className="text-3xl font-bold">Sign Up</h1>
 <p className="text-balance text-muted-foreground">Enter your email below to sign up with an account</p>
 </div>
 {providers
 .filter((provider) => (typeof provider === 'function' ? provider({}).id : provider.id) !== 'credentials')
 .map((provider) => (
 <Provider
 prefix="Sign up"
 key={typeof provider === 'function' ? provider({}).name : provider.name}
 provider={typeof provider === 'function' ? provider({}) : provider}
 />
 ))}
 <p className="text-gray-300 text-xs text-center">OR</p>
 <form method="POST" className="grid gap-4" action="/api/auth/callback/credentials?kind=up">
 <div className="grid gap-2">
 <Label htmlFor="email">Email</Label>
 <Input name="email" id="email" type="email" placeholder="m@example.com" required />
 </div>
 <div className="grid gap-2">
 <div className="flex items-center">
 <Label htmlFor="password">Password</Label>
 </div>
 <Input name="password" id="password" type="password" required />
 <CSRFInput />
 </div>
 <Button type="submit" className="w-full">
 Sign Up
 </Button>
 </form>
 <div className="mt-4 text-center text-sm">
 Don&apos;t have an account?{' '}
 <Link href="/signin" className="underline">
 Sign In
 </Link>
 </div>
 </div>
 </div>
 )
}
<पी> उपरोक्त कोड में, एक साइन-अप पेज बनाया जा रहा है। यह जाँचता है कि कोई उपयोगकर्ता सत्र पहले से मौजूद है या नहीं; यदि हां, तो यह मुखपृष्ठ पर पुनर्निर्देशित हो जाता है। पृष्ठ एक साइन-अप फ़ॉर्म प्रदर्शित करता है जहां उपयोगकर्ता विभिन्न प्रदाताओं का उपयोग करके साइन इन करने के विकल्पों के साथ-साथ अपना ईमेल और पासवर्ड दर्ज कर सकते हैं। इसमें सुरक्षा के लिए सीएसआरएफ टोकन और मौजूदा उपयोगकर्ताओं के लिए साइन-इन पेज का लिंक भी शामिल है।

<पी> वह बहुत कुछ सीखने वाला था! अब आपका काम पूरा हो गया है ✨

संदर्भ

<पी> अधिक विस्तृत जानकारी के लिए, इस ब्लॉग में उद्धृत संदर्भ देखें।

  • गिटहब रिपॉजिटरी
  • Auth.js - क्रेडेंशियल प्रमाणीकरण
  • Auth.js - अपस्टैश रेडिस एडाप्टर
  • Next.js - कुकीज़

निष्कर्ष

<पी> इस ट्यूटोरियल में, आपने सीखा कि Auth.js और Upstash Redis का उपयोग करके Next.js एप्लिकेशन में उपयोगकर्ता प्रमाणीकरण कैसे लागू किया जाए। आपने पर्यावरण चर का सेटअप, रेडिस क्लाइंट का निर्माण और एक कस्टम प्रमाणीकरण प्रदाता का कार्यान्वयन सीखा। इसके अतिरिक्त, आपने सीखा कि उपयोगकर्ता साइन-इन और साइन-अप प्रक्रियाओं के साथ-साथ सत्र प्रबंधन को संभालने के लिए नेक्स्ट.जेएस में एपीआई रूट कैसे सेट अप करें। इन चरणों का पालन करके, आप अपस्टैश रेडिस के साथ अपने Next.js अनुप्रयोगों में उपयोगकर्ता प्रमाणीकरण और डेटा भंडारण को प्रभावी ढंग से प्रबंधित कर सकते हैं।


  1. HTML  विकल्प  अक्षम विशेषता HTML <विकल्प> अक्षम विशेषता

    तत्व की अक्षम विशेषता का उपयोग विकल्पों की सूची से अक्षम विकल्प को सेट करने के लिए किया जाता है। उसके बाद, अक्षम विकल्प क्लिक करने योग्य नहीं होगा। सिंटैक्स निम्नलिखित वाक्य रचना है - <option disabled> उदाहरण आइए अब तत्व की अक्षम विशेषता को लागू करने के लिए एक उदाहरण देखें - <!DOCTYPE ht

  1. HTML फ़ाइल का निरीक्षण और विश्लेषण कैसे करें:एक चरण-दर-चरण मार्गदर्शिका HTML फ़ाइल का निरीक्षण और विश्लेषण कैसे करें:एक चरण-दर-चरण मार्गदर्शिका

    HTML फ़ाइल को डिकम्पाइल करने से तात्पर्य वेबपेज बनाने वाले स्रोत कोड की जांच करने और समझने से है। संकलित प्रोग्रामिंग भाषाओं के विपरीत, HTML पहले से ही मानव-पठनीय प्रारूप में है, जो इसे विश्लेषण और सीखने के उद्देश्यों के लिए आसानी से सुलभ बनाता है। इस लेख में, हम HTML फ़ाइल सामग्री की जांच करने और

  1. लिनक्स के लिए शीर्ष 5 पीडीएफ पेज क्रॉपिंग टूल:कुशल, विश्वसनीय और मुफ्त लिनक्स के लिए शीर्ष 5 पीडीएफ पेज क्रॉपिंग टूल:कुशल, विश्वसनीय और मुफ्त

    पोर्टेबल दस्तावेज़ प्रारूप (पीडीएफ ) एक व्यापक रूप से मान्यता प्राप्त और शायद आज सबसे अधिक उपयोग किया जाने वाला फ़ाइल प्रारूप है, विशेष रूप से सॉफ़्टवेयर, हार्डवेयर, या अधिक महत्वपूर्ण रूप से, ऑपरेटिंग सिस्टम की परवाह किए बिना दस्तावेज़ों की विश्वसनीय प्रस्तुति और साझाकरण के लिए। यह इलेक्ट्रॉनिक दस