iron-session是JavaScript的安全,無狀態和基於餅乾的會話庫。

店員是一套可嵌入的UI,靈活的API和管理儀表板的完整套件,可驗證和管理您的用戶。
在7分鐘內添加身份驗證
會話數據存儲在簽名和加密的cookie中,這些cookie由您的服務器代碼以無狀態方式解碼(=無涉及網絡)。這是Ruby在Rails上使用的框架所使用的技術。
在線演示和示例: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 ,需要:用於加密cookie的私鑰。它必須至少長32個字符。使用https://1password.com/password-generator/生成強密碼。 password可以是帶有這樣的鍵的string或object : {2: "...", 1: "..."}允許密碼旋轉。鐵療法將使用最高的新餅乾鑰匙。
cookieName ,必需:要存儲的cookie的名稱
ttl ,可選:以秒為單位。默認為14天。您可以將其設置為0 ,鐵幕將通過cookie計算允許的最大值。
cookieOptions ,可選:JSHTTP/cookie#serialize可用的任何選項,除了encode不是set-cookie屬性。請參閱Mozilla Set-Cookie屬性和Chrome 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破壞會議。這是一個同步操作,因為它只能刪除cookie。必須在將標題發送給客戶端之前完成。
session . destroy ( )session.updateConfig(sessionOptions: SessionOptions): void使用新的會話選項更新會話的配置。如果您希望使用它們,您仍然需要調用Save()。
sealData(data: unknown, { password, ttl }): Promise<string>這是為iron-session提供動力的基本方法和密封機制。您可以使用它來密封所需的所有data並傳遞。一個用戶酶是魔術鏈接:您生成一個包含用戶ID的密封件,並將其發送到網站上的路由(例如/magic-login )。收到後,您可以用unsealData安全地解碼密封並將用戶記錄在其中。
unsealData<T>(seal: string, { password, ttl }): Promise<T>這是sealData的對立面,允許您解碼密封以獲取原始數據。
這使您的會話無狀態:由於數據是在cookie中傳遞的,因此您不需要任何服務器或服務來存儲會話數據。
還可以在使用相同技術的Ruby On Rails網站上找到更多信息。
會話不能立即無效(或“斷開此客戶的連接”),因為默認情況下通常沒有有關服務器上的會話的狀態。但是,在大多數應用程序中,接收已驗證請求的第一步是驗證用戶及其在數據庫中的權限。因此,要輕鬆斷開客戶(或無效的會話),您可以在數據庫中添加``iSblocked''狀態,並創建一個UI來阻止客戶。
然後,每當收到涉及閱讀或更改敏感數據的請求時,請確保檢查此標誌。
是的,我們暴露了與Cookie無關的sealData和unsealData 。這樣,您可以密封應用程序中的任何對象並將密封件轉移到登錄用戶中。
沒有那麼多:
根據您自己的需求和偏好, iron-session可能會或可能不適合您。
@hapi/iron 。@hapi/iron作為iron-webcrypto 。next-connect和next-session 。