我一直在尝试为 Next.js 项目实现可靠的身份验证流程,但现在我完全迷失了。我已经看过 Next.js 的示例存储库。但是我对完整的解决方案有很多疑问。
我有一个 express.js API 和一个单独的 Next.js 前端项目。所有数据和身份验证都由 API 处理。前端只是使用 SSR 呈现页面。如果我只是创建一个整体项目,其中呈现页面和所有数据由单个服务器处理(我的意思是 Next.js 的自定义服务器选项),我将只使用 express-session 和 csurf。这将是管理会话和创建针对 CSRF 的安全性的传统方式。
Express.js API 不是必需的。这只是一个例子。它可以是 Django API,也可以是 .Net Core API。重点是,它是一个单独的服务器和一个单独的项目。
我怎样才能拥有一个简单而可靠的结构?我检查了一些我最喜欢的网站(netlify、zeit.co、heroku、spectrum.chat 等)。其中一些使用 localstorage 来存储访问和刷新令牌(易受 XSS 攻击)。其中一些使用 cookie,它们甚至不是 HTTPOnly(XSS 和 CSRF 都容易受到攻击)。像spectrum.chat 这样的例子使用了我上面提到的方式(cookie-session + 防止csrf)。
我知道围绕 JWT 代币有巨大的炒作。但我觉得它们太复杂了。大多数教程只是跳过所有过期、令牌刷新、令牌撤销、黑名单、白名单等。
并且 Next.js 的许多会话 cookie 示例几乎从未提及 CSRF。老实说,身份验证对我来说一直是个大问题。有一天我读到应该使用 HTTPOnly cookie,第二天我看到一个巨大的流行网站甚至没有使用它们。或者他们说“永远不要将你的代币存储到 localStorage”,而一些大型项目就使用这种方法。
任何人都可以向我指出这种情况的方向吗?
我正在尝试实施某种基本的社交网络项目。它有Posts
,Comments
并且Likes
像其他任何一样。
我/posts
在客户端应用程序上有一条路线。它按分页列出Posts
并显示它们的title
、image
、authorName
和。commentCount
likesCount
查询graphql
是这样的;
query {
posts(first: 10, after: "123456") {
totalCount
edges {
node {
id
title
imageUrl
author {
id
username
}
comments {
totalCount
}
likes {
totalCount
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用apollo-server
、TypeORM
和PostgreSQL
。dataloader
我用来dataloader
获取author
每个帖子。authorIds
我只是用批处理请求dataloader
,authors
从PostgreSQL
查询中获取where …
apollo ×1
csrf ×1
dataloader ×1
graphql ×1
next.js ×1
postgresql ×1
reactjs ×1
session ×1
typeorm ×1