next-auth
Version:
Authentication for Next.js
167 lines (143 loc) • 4.73 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = callbackHandler;
var _errors = require("../../lib/errors");
var _dispatchEvent = _interopRequireDefault(require("../lib/dispatch-event"));
var _errorHandler = _interopRequireDefault(require("../../adapters/error-handler"));
async function callbackHandler(sessionToken, profile, providerAccount, options) {
if (!profile) throw new Error("Missing profile");
if (!(providerAccount !== null && providerAccount !== void 0 && providerAccount.id) || !providerAccount.type) throw new Error("Missing or invalid provider account");
if (!["email", "oauth"].includes(providerAccount.type)) throw new Error("Provider not supported");
const {
adapter,
jwt,
events,
session: {
jwt: useJwtSession
}
} = options;
if (!adapter) {
return {
user: profile,
account: providerAccount,
session: {}
};
}
const {
createUser,
updateUser,
getUser,
getUserByProviderAccountId,
getUserByEmail,
linkAccount,
createSession,
getSession,
deleteSession
} = (0, _errorHandler.default)(await adapter.getAdapter(options), options.logger);
let session = null;
let user = null;
let isSignedIn = null;
let isNewUser = false;
if (sessionToken) {
var _session2;
if (useJwtSession) {
try {
var _session;
session = await jwt.decode({ ...jwt,
token: sessionToken
});
if ((_session = session) !== null && _session !== void 0 && _session.sub) {
user = await getUser(session.sub);
isSignedIn = !!user;
}
} catch (_unused) {}
}
session = await getSession(sessionToken);
if ((_session2 = session) !== null && _session2 !== void 0 && _session2.userId) {
user = await getUser(session.userId);
isSignedIn = !!user;
}
}
if (providerAccount.type === "email") {
const userByEmail = profile.email ? await getUserByEmail(profile.email) : null;
if (userByEmail) {
if (isSignedIn) {
if (user.id !== userByEmail.id && !useJwtSession) {
await deleteSession(sessionToken);
}
}
const currentDate = new Date();
user = await updateUser({ ...userByEmail,
emailVerified: currentDate
});
await (0, _dispatchEvent.default)(events.updateUser, user);
} else {
const currentDate = new Date();
user = await createUser({ ...profile,
emailVerified: currentDate
});
await (0, _dispatchEvent.default)(events.createUser, user);
isNewUser = true;
}
session = useJwtSession ? {} : await createSession(user);
return {
session,
user,
isNewUser
};
} else if (providerAccount.type === "oauth") {
const userByProviderAccountId = await getUserByProviderAccountId(providerAccount.provider, providerAccount.id);
if (userByProviderAccountId) {
if (isSignedIn) {
if (`${userByProviderAccountId.id}` === `${user.id}`) {
return {
session,
user,
isNewUser
};
}
throw new _errors.AccountNotLinkedError();
}
session = useJwtSession ? {} : await createSession(userByProviderAccountId);
return {
session,
user: userByProviderAccountId,
isNewUser
};
} else {
if (isSignedIn) {
await linkAccount(user.id, providerAccount.provider, providerAccount.type, providerAccount.id, providerAccount.refreshToken, providerAccount.accessToken, providerAccount.accessTokenExpires);
await (0, _dispatchEvent.default)(events.linkAccount, {
user,
providerAccount: providerAccount
});
return {
session,
user,
isNewUser
};
}
const userByEmail = profile.email ? await getUserByEmail(profile.email) : null;
if (userByEmail) {
throw new _errors.AccountNotLinkedError();
}
user = await createUser(profile);
await (0, _dispatchEvent.default)(events.createUser, user);
await linkAccount(user.id, providerAccount.provider, providerAccount.type, providerAccount.id, providerAccount.refreshToken, providerAccount.accessToken, providerAccount.accessTokenExpires);
await (0, _dispatchEvent.default)(events.linkAccount, {
user,
providerAccount: providerAccount
});
session = useJwtSession ? {} : await createSession(user);
isNewUser = true;
return {
session,
user,
isNewUser
};
}
}
}