iron-session เป็นห้องสมุดเซสชันที่ปลอดภัยไร้สัญชาติและคุกกี้สำหรับ JavaScript

เสมียนเป็นชุด UIs ที่ฝังได้อย่างสมบูรณ์ API ที่ยืดหยุ่นและแดชบอร์ดผู้ดูแลระบบเพื่อตรวจสอบสิทธิ์และจัดการผู้ใช้ของคุณ
เพิ่มการรับรองความถูกต้องใน 7 นาที
ข้อมูลเซสชันจะถูกเก็บไว้ในคุกกี้ที่ลงนามและเข้ารหัสซึ่งถูกถอดรหัสโดยรหัสเซิร์ฟเวอร์ของคุณในแบบไร้สัญชาติ (= ไม่มีเครือข่ายที่เกี่ยวข้อง) นี่เป็นเทคนิคเดียวกับที่ใช้โดยเฟรมเวิร์กเช่นทับทิมบนราง
ตัวอย่างและตัวอย่างออนไลน์: https://get-iron-session.vercel.app ?
ให้ความสำคัญในเอกสารถัดไป js ️
getIronSession<T>(req, res, sessionOptions): Promise<IronSession<T>>getIronSession<T>(cookieStore, sessionOptions): Promise<IronSession<T>>session.save(): Promise<void>session.destroy(): voidsession.updateConfig(sessionOptions: SessionOptions): voidsealData(data: unknown, { password, ttl }): Promise<string>unsealData<T>(seal: string, { password, ttl }): Promise<T>pnpm add iron-sessionเรามีตัวอย่างมากมายที่นี่เช่นกัน: https://get-iron-session.vercel.app/
ในการรับเซสชันมีวิธีเดียวที่จะรู้: getIronSession
// Next.js API Routes and Node.js/Express/Connect.
import { getIronSession } from 'iron-session' ;
export async function get ( req , res ) {
const session = await getIronSession ( req , res , { password : "..." , cookieName : "..." } ) ;
return session ;
}
export async function post ( req , res ) {
const session = await getIronSession ( req , res , { password : "..." , cookieName : "..." } ) ;
session . username = "Alison" ;
await session . save ( ) ;
} // Next.js Route Handlers (App Router)
import { cookies } from 'next/headers' ;
import { getIronSession } from 'iron-session' ;
export async function GET ( ) {
const session = await getIronSession ( cookies ( ) , { password : "..." , cookieName : "..." } ) ;
return session ;
}
export async function POST ( ) {
const session = await getIronSession ( cookies ( ) , { password : "..." , cookieName : "..." } ) ;
session . username = "Alison" ;
await session . save ( ) ;
} // Next.js Server Components and Server Actions (App Router)
import { cookies } from 'next/headers' ;
import { getIronSession } from 'iron-session' ;
async function getIronSessionData ( ) {
const session = await getIronSession ( cookies ( ) , { password : "..." , cookieName : "..." } ) ;
return session
}
async function Profile ( ) {
const session = await getIronSessionData ( ) ;
return < div > { session . username } </ div > ;
} เรามีรูปแบบและตัวอย่างที่แตกต่างกันมากมายเกี่ยวกับการสาธิตออนไลน์ดู: https://get-iron-session.vercel.app/
✅การผลิตพร้อมและบำรุงรักษา
ต้องใช้สองตัวเลือก: password และ cookieName ทุกอย่างถูกคำนวณโดยอัตโนมัติและมักจะไม่จำเป็นต้องเปลี่ยนแปลง ****
password จำเป็นต้องใช้ : คีย์ส่วนตัวที่ใช้ในการเข้ารหัสคุกกี้ จะต้องมีความยาวอย่างน้อย 32 อักขระ ใช้ https://1password.com/password-generator/ เพื่อสร้างรหัสผ่านที่แข็งแกร่ง password สามารถเป็น string หรือ object ที่มีปุ่มเพิ่มเช่นนี้: {2: "...", 1: "..."} เพื่ออนุญาตให้หมุนรหัสผ่าน Iron-Session จะใช้คีย์ที่มีหมายเลขสูงสุดสำหรับคุกกี้ใหม่
cookieName , จำเป็น : ชื่อของคุกกี้ที่จะจัดเก็บ
ttl , ตัวเลือก : ในไม่กี่วินาที เริ่มต้นเทียบเท่ากับ 14 วัน คุณสามารถตั้งค่านี้เป็น 0 และ Iron-Session จะคำนวณค่าสูงสุดที่อนุญาตโดยคุกกี้
cookieOptions , ตัวเลือก : ตัวเลือกใด ๆ ที่มีจาก JSHTTP/COOKIE#Serialize ยกเว้น encode ซึ่งไม่ใช่แอตทริบิวต์ Set-Cookie ดูคุณลักษณะของ Mozilla Set-Cookie และสนามคุกกี้โครเมี่ยม ค่าเริ่มต้นเป็น:
{
httpOnly : true ,
secure : true , // set this to false in local (non-HTTPS) development
sameSite : "lax" , // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite#lax
maxAge : ( ttl === 0 ? 2147483647 : ttl ) - 60 , // Expire cookie before the session expires.
path : "/" ,
} getIronSession<T>(req, res, sessionOptions): Promise<IronSession<T>> type SessionData = {
// Your data
}
const session = await getIronSession < SessionData > ( req , res , sessionOptions ) ;getIronSession<T>(cookieStore, sessionOptions): Promise<IronSession<T>> type SessionData = {
// Your data
}
const session = await getIronSession < SessionData > ( cookies ( ) , sessionOptions ) ;session.save(): Promise<void>บันทึกเซสชัน นี่คือการดำเนินการแบบอะซิงโครนัส จะต้องทำและรอก่อนที่ส่วนหัวจะถูกส่งไปยังลูกค้า
await session . save ( )session.destroy(): voidทำลายเซสชัน นี่คือการทำงานแบบซิงโครนัสเนื่องจากจะลบคุกกี้เท่านั้น จะต้องทำก่อนที่ส่วนหัวจะถูกส่งไปยังลูกค้า
session . destroy ( )session.updateConfig(sessionOptions: SessionOptions): voidอัปเดตการกำหนดค่าของเซสชันด้วยตัวเลือกเซสชันใหม่ คุณยังต้องโทรบันทึก () หากคุณต้องการให้ใช้งาน
sealData(data: unknown, { password, ttl }): Promise<string> นี่คือวิธีการพื้นฐานและกลไกการปิดผนึกที่ให้อำนาจกับ iron-session คุณสามารถใช้เพื่อปิดผนึก data ใด ๆ ที่คุณต้องการและผ่านไปรอบ ๆ หนึ่ง USECASE คือลิงค์วิเศษ: คุณสร้างซีลที่มี ID ผู้ใช้เพื่อเข้าสู่ระบบและส่งไปยังเส้นทางบนเว็บไซต์ของคุณ (เช่น /magic-login ) เมื่อได้รับแล้วคุณสามารถถอดรหัสซีลได้อย่างปลอดภัยด้วย unsealData และเข้าสู่ระบบผู้ใช้
unsealData<T>(seal: string, { password, ttl }): Promise<T> นี่คือสิ่งที่ตรงกันข้ามกับ sealData และอนุญาตให้คุณถอดรหัสตราประทับเพื่อรับข้อมูลต้นฉบับกลับมา
สิ่งนี้ทำให้เซสชันของคุณไร้สัญชาติ: เนื่องจากข้อมูลถูกส่งผ่านในคุกกี้คุณไม่จำเป็นต้องใช้เซิร์ฟเวอร์หรือบริการใด ๆ ในการจัดเก็บข้อมูลเซสชัน
ข้อมูลเพิ่มเติมสามารถพบได้ในเว็บไซต์ Ruby on Rails ซึ่งใช้เทคนิคเดียวกัน
เซสชั่นไม่สามารถทำให้เป็นโมฆะได้ทันที (หรือ "ตัดการเชื่อมต่อลูกค้ารายนี้") เนื่องจากโดยทั่วไปจะไม่มีสถานะที่เก็บไว้เกี่ยวกับเซสชันบนเซิร์ฟเวอร์โดยค่าเริ่มต้น อย่างไรก็ตามในแอปพลิเคชันส่วนใหญ่ขั้นตอนแรกเมื่อได้รับคำขอที่ได้รับการรับรองความถูกต้องคือการตรวจสอบผู้ใช้และสิทธิ์ของพวกเขาในฐานข้อมูล ดังนั้นในการปลดลูกค้าอย่างง่ายดาย (หรือทำให้เซสชันเป็นโมฆะ) คุณสามารถเพิ่มสถานะ `isblocked`` ในฐานข้อมูลและสร้าง UI เพื่อบล็อกลูกค้า
จากนั้นทุกครั้งที่ได้รับคำขอที่เกี่ยวข้องกับการอ่านหรือแก้ไขข้อมูลที่ละเอียดอ่อนตรวจสอบให้แน่ใจว่าได้ตรวจสอบธงนี้
ใช่เราเปิดเผย sealData และ unsealData ซึ่งไม่ได้เชื่อมโยงกับคุกกี้ วิธีนี้คุณสามารถปิดผนึกและปลดปล่อยวัตถุใด ๆ ในแอปพลิเคชันของคุณและย้ายซีลไปรอบ ๆ เพื่อเข้าสู่ระบบผู้ใช้
ไม่มาก:
ขึ้นอยู่กับความต้องการและการตั้งค่าของคุณเอง iron-session อาจหรือไม่เหมาะกับคุณ
@hapi/iron@hapi/iron เป็น iron-webcrypto โดยใช้ Web APIs มาตรฐานnext-connect และ next-session