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 。