免责声明:我是下面的免费开源包的维护者,但我认为在这里是合适的,因为这是一个常见问题,没有一个很好的答案,因为许多流行的解决方案都存在问题中提出的特定安全缺陷(例如在适当的情况下不使用 CSRF 并向客户端 JavaScript 公开会话令牌或 Web 令牌)。
套餐NextAuth.js https://next-auth.js.org尝试使用免费的开源软件来解决上述问题。
- It uses
httpOnly
饼干与secure
.
- 它具有 CSRF 保护(双重提交 cookie 方法,带有签名 cookie)。
- Cookie 带有适当的前缀(例如
__HOST-
or __Secure
).
- 它支持电子邮件/无密码登录和 OAuth 提供商(其中包括许多提供商)。
- 它支持 JSON Web 令牌(签名+加密)和会话数据库。
- 您可以在没有数据库的情况下使用它(例如任何 ANSI SQL、MongoDB)。
- Has a 现场演示 https://next-auth-example.now.sh (查看源代码 https://github.com/nextauthjs/next-auth-example).
- 它是 100% FOSS,不是商业软件或 SaaS 解决方案(不销售任何东西)。
API 路由示例
e.g. page/api/auth/[...nextauth.js]
import NextAuth from 'next-auth'
import Providers from 'next-auth/providers'
const options = {
providers: [
// OAuth authentication providers
Providers.Apple({
clientId: process.env.APPLE_ID,
clientSecret: process.env.APPLE_SECRET
}),
Providers.Google({
clientId: process.env.GOOGLE_ID,
clientSecret: process.env.GOOGLE_SECRET
}),
// Sign in with email (passwordless)
Providers.Email({
server: process.env.MAIL_SERVER,
from: '<[email protected] /cdn-cgi/l/email-protection>'
}),
],
// MySQL, Postgres or MongoDB database (or leave empty)
database: process.env.DATABASE_URL
}
export default (req, res) => NextAuth(req, res, options)
反应组件示例
e.g. pages/index.js
import React from 'react'
import {
useSession,
signin,
signout
} from 'next-auth/client'
export default () => {
const [ session, loading ] = useSession()
return <p>
{!session && <>
Not signed in <br/>
<button onClick={signin}>Sign in</button>
</>}
{session && <>
Signed in as {session.user.email} <br/>
<button onClick={signout}>Sign out</button>
</>}
</p>
}
即使您不选择使用它,您也可能会发现该代码作为参考很有用(例如如何JSON 网络令牌 https://github.com/nextauthjs/next-auth/blob/main/src/lib/jwt.js被处理并且他们如何在会议中轮换 https://github.com/nextauthjs/next-auth/blob/main/src/server/routes/session.js.