<पी> अपस्टैश ब्लॉग पर हमारे अंतिम गाइड के बाद बाइट्स न्यूज़लेटर पर एक स्थान प्राप्त हुआ , मैंने सोचा कि हम SvelteKit पार्टी को जारी रखेंगे। <पी> एक स्वेल्ट सुपर फैन के रूप में, मैं हर दिन अधिक से अधिक लोगों को बोर्ड पर कूदते हुए देख रहा हूं - और यह मुझे भविष्य के लिए अविश्वसनीय रूप से उत्साहित करता है। <पी> लूसिया उन उपकरणों में से एक है जो अभी भी रडार के नीचे उड़ रहा है। <पी> इस गाइड में मैं आपको दिखाने जा रहा हूं कि लूसिया के साथ प्रमाणीकरण कैसे प्राप्त करें और कैसे चलाएं। हम अपनी डेटाबेस आवश्यकताओं के लिए प्लैनेटस्केल और सत्रों को संभालने के लिए अपस्टैश रेडिस का उपयोग करेंगे। <पी> नीचे इस गाइड के लिए हमारे अंतिम लक्ष्य का एक स्क्रीनशॉट है। आप उदाहरण भंडार यहां पा सकते हैं। <पी>
<पी> यह मार्गदर्शिका SvelteKit में होगी, लेकिन चूंकि लूसिया किसी भी ढांचे का समर्थन करती है, इसलिए इस मार्गदर्शिका का अधिकांश भाग आसानी से किसी भी लोकप्रिय ढांचे पर लागू किया जा सकता है। लूसिया क्या है?
<पी> सीधे शब्दों में कहें तो, लूसिया टाइपस्क्रिप्ट के लिए एक लाइब्रेरी है जो उपयोगकर्ताओं और सत्रों को संभालना आसान बना देती है। मूल रूप से, यह लाइब्रेरी SvelteKit के लिए बनाई गई थी, लेकिन यह लगातार विकसित हुई है और अब किसी भी ढांचे के साथ अच्छी तरह से खेलने के लिए पर्याप्त बहुमुखी है। <पी> लूसिया के बारे में बहुत बढ़िया बात यह है कि यह आपको उपयोगकर्ता अनुभव का त्याग किए बिना प्रमाणीकरण की जटिलता को प्रबंधित करने के लिए आवश्यक हर चीज से लैस करती है। लूसिया को आदिमों के एक सेट के रूप में सोचें - यह आप पर निर्भर है कि आप अपने कोड को कैसे संरचित करना चाहते हैं और उपयोगकर्ता अनुभव को कैसे संभालना चाहते हैं। लूसिया में कुछ प्रमुख भाग हैं जिन्हें समझना महत्वपूर्ण है: <पी> मिडिलवेयर लूसिया को विभिन्न रूपरेखाओं और रनटाइम के लिए अनुरोध और प्रतिक्रिया को पढ़ने की अनुमति देता है। <पी> यहां एक उदाहरण दिया गया है कि आप मिडलवेयर को कैसे कॉन्फ़िगर करेंगे: import { lucia } from "lucia";
import { node } from "lucia/middleware";
// import { nextjs } from "lucia/middleware";
// import { h3 } from "lucia/middleware";
export const auth = lucia({
env: "DEV", // "PROD" if deployed to HTTPS
middleware: node(),
});
<पी> डेटाबेस एडाप्टर लूसिया को उपयोगकर्ताओं और सत्रों को संग्रहीत और पुनः प्राप्त करने की अनुमति दें। एडॉप्टर प्रदान करके लूसिया जानती है कि इन प्रकारों के लिए क्वेरी कैसे की जाती है। एडॉप्टर 2 प्रकार के होते हैं; नियमित एडेप्टर, और सत्र एडेप्टर। इस विशेष गाइड में हम अपने उपयोगकर्ताओं को संग्रहीत करने के लिए प्लैनेटस्केल पर होस्ट किए गए MySQL डेटाबेस और सत्रों को संभालने के लिए अपस्टैश पर होस्ट किए गए रेडिस इंस्टेंस का उपयोग करने जा रहे हैं। <पी> यहां एक उदाहरण दिया गया है कि आप डेटाबेस एडाप्टर को कैसे कॉन्फ़िगर करेंगे: import { prisma } from "@lucia-auth/adapter-prisma";
import { PrismaClient } from "@prisma/client";
import { lucia } from "lucia";
const client = new PrismaClient();
const auth = lucia({
env: "DEV",
adapter: prisma(client),
});
<पी> उस पृष्ठभूमि की जानकारी के साथ, आइए सीधे आगे बढ़ें। आवश्यकताएँ
<पी> ऐप के साथ आगे बढ़ने और उसका अनुसरण करने के लिए आपको यह करना होगा: - SvelteKit की एक बुनियादी समझ। प्रपत्रों को संभालना और रूटिंग करना एक प्लस है।
- ड्रिज़ल ओआरएम से बुनियादी परिचय।
- PlanetScale पर एक खाता और डेटाबेस।
- उदाहरण के लिए Redis इंस्टेंस तक पहुंच, अपस्टैश Redis।
आरंभ करना
<पी> दक्षता के लिए, हम संपूर्ण एप्लिकेशन को नए सिरे से नहीं बनाएंगे। <पी> इसके बजाय, आप sveltekit-lucia-redis को क्लोन कर सकते हैं अपस्टैश उदाहरण रेपो से निर्देशिका का अनुसरण करें। <पी> रिपॉजिटरी डाउनलोड करने के बाद, cd का उपयोग करके एप्लिकेशन में नेविगेट करें अपने पसंदीदा पैकेज मैनेजर के माध्यम से निर्भरता को कमांड और इंस्टॉल करें और .env सेट करें .env.example की नकल करके वेरिएबल . मुख्य भागों को समझना
<पी> यहां सभी महत्वपूर्ण भागों का त्वरित विवरण दिया गया है। src/lib/server/auth/index.ts - यहीं पर हम लूसिया को कॉन्फ़िगर करते हैं।
src/lib/server/drizzle - ड्रिज़ल हमें आसानी से एक MySQL स्कीमा बनाने में मदद करता है जिसे हम ड्रिज़ल किट का उपयोग करके आसानी से प्लैनेटस्केल पर भेज सकते हैं।
src/lib/server/planetscale - अपस्टैश क्लाइंट को निर्यात करता है जिसका उपयोग हम उपयोगकर्ताओं को प्रबंधित करने के लिए अपने लूसिया एडाप्टर कॉन्फ़िगरेशन में करते हैं।
src/lib/server/upstash - अपस्टैश क्लाइंट को निर्यात करता है जिसका उपयोग हम सत्रों को प्रबंधित करने के लिए अपने लूसिया एडाप्टर कॉन्फ़िगरेशन में करते हैं।
कोड को तोड़ना
लूसिया को कॉन्फ़िगर करना
<पी> पहली चीज़ जो हमें करने की ज़रूरत है वह लूसिया को कॉन्फ़िगर करना है। हम src/lib/server/auth/index.ts में एक नई फ़ाइल बनाकर ऐसा कर सकते हैं . src/lib/server/auth/index.tsimport { planetscale } from "@lucia-auth/adapter-mysql";
import { dev } from "$app/environment";
import { lucia } from "lucia";
import { sveltekit } from "lucia/middleware";
import { ps } from "../planetscale";
export enum PROVIDER_ID {
EMAIL = "email",
}
export const auth = lucia({
adapter: {
user: planetscale(ps, {
user: "users",
key: "keys",
/**
* Sessions are handled by Upstash Redis.
*/
session: null,
}),
},
middleware: sveltekit(),
env: dev ? "DEV" : "PROD",
getUserAttributes: (data) => {
return {
userId: data.id,
email: data.email,
};
},
});
export type Auth = typeof auth;
<पी> यहां क्या हो रहा है इसका एक त्वरित विवरण यहां दिया गया है: <पी> हम lucia आयात करते हैं lucia से कार्य करें लूसिया के लिए कॉन्फ़िगरेशन स्थापित करने के लिए पैकेज। <पी> पहली चीज़ जो हम करते हैं वह है adapter को कॉन्फ़िगर करना संपत्ति. यहीं पर हम लूसिया को बताते हैं कि उपयोगकर्ताओं और सत्रों को कैसे संभालना है। <पी> हमने सत्र गुण को null पर सेट किया है क्योंकि हम सत्रों को संभालने के लिए रेडिस का उपयोग करना चाहते हैं। यदि आप स्ट्रिंग 'session' का उपयोग करेंगे इसके बजाय, लूसिया उपयोगकर्ताओं और सत्रों दोनों के लिए एक ही एडाप्टर का उपयोग करेगी (ये स्ट्रिंग आपके डेटाबेस में तालिकाओं के अनुरूप हैं)। <पी> अभी सेशन एडॉप्टर के बारे में चिंता न करें, हम उस पर बाद में विचार करेंगे। <पी> middleware में संपत्ति हम लूसिया को बता सकते हैं कि हम SvelteKit का उपयोग कर रहे हैं। यह लूसिया को अनुरोध और प्रतिक्रिया ऑब्जेक्ट को पढ़ने की अनुमति देगा। <पी> निर्यातित Auth पर ध्यान दें प्रकार. यह हमारे auth का प्रकार है वस्तु. हमें SvelteKit लोकल सेट अप करने के लिए इसकी आवश्यकता होगी। लूसिया के साथ बढ़िया प्रकार का अनुमान प्राप्त करना
<पी> लूसिया को टाइपस्क्रिप्ट में लिखा गया है, इसलिए आपको बॉक्स से बेहतरीन प्रकार का अनुमान मिलता है। आइए सुनिश्चित करें कि SvelteKit को Auth के बारे में पता है वह प्रकार जिसे हमने अभी बनाया है। <पी> अपना app.d.ts खोलें फ़ाइल करें और निम्नलिखित जोड़ें: src/app.d.tsimport type { Auth as LuciaAuth } from "$lib/server/auth";
import type { AuthRequest, Session, User } from "lucia";
declare global {
namespace App {
// interface Error {}
interface Locals {
auth: AuthRequest;
session: Session | null;
}
interface PageData {
user?: User;
}
// interface Platform {}
}
}
/// <reference types="lucia" />
declare global {
namespace Lucia {
type Auth = LuciaAuth;
type DatabaseUserAttributes = {
email: string;
};
type DatabaseSessionAttributes = {};
}
}
export {};
<पी> Auth जोड़कर Lucia पर टाइप करें नेमस्पेस, अब हम auth तक पहुंच सकते हैं locals से ऑब्जेक्ट हमारे SvelteKit मार्गों में ऑब्जेक्ट। <पी> लेकिन लूसिया से आयातित किसी भी चीज़ का अब सही प्रकार भी होगा। <पी> अब जब हमारे पास ये प्रकार हैं, तो हम hooks.server.ts सेट कर सकते हैं . यहीं पर हम AuthRequest को बाइंड करेंगे और Session वर्तमान अनुरोध पर आपत्ति। <पी> इससे इसे locals के माध्यम से सर्वर पर आसानी से एक्सेस किया जा सकेगा . src/hooks.server.tsimport type { Handle } from "@sveltejs/kit";
import { sequence } from "@sveltejs/kit/hooks";
import { auth } from "$lib/server";
const auth_handle: Handle = async ({ event, resolve }) => {
event.locals.auth = auth.handleRequest(event);
event.locals.session = await event.locals.auth.validate();
return resolve(event);
};
export const handle = sequence(auth_handle);
<पी> हम sequence भी आयात करेंगे जो एक सहायक फ़ंक्शन है जो हमें क्रम में कई हुक चलाने की अनुमति देता है। यह बाद में तब उपयोगी होगा जब हम अपने मार्गों को सुरक्षित रखने का प्रयास करेंगे। उपयोगकर्ता मॉडल बनाना
<पी> अब जबकि हमने लूसिया को कॉन्फ़िगर कर लिया है, हम अपना उपयोगकर्ता मॉडल बना सकते हैं। <पी> हम ड्रिज़ल ओआरएम का उपयोग करेंगे, क्योंकि अभी बहुत गर्मी है। <पी>
<पी> और उनके मीम्स मुद्दे पर हैं। बस इसे देखो. पी> <पी> इससे पहले कि आप जारी रख सकें, आपको प्लैनेटस्केल पर एक डेटाबेस बनाना होगा। और ड्रिज़ल कॉन्फ़िग फ़ाइल सेटअप करें। इससे ड्रिज़ल सीएलआई को आपके डेटाबेस से जुड़ने में मदद मिलेगी। drizzle.config.tsimport dotenv from "dotenv";
import type { Config } from "drizzle-kit";
dotenv.config();
const username = process.env.DATABASE_USERNAME;
const password = process.env.DATABASE_PASSWORD;
const host = process.env.DATABASE_HOST;
const db = process.env.DATABASE_NAME;
const connectionString = `mysql://${username}:${password}@${host}/${db}?ssl={"rejectUnauthorized":true}`;
export default {
schema: "./src/lib/server/drizzle/schema/index.ts",
driver: "mysql2",
dbCredentials: {
connectionString: connectionString,
},
} satisfies Config;
<पी> क्योंकि हम MySQL एडाप्टर का उपयोग कर रहे हैं, लूसिया को उम्मीद है कि हमारे उपयोगकर्ता मॉडल में एक विशिष्ट संरचना होगी। आप इसके बारे में दस्तावेज़ों में अधिक जानकारी पा सकते हैं। <पी> निम्नलिखित कोड को src/lib/server/drizzle/schema/index.ts में रखें . src/lib/server/dizzle/schema/index.tsimport { relations } from "drizzle-orm";
import {
bigint,
datetime,
index,
int,
mysqlEnum,
mysqlTable,
timestamp,
unique,
varchar,
} from "drizzle-orm/mysql-core";
export const users = mysqlTable(
"users",
{
id: varchar("id", { length: 255 }).primaryKey(),
createdAt: timestamp("createdAt").defaultNow().onUpdateNow().notNull(),
updatedAt: timestamp("updatedAt").defaultNow().onUpdateNow().notNull(),
email: varchar("email", { length: 191 }).notNull(),
},
(table) => {
return {
idIdx: index("users_id_idx").on(table.id),
userIdKey: unique("users_id_key").on(table.id),
};
},
);
export const keys = mysqlTable(
"keys",
{
id: varchar("id", { length: 255 }).primaryKey(),
hashedPassword: varchar("hashed_password", { length: 255 }),
userId: varchar("user_id", { length: 255 }).notNull(),
},
(table) => {
return {
userIdIdx: index("keys_user_id_idx").on(table.userId),
keyIdKey: unique("keys_id_key").on(table.id),
};
},
);
<पी> और pnpm drizzle-kit push:mysql चलाएँ स्कीमा को प्लैनेटस्केल पर धकेलने के लिए। <पी> वोइला! अब आपके पास एक उपयोगकर्ता मॉडल है जिसका उपयोग लूसिया उपयोगकर्ताओं को प्रबंधित करने के लिए कर सकती है। सत्र प्रबंधन स्थापित करना
<पी> अब जबकि हमारे पास अपना उपयोगकर्ता मॉडल है, हम सत्र प्रबंधन स्थापित कर सकते हैं। <पी> हम सत्रों को संभालने के लिए अपस्टैश रेडिस का उपयोग करेंगे। आप यहां निःशुल्क खाते के लिए साइन अप कर सकते हैं। <पी>
<पी> एक बार जब आप डैशबोर्ड में आ जाएं, तो आपको बस एक नया डेटाबेस बनाना होगा और पर्यावरण चर की प्रतिलिपि बनाना होगा। <पी>
<पी> अब इन वेरिएबल्स को अपने .env में जोड़ें फ़ाइल. और निम्नलिखित को src/lib/server/upstash/index.ts में जोड़ें . src/lib/server/upstash/index.tsimport { Redis } from "@upstash/redis";
import {
UPSTASH_REDIS_REST_TOKEN,
UPSTASH_REDIS_REST_URL,
} from "$env/static/private";
export const upstashClient = new Redis({
url: UPSTASH_REDIS_REST_URL,
token: UPSTASH_REDIS_REST_TOKEN,
});
<पी> अब याद रखें जब हमने लूसिया को कॉन्फ़िगर किया था, तो हमने session सेट किया था null पर . ऐसा इसलिए है क्योंकि हम सत्रों को संभालने के लिए रेडिस का उपयोग करना चाहते हैं। हमारा कॉन्फिगरेशन अब इस तरह दिखता है: src/lib/server/auth/index.tsimport { planetscale } from "@lucia-auth/adapter-mysql";
import { upstash } from "@lucia-auth/adapter-session-redis";
import { dev } from "$app/environment";
import { lucia } from "lucia";
import { sveltekit } from "lucia/middleware";
import { ps } from "../planetscale";
import { upstashClient } from "../upstash";
export enum PROVIDER_ID {
EMAIL = "email",
}
export const auth = lucia({
adapter: {
user: planetscale(ps, {
user: "users",
key: "keys",
session: null,
}),
// Instruct Lucia to use Upstash Redis for sessions
session: upstash(upstashClient),
},
middleware: sveltekit(),
env: dev ? "DEV" : "PROD",
getUserAttributes: (data) => {
return {
userId: data.id,
email: data.email,
};
},
});
export type Auth = typeof auth;
<पी> हमारे लिए सौभाग्य की बात है कि लूसिया के पास बॉक्स से बाहर एक अपस्टैश रेडिस एडॉप्टर है। इसलिए हमें बस इसे आयात करना है और इसे अपस्टैश क्लाइंट को पास करना है। <पी> अब यह आसान था! मार्ग बनाना
<पी> अब जबकि हमने लूसिया को कॉन्फ़िगर कर लिया है, हम अपने मार्ग बना सकते हैं। <पी> src/routes में निम्नलिखित फ़ोल्डर बनाएं . फिलहाल किसी भी फाइल के बारे में चिंता न करें, हम थोड़ी देर में उन पर गौर करेंगे। src/routes/auth src/routes/auth/signin
src/routes/auth/signup
src/routes/app
<पी> टिप: एक ही फ़ोल्डर नाम या समूह के अंतर्गत कुछ "सुविधाएँ" होने से रीडायरेक्ट करते समय और मार्गों की सुरक्षा करते समय प्रबंधन करना आसान हो जाता है। साइनइन पेज बनाना
<पी> अंततः, हम कुछ फ्रंट-एंड कार्य कर सकते हैं! आइए साइनइन पेज से शुरुआत करें। <पी> src/routes/auth/signin/+page.svelte में एक नई फ़ाइल बनाएं . मैं अभी के लिए स्टाइल को छोड़ रहा हूं, और कार्यक्षमता पर ध्यान केंद्रित कर रहा हूं - लेकिन आप उदाहरण रिपॉजिटरी में पूरा कोड पा सकते हैं। src/routes/auth/signin/+page.svelte<script lang="ts">
import { enhance } from '$app/forms';
import { Button, Input, Label, PasswordInput } from '$lib/components/common';
import type { ActionData } from './$types';
export let form: ActionData;
let loading = false;
let email = '';
let password = '';
</script>
<form
method="POST"
use:enhance={() => {
loading = true;
return async ({ update }) => {
loading = false;
update();
};
}}
>
{#if form && form.error}
<div class="p-2 mb-4 text-sm text-center text-red-900 bg-red-200 rounded-sm">
Error: {form.error}
</div>
{/if}
<div class="grid gap-2.5">
<div class="grid gap-1">
<Label for="email">Email</Label>
<Input
bind:value={email}
name="email"
placeholder="Email"
type="email"
autoCapitalize="none"
autoComplete="email"
autoCorrect="off"
required={true}
/>
</div>
<div class="grid gap-1">
<Label for="password">Password</Label>
<PasswordInput name="password" placeholder="Password" bind:value={password} />
</div>
<div class="mt-6 col-span-full">
<Button type="submit" class="w-full" disabled={loading}>
{#if loading}
Loading...
{:else}
Sign in
{/if}
</Button>
</div>
</div>
</form>
<पी> use:enhance कार्रवाई फॉर्म को उत्तरोत्तर बेहतर बनाएगी, और फॉर्म सबमिट करते समय हमें लोडिंग स्थिति दिखाने की अनुमति देगी। आप यहां एन्हांस के बारे में अधिक पढ़ सकते हैं। <पी> बाकी कोड बहुत ही आत्म-व्याख्यात्मक है। साइनइन अनुरोध को संभालना
<पी> SvelteKit POST अनुरोधों को संभालना अविश्वसनीय रूप से आसान बनाता है। हमें बस एक फ़ाइल +page.server.ts बनानी है +page.svelte के समान निर्देशिका में actions फ़ाइल करें और निर्यात करें कम से कम default वाली वस्तु संपत्ति. src/routes/auth/signin/+page.server.tsimport { fail, redirect } from "@sveltejs/kit";
import { auth, PROVIDER_ID } from "$lib/server";
import { LuciaError } from "lucia";
import type { Actions, PageServerLoad } from "./$types";
export const actions = {
/* our actions here */
};
<पी> आइए फ़ाइल के इस भाग में प्रमुख तत्वों का पता लगाएं: <पी> हमने PROVIDER_ID आयात किया है एनम और auth src/lib/server/auth से , जो हमने पहले बनाया था। यह auth ऑब्जेक्ट में वे सभी विधियाँ शामिल हैं जिनकी हमें उपयोगकर्ताओं और सत्रों को प्रबंधित करने के लिए आवश्यकता है। <पी> आइए अब actions पर एक नज़र डालें वस्तु. हम अनुरोध ऑब्जेक्ट से फॉर्म डेटा प्राप्त कर सकते हैं, और कुछ बुनियादी हाउसकीपिंग कर सकते हैं। actions = {
default: async ({ request, locals }) => {
const formData = await request.formData();
const email = formData.get("email") as string;
const password = formData.get("password") as string;
const fields = [email, password];
if (fields.some(field => !field)) {
return fail(400, {
error: "All fields are required"
});
}
<पी> इसके बाद, हम उपयोगकर्ता को साइन इन करने का प्रयास करेंगे। यदि उपयोगकर्ता मौजूद नहीं है, या पासवर्ड गलत है, तो लूसिया एक त्रुटि देगी। हमने त्रुटि को पकड़कर और एक त्रुटि संदेश के साथ 400 प्रतिक्रिया लौटाकर इस ईवेंट के लिए तैयारी की है। try {
const user = await auth.useKey(PROVIDER_ID.EMAIL, email.toLowerCase(), password);
const session = await auth.createSession({
userId: user.userId,
attributes: {}
});
locals.auth.setSession(session);
} catch (err) {
if (
err instanceof LuciaError &&
(err.message === 'AUTH_INVALID_KEY_ID' || err.message === 'AUTH_INVALID_PASSWORD')
) {
return fail(400, {
error: 'Incorrect username of password'
});
}
return fail(400, {
error: 'An unknown error occurred'
});
}
<पी> यदि उपयोगकर्ता मौजूद है और पासवर्ड सही है, तो हम एक नया सत्र बनाएंगे। <पी> और अंत में, हम उपयोगकर्ता को डैशबोर्ड पर रीडायरेक्ट करेंगे। return redirect('/app');
<पी> जैसा कि आप शायद बता सकते हैं, लूसिया प्रमाणीकरण की बहुत सारी जटिलता को दूर कर देती है। हमें बस सही तरीके अपनाने की जरूरत है, और लूसिया बाकी काम संभाल लेगी। <पी>
<पी> पासवर्ड हैश करने, सत्र बनाने या कुकीज़ प्रबंधित करने की कोई आवश्यकता नहीं है। लूसिया यह सब हमारे लिए करती है। और यह सभी प्रकार से सुरक्षित है! साइनअप पेज बनाना
<पी> src/routes/auth/signup/+page.svelte में एक नई फ़ाइल बनाएं . <पी> साइनअप पेज साइनइन पेज के समान ही है, इसलिए यहां समझाने के लिए बहुत कुछ नहीं है। अंतर केवल इतना है कि हम पासवर्ड की पुष्टि के लिए पूछ रहे हैं। src/routes/auth/signup/+page.svelte<script lang="ts">
import { enhance } from '$app/forms';
import { Button, Input, Label, PasswordInput } from '$lib/components/common';
import type { ActionData } from './$types';
export let form: ActionData;
let loading = false;
let email = '';
let password = '';
let passwordConfirmation = '';
</script>
<form
method="POST"
use:enhance={() => {
loading = true;
return async ({ update }) => {
loading = false;
update();
};
}}
>
{#if form && form.error}
<div class="p-2 mb-4 text-sm text-center text-red-900 bg-red-200 rounded-sm">
Error: {form.error}
</div>
{/if}
<div class="grid gap-2.5">
<div class="grid gap-1">
<Label for="email">Email</Label>
<Input
bind:value={email}
name="email"
placeholder="Email"
type="email"
autoCapitalize="none"
autoComplete="email"
autoCorrect="off"
required={true}
/>
</div>
<div class="grid gap-1">
<Label for="password">Password</Label>
<PasswordInput name="password" placeholder="Password" bind:value={password} />
</div>
<div class="grid gap-1">
<Label for="passwordConfirmation">Confirm password</Label>
<PasswordInput
name="passwordConfirmation"
placeholder="Repeat password"
bind:value={passwordConfirmation}
/>
</div>
<div class="mt-6 col-span-full">
<Button type="submit" class="w-full" disabled={loading}>
{#if loading}
Loading...
{:else}
Sign in
{/if}
</Button>
</div>
</div>
</form>
साइनअप अनुरोध को संभालना
<पी> src/routes/auth/signup/+page.server.ts में एक नई फ़ाइल बनाएं . <पी> साइनअप के लिए हमें अपने साइनअप फॉर्म के समान पैटर्न का उपयोग करने की आवश्यकता होगी, लेकिन फॉर्म से डेटा पुनर्प्राप्ति से लेकर उपयोगकर्ता बनाने और पहले से मौजूद उपयोगकर्ताओं को संभालने के बिंदु तक फ़ील्ड के सत्यापन में कुछ अंतर होंगे। <पी> आयात साइनइन पृष्ठ के समान ही हैं, इसलिए हम उस भाग को छोड़ देंगे। <पी> हम अनुरोध ऑब्जेक्ट से फ़ॉर्म डेटा प्राप्त करके शुरुआत करेंगे, और कुछ बुनियादी हाउसकीपिंग करेंगे। हम यह भी जांचेंगे कि पासवर्ड मेल खाते हैं या नहीं। const formData = await request.formData();
const email = formData.get('email') as string;
const password = formData.get('password') as string;
const passwordConfirmation = formData.get('passwordConfirmation') as string;
const fields = [email, password, passwordConfirmation];
if (fields.some((field) => !field)) {
return fail(400, {
error: 'All fields are required'
});
}
if (password !== passwordConfirmation) {
return fail(400, {
error: 'Passwords do not match'
});
}
<पी> इसके बाद, हम ड्रिज़ल ओआरएम का उपयोग करके ईमेल द्वारा उपयोगकर्ता को ढूंढने का प्रयास करेंगे। यदि उपयोगकर्ता मौजूद है, तो हम एक त्रुटि संदेश के साथ 400 प्रतिक्रिया लौटाएंगे। try {
const user = await db.query.users.findFirst({
where: eq(schema.users.email, email.toLowerCase()),
});
if (user) {
return fail(400, {
error: "User with this email already exists"
});
}
<पी> यदि उपयोगकर्ता मौजूद नहीं है, तो हम लूसिया का उपयोग करके एक नया उपयोगकर्ता बनाएंगे। const newUser = await auth.createUser({
key: {
providerId: PROVIDER_ID.EMAIL,
providerUserId: email.toLowerCase(),
password: password,
},
attributes: {
email,
},
});
<पी> और अंत में, हम एक नया सत्र बनाएंगे और उपयोगकर्ता को डैशबोर्ड पर रीडायरेक्ट करेंगे। const session = await auth.createSession({
userId: newUser.userId,
attributes: {},
});
locals.auth.setSession(session);
<पी> आसान मटर वाला नींबू निचोड़ें! बोनस:साइनआउट पेज बनाना
<पी> जब हम इस पर काम कर रहे हों, तो आइए उपयोगकर्ता को साइन आउट करने के लिए एक समापन बिंदु बनाएं। src/routes/auth/signout/+server.ts में एक नई फ़ाइल बनाएं . <पी> और निम्नलिखित कोड जोड़ें: src/routes/auth/signout/+server.tsimport { auth } from "$lib/server";
import type { RequestHandler } from "./$types";
export const POST: RequestHandler = async ({ locals }) => {
const session = await locals.auth.validate();
if (!session) {
return new Response(null, {
status: 400,
});
}
// Invalidate session or alternatively, you can delete all sessions: await auth.invalidateAllUserSessions(session.userId);
await auth.invalidateSession(session.sessionId);
// Remove the cookie.
locals.auth.setSession(null);
return new Response(null, {
status: 200,
});
};
<पी> सत्रों को अमान्य करना अविश्वसनीय रूप से आसान बनाकर लूसिया ने फिर से हमारी मदद की है। अब हमें बस इतना करना है कि जब उपयोगकर्ता साइन आउट बटन पर क्लिक करता है तो इस एंडपॉइंट पर कॉल करें। src/routes/app/+page.svelte<script lang="ts">
import { goto } from '$app/navigation';
import { Button } from '$lib/components/common';
async function handleSignOut() {
const response = await fetch('/auth/signout', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
}
});
if (response.ok) {
goto('/auth/signin', {
replaceState: true,
invalidateAll: true
});
}
}
</script>
<Button on:click={handleSignOut}>Sign out</Button>
वह एक आवरण है
<पी> हमने लूसिया, प्लैनेटस्केल और अपस्टैश रेडिस के साथ सफलतापूर्वक टाइप-सुरक्षित प्रमाणीकरण बनाया है। और लूसिया क्या कर सकती है, हमने अभी इसकी सतह ही खंगाली है। <पी> फिर से, आप इस गाइड का रेपो यहां पा सकते हैं यदि आप लूसिया के बारे में अधिक जानना चाहते हैं, तो मैं दस्तावेज़ों की जांच करने की अत्यधिक अनुशंसा करता हूं। <पी> इससे पहले कि आप आगे बढ़ें, आपको अपस्टैश डिस्कॉर्ड समुदाय में घूमना चाहिए - हम अच्छा समय बिता रहे हैं। और यदि आप अधिक SvelteKit सामग्री चाहते हैं, तो आप इसे यहां मेरे ब्लॉग पर पा सकते हैं।