reactjs - 如何添加将现有用户帐户与 google Oauth 帐户与 next-auth 的链接?
问题描述
努力寻找一种使用 next-auth 将现有用户与 google oAuth 链接的方法,这是我的情况。
我相信,对于我的情况来说,流程有点奇怪。用户可以选择在注册之前创建一个“项目”。基本上他们创建一个项目,当他们准备好时,他们可以“保存项目”。这将在我的 Mongo 数据库中创建一个“项目”以及一个用户(没有密码,此步骤对于允许我们使用他们的信息创建销售线索是必要的)。然后,一旦他们保存了项目,它就会将他们带到一个注册模式,在那里他们可以使用凭据或谷歌 Oauth 登录。
因此,我收到此错误“OAuthAccountNotLinked”的问题是因为 Mongo 中已经存在用户电子邮件,我需要用户保持不变,因为它已连接到他们已经创建的项目。因此,当他们使用 Google oAuth 登录时,我需要将他们与已经创建的用户链接起来。
我还没有找到任何好的解决方案来解决我的问题,我对 next-auth 比较陌生,所以任何建议都会有所帮助!
这是我的下一个身份验证文件,不确定它会有多大帮助,但让我知道可能会发生什么,我会更新。
const options = {
providers: [
Providers.Credentials({
name: 'Custom Provider',
credentials: {
username: { label: 'Email', type: 'text', placeholder: 'username' },
password: { label: 'Password', type: 'password', placeholder: 'password' }
},
async authorize(credentials) {
try {
const res = await fetch(
`${
process.env.NODE_ENV === 'development'
? process.env.NEXTAUTH_URL
: process.env.NEXTAUTH_URL_2
}/api/auth/signin`,
{
method: 'POST',
body: JSON.stringify(credentials)
}
);
const { user, error } = await res.json();
if (user) {
return Promise.resolve(user);
}
return Promise.reject(new Error(error));
} catch (error) {
return undefined;
}
}
}),
Providers.Google({
clientId: process.env.GOOGLE_ID,
clientSecret: process.env.GOOGLE_SECRET
})
],
pages: {
error: '/auth/error'
},
database: {
type: 'mongodb',
url: process.env.DATABASE_URL,
ssl: true,
// replicaSet: 'Cluster0-shard-0',
authSource: 'admin',
retryWrites: true,
synchronize: true
},
secret: process.env.SECRET,
session: { jwt: true, maxAge: 30 * 24 * 60 * 60 }, // 30 days
jwt: { secret: process.env.JWT_SECRET },
callbacks: {
signIn: async (user, account, profile) => {
return Promise.resolve(true);
},
redirect: async (url, baseUrl) => {
if (url.startsWith(baseUrl)) {
return Promise.resolve(url);
}
return Promise.resolve(baseUrl);
},
async session(session, token) {
if (token.user) {
session.user = token.user;
}
return session;
},
async jwt(token, user, account, profile, isNewUser) {
if (user) {
token.user = { _id: user._id, email: user.email, status: user.status, provider: 'credentials' };
}
if (account?.provider === 'google') {
token.user = { _id: user.id, email: user.email, status: 'client', provider: 'google' };
}
return token;
}
},
debug: false
};
export default (req, res) => NextAuth(req, res, options);
解决方案
推荐阅读
- elasticsearch - Elasticsearch:search_as_you_type 数据类型与标记器 edge_ngram
- node.js - MongoDB:了解索引类型和索引属性
- svn - 将 Subversion 中的文件移动到限制较少的文件夹是否会暴露其版本和日志历史记录?
- python - 执行存储为字符串值的模块
- json - Pandas 数据框从 json 中提取值,从请求中作为内容(JSON)返回,
- api - RESTful API 的负载模型是否应该决定 api 的行为方式?
- python - 不断迭代分页字典
- html - 页面加载时触发 CSS 转换
- python - 我在 django 上的模板上遗漏了什么吗
- c-preprocessor - 使用 C 预处理器生成初始化列表