我开始与剧作家进行端到端测试。大多数应用程序都需要进行身份验证。使用用户名/密码机制自动执行此操作非常简单。问题是我要测试的应用程序只有两种身份验证机制:Github OAuth 和电子邮件身份验证链接。具体来说,我在 NextJS 项目中使用 next-auth。
我不知道应该如何与 Playwright 进行端到端测试,我考虑过的选项是:
第一个选项更容易实现,但它不再是端到端测试。第二个选项看起来很难实现,我不知道是否值得推荐。我不知道是否有更智能或更标准化的方法来进行此操作。
我正在使用NextJS v12.0.7、React v17.0.2和NextAuth v4.1.0。Typescript v4.3.5
我想创建一个简单的身份验证系统,基于NextAuth 文档并在登录后重定向到主页,因此我在pages/api/auth名为 的文件夹中创建了一个文件[...nextauth].ts,其中包含以下代码部分:
export default NextAuth({\n providers: [\n CredentialsProvider({\n id: "credentials",\n name: "Login",\n credentials: {\n username: { type: "email" },\n password: { type: "password" },\n },\n async authorize(credentials) {\n // [...]\n },\n }),\n ],\n\n // [...]\n\n callbacks: {\n // [...]\n redirect({ url, baseUrl }) {\n console.log("redirect - url ", url, "baseUrl ", baseUrl); // This is what I …Run Code Online (Sandbox Code Playgroud) 我在将令牌传递给会话回调时遇到一些困难。我的最终目标是将登录用户的数据发送到客户端。最初我只是发回用户的电子邮件,但现在我想将用户的用户名和姓名与电子邮件一起发送。通过遵循文档,我们必须传递 JWT 和 Session 回调,以便我们的开发人员能够访问令牌中的更多数据。目前,在我的 JWT 回调中,我能够记录用户数据,非常棒。然而,当我尝试在会话回调中记录数据时,我得到一个空的 {}。非常感谢任何提示。先感谢您。
import NextAuth from "next-auth/next";
import CredentialsProvider from "next-auth/providers/credentials";
// Helper Functions
import {
connectToDatabase,
comparePasswords,
} from "../../helper/HelperFunctions";
export default NextAuth({
session: { jwt: true },
providers: [
CredentialsProvider({
async authorize(credentials) {
const client = await connectToDatabase();
const userCollection = client.db().collection("users");
const user = await userCollection.findOne({
email: credentials.email,
});
// const userInfo = {
// firstName: user.firstName,
// lastName: user.lastName,
// email: user.email,
// userName: user.userName,
// };
// console.log(userInfo);
if (!user) …Run Code Online (Sandbox Code Playgroud) 我将 next-auth 与自定义提供程序和 Prisma 适配器一起使用,我只想存储值:id、名称、国家/地区、头像和性别。但是,我收到此错误:
\n[next-auth][error][adapter_error_createUser] \nhttps://next-auth.js.org/errors#adapter_error_createuser\nInvalid `p.user.create()` invocation in\n.\\node_modules\\@next-auth\\prisma-adapter\\dist\\index.js:6:38\n\n 3 exports.PrismaAdapter = void 0;\n 4 function PrismaAdapter(p) {\n 5 return {\n\xe2\x86\x92 6 createUser: (data) => p.user.create({\n data: {\n name: [redacted],\n wcaId: [redacted],\n country: [redacted],\n avatar: [redacted],\n gender: [redacted],\n email: undefined,\n emailVerified: null\n ~~~~~~~~~~~~~\n }\n })\n\nUnknown arg `emailVerified` in data.emailVerified for type UserCreateInput. Available args:\n...\nRun Code Online (Sandbox Code Playgroud)\n我的自定义提供程序中的配置文件对象如下所示:
\nprofile(profile) {\n return {\n id: profile.me.id,\n name: profile.me.name,\n country: profile.me.country_iso2,\n avatar: profile.me.avatar.url,\n gender: profile.me.gender,\n };\n },\nRun Code Online (Sandbox Code Playgroud)\n我的 Prisma 模式中的所有内容都遵循https://next-auth.js.org/adapters/prisma#setup中的示例,但用户模型除外,如下所示: …
我使用多个提供商,包括凭据提供商(电子邮件和密码) 在应用程序中的某个时刻,用户可以要求提供“恢复密码”电子邮件,他应该在其中获得一次性链接。在他访问链接(/api/users/quick_link?token=XXX&email)后,我检查令牌是否有效,之后我的目标是登录用户并将他重定向到他的个人资料页面。
我尝试过什么:
我没有尝试过:使用 REST API。
因为我不知道如何从另一个 api 使用它。只是等待取货吗?
回顾
简短版本:访问 /api/users/login_me_asap?myemail=xxx 后,我想登录用户并重定向他。
我正在制作一个带有 next-auth 的 NextJs 应用程序作为身份验证部分。使用next-auth自己的默认页面成功实现了电子邮件登录。
但现在我想要一个自定义登录页面。我按照文档进行操作,并添加
pages: { signIn: '/auth/signin' }到我的 [...nextauth].js 文件中。然后,我在pages/auth/signin.js中添加了给定的电子邮件登录代码。但在运行时,我收到此模块未找到错误:yarn dev
error - ./pages/api/auth/signin.js:1:0
Module not found: Package path ./react is not exported from package C:\...\node_modules\next-auth (see exports field in C:\...\node_modules\next-auth\package.json)
> 1 | import { getCsrfToken } from "next-auth/react"
2 |
3 | export default function SignIn({ csrfToken }) {
4 | return (
Import trace for requested module:
https://nextjs.org/docs/messages/module-not-found
Run Code Online (Sandbox Code Playgroud)
我在 npm 或纱线网站中找不到任何名为“next-auth/react”的模块。即使在node_modules的next-auth文件夹中,也没有“react”命名文件......
我该如何解决这个问题?我在这里做错了什么吗?
useSession和getSession之间有什么区别next-auth?两者似乎都在返回session对象。
我想更新用户的数据,但更新用户的数据后如何使更改也出现在会话中?
[...nextauth].js
callbacks: {
jwt: ({ token, user }) => {
if (user) {
token.id = user.id;
token.name = user.name;
token.surname = user.surname;
token.email = user.email;
token.role = user.role;
}
// Here, check the token validity date
if (token.tokenExpiration < Date.now()) {
// Call the endpoint where you handle the token refresh for a user
const user = axios.post(
`${process.env.API_URL}/auth/authentication/refresh`,
{
refreshToken: token.refreshToken,
}
);
// Check for the result and update the data accordingly
return { ...token, ...user }; …Run Code Online (Sandbox Code Playgroud) 我们目前正在使用 NextJS 13 开发一个应用程序next-auth,到目前为止一切都很好。我们的应用程序使用带有 a 的自定义登录页面,CredentialsProvider并且我们使用 next-auth 中间件来保护我们的路由。/login如果我们的用户已经通过身份验证,我们希望阻止他们访问。我们设法在客户端中实现这一点, useSession()但我们正在寻找一种方法来在中间件中实现此逻辑。next-auth使用当前的中间件实现可以实现这一点吗?以下是我们当前的中间件和路由配置。谢谢。
//middleware.ts
import withAuth from 'next-auth/middleware';
export default withAuth({
pages: {
signIn: `/login`,
},
});
Run Code Online (Sandbox Code Playgroud)
和
//route.ts
import NextAuth from 'next-auth';
import CredentialsProvider from 'next-auth/providers/credentials';
const handler = NextAuth({
pages: {
signIn: `/login`,
},
session: {
strategy: 'jwt',
},
providers: [
CredentialsProvider({
name: 'Credentials',
credentials: {
username: { label: 'Username', type: 'text' },
password: { label: 'Password', type: 'password' },
},
async authorize(credentials, …Run Code Online (Sandbox Code Playgroud) 我最近发现并开始测试create-t3-app作为 NextJS 项目的新基础,因为它负责 TypeScript、trpc、prisma 和 next-auth 等的大量样板设置,因此它会为我节省大量时间时间。虽然这是相关的,但我不认为这是我的问题的根源。我的问题是,我使用带有自动递增用户 ID 的 MySQL 数据库,但包的类型似乎next-auth迫使我使用字符串(DefaultUserinnext-auth/core/types.d.ts和AdapterUserinnext-auth/adapters.d.ts都将 id 类型设置为字符串,并且注释说 UUID)。考虑到我可以扩展支持数字用户 ID 的功能,我将其添加到next-auth.d.ts:
import { DefaultSession, DefaultUser } from 'next-auth'
declare module 'next-auth' {
interface User extends DefaultUser {
id: number;
}
interface Session {
user?: {
id: number;
} & DefaultSession['user'];
}
}
Run Code Online (Sandbox Code Playgroud)
这似乎在大多数地方都有效,除了[...nextauth].ts给我这个错误的地方
输入“字符串|” number” 不可分配给类型“number”。类型“string”不可分配给类型“number”。ts(2322)
就在session.user.id = user.id这一段代码中
export const authOptions: NextAuthOptions = {
// Include …Run Code Online (Sandbox Code Playgroud) next-auth ×10
next.js ×10
prisma ×2
reactjs ×2
session ×2
e2e-testing ×1
jwt ×1
middleware ×1
node.js ×1
npm ×1
playwright ×1
typescript ×1
yarnpkg ×1