next-auth
Version:
Authentication for Next.js
747 lines (627 loc) • 24.4 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.useSession = useSession;
exports.session = exports.getSession = getSession;
exports.csrfToken = exports.getCsrfToken = getCsrfToken;
exports.providers = exports.getProviders = getProviders;
exports.signin = exports.signIn = signIn;
exports.signout = exports.signOut = signOut;
exports.options = exports.setOptions = setOptions;
exports.Provider = Provider;
exports.default = void 0;
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _react = require("react");
var _logger2 = _interopRequireWildcard(require("../lib/logger"));
var _parseUrl = _interopRequireDefault(require("../lib/parse-url"));
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
var __NEXTAUTH = {
baseUrl: (0, _parseUrl.default)(process.env.NEXTAUTH_URL || process.env.VERCEL_URL).baseUrl,
basePath: (0, _parseUrl.default)(process.env.NEXTAUTH_URL).basePath,
baseUrlServer: (0, _parseUrl.default)(process.env.NEXTAUTH_URL_INTERNAL || process.env.NEXTAUTH_URL || process.env.VERCEL_URL).baseUrl,
basePathServer: (0, _parseUrl.default)(process.env.NEXTAUTH_URL_INTERNAL || process.env.NEXTAUTH_URL).basePath,
keepAlive: 0,
clientMaxAge: 0,
_clientLastSync: 0,
_clientSyncTimer: null,
_eventListenersAdded: false,
_clientSession: undefined,
_getSession: function _getSession() {}
};
var logger = (0, _logger2.proxyLogger)(_logger2.default, __NEXTAUTH.basePath);
var broadcast = BroadcastChannel();
if (typeof window !== "undefined" && !__NEXTAUTH._eventListenersAdded) {
__NEXTAUTH._eventListenersAdded = true;
broadcast.receive(function () {
return __NEXTAUTH._getSession({
event: "storage"
});
});
document.addEventListener("visibilitychange", function () {
!document.hidden && __NEXTAUTH._getSession({
event: "visibilitychange"
});
}, false);
}
var SessionContext = (0, _react.createContext)();
function useSession(session) {
var context = (0, _react.useContext)(SessionContext);
if (context) return context;
return _useSessionHook(session);
}
function _useSessionHook(session) {
var _useState = (0, _react.useState)(session),
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
data = _useState2[0],
setData = _useState2[1];
var _useState3 = (0, _react.useState)(!data),
_useState4 = (0, _slicedToArray2.default)(_useState3, 2),
loading = _useState4[0],
setLoading = _useState4[1];
(0, _react.useEffect)(function () {
__NEXTAUTH._getSession = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee() {
var _ref2,
_ref2$event,
event,
triggredByEvent,
triggeredByStorageEvent,
clientMaxAge,
clientLastSync,
currentTime,
clientSession,
newClientSessionData,
_args = arguments;
return _regenerator.default.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
_ref2 = _args.length > 0 && _args[0] !== undefined ? _args[0] : {}, _ref2$event = _ref2.event, event = _ref2$event === void 0 ? null : _ref2$event;
_context.prev = 1;
triggredByEvent = event !== null;
triggeredByStorageEvent = event === "storage";
clientMaxAge = __NEXTAUTH.clientMaxAge;
clientLastSync = parseInt(__NEXTAUTH._clientLastSync);
currentTime = _now();
clientSession = __NEXTAUTH._clientSession;
if (!(!triggeredByStorageEvent && clientSession !== undefined)) {
_context.next = 19;
break;
}
if (!(clientMaxAge === 0 && triggredByEvent !== true)) {
_context.next = 13;
break;
}
return _context.abrupt("return");
case 13:
if (!(clientMaxAge > 0 && clientSession === null)) {
_context.next = 17;
break;
}
return _context.abrupt("return");
case 17:
if (!(clientMaxAge > 0 && currentTime < clientLastSync + clientMaxAge)) {
_context.next = 19;
break;
}
return _context.abrupt("return");
case 19:
if (clientSession === undefined) {
__NEXTAUTH._clientSession = null;
}
__NEXTAUTH._clientLastSync = _now();
_context.next = 23;
return getSession({
triggerEvent: !triggeredByStorageEvent
});
case 23:
newClientSessionData = _context.sent;
__NEXTAUTH._clientSession = newClientSessionData;
setData(newClientSessionData);
setLoading(false);
_context.next = 33;
break;
case 29:
_context.prev = 29;
_context.t0 = _context["catch"](1);
logger.error("CLIENT_USE_SESSION_ERROR", _context.t0);
setLoading(false);
case 33:
case "end":
return _context.stop();
}
}
}, _callee, null, [[1, 29]]);
}));
__NEXTAUTH._getSession();
});
return [data, loading];
}
function getSession(_x) {
return _getSession2.apply(this, arguments);
}
function _getSession2() {
_getSession2 = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee4(ctx) {
var _ctx$triggerEvent;
var session;
return _regenerator.default.wrap(function _callee4$(_context4) {
while (1) {
switch (_context4.prev = _context4.next) {
case 0:
_context4.next = 2;
return _fetchData("session", ctx);
case 2:
session = _context4.sent;
if ((_ctx$triggerEvent = ctx === null || ctx === void 0 ? void 0 : ctx.triggerEvent) !== null && _ctx$triggerEvent !== void 0 ? _ctx$triggerEvent : true) {
broadcast.post({
event: "session",
data: {
trigger: "getSession"
}
});
}
return _context4.abrupt("return", session);
case 5:
case "end":
return _context4.stop();
}
}
}, _callee4);
}));
return _getSession2.apply(this, arguments);
}
function getCsrfToken(_x2) {
return _getCsrfToken.apply(this, arguments);
}
function _getCsrfToken() {
_getCsrfToken = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee5(ctx) {
var _yield$_fetchData;
return _regenerator.default.wrap(function _callee5$(_context5) {
while (1) {
switch (_context5.prev = _context5.next) {
case 0:
_context5.next = 2;
return _fetchData("csrf", ctx);
case 2:
_context5.t1 = _yield$_fetchData = _context5.sent;
_context5.t0 = _context5.t1 === null;
if (_context5.t0) {
_context5.next = 6;
break;
}
_context5.t0 = _yield$_fetchData === void 0;
case 6:
if (!_context5.t0) {
_context5.next = 10;
break;
}
_context5.t2 = void 0;
_context5.next = 11;
break;
case 10:
_context5.t2 = _yield$_fetchData.csrfToken;
case 11:
return _context5.abrupt("return", _context5.t2);
case 12:
case "end":
return _context5.stop();
}
}
}, _callee5);
}));
return _getCsrfToken.apply(this, arguments);
}
function getProviders() {
return _getProviders.apply(this, arguments);
}
function _getProviders() {
_getProviders = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee6() {
return _regenerator.default.wrap(function _callee6$(_context6) {
while (1) {
switch (_context6.prev = _context6.next) {
case 0:
_context6.next = 2;
return _fetchData("providers");
case 2:
return _context6.abrupt("return", _context6.sent);
case 3:
case "end":
return _context6.stop();
}
}
}, _callee6);
}));
return _getProviders.apply(this, arguments);
}
function signIn(_x3) {
return _signIn.apply(this, arguments);
}
function _signIn() {
_signIn = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee7(provider) {
var options,
authorizationParams,
_options$callbackUrl,
callbackUrl,
_options$redirect,
redirect,
baseUrl,
providers,
isCredentials,
isEmail,
isSupportingReturn,
signInUrl,
_signInUrl,
res,
data,
_data$url,
url,
error,
_args7 = arguments;
return _regenerator.default.wrap(function _callee7$(_context7) {
while (1) {
switch (_context7.prev = _context7.next) {
case 0:
options = _args7.length > 1 && _args7[1] !== undefined ? _args7[1] : {};
authorizationParams = _args7.length > 2 && _args7[2] !== undefined ? _args7[2] : {};
_options$callbackUrl = options.callbackUrl, callbackUrl = _options$callbackUrl === void 0 ? window.location.href : _options$callbackUrl, _options$redirect = options.redirect, redirect = _options$redirect === void 0 ? true : _options$redirect;
baseUrl = _apiBaseUrl();
_context7.next = 6;
return getProviders();
case 6:
providers = _context7.sent;
if (providers) {
_context7.next = 9;
break;
}
return _context7.abrupt("return", window.location.replace("".concat(baseUrl, "/error")));
case 9:
if (provider in providers) {
_context7.next = 11;
break;
}
return _context7.abrupt("return", window.location.replace("".concat(baseUrl, "/signin?callbackUrl=").concat(encodeURIComponent(callbackUrl))));
case 11:
isCredentials = providers[provider].type === "credentials";
isEmail = providers[provider].type === "email";
isSupportingReturn = isCredentials || isEmail;
signInUrl = isCredentials ? "".concat(baseUrl, "/callback/").concat(provider) : "".concat(baseUrl, "/signin/").concat(provider);
_signInUrl = "".concat(signInUrl, "?").concat(new URLSearchParams(authorizationParams));
_context7.t0 = fetch;
_context7.t1 = _signInUrl;
_context7.t2 = {
"Content-Type": "application/x-www-form-urlencoded"
};
_context7.t3 = URLSearchParams;
_context7.t4 = _objectSpread;
_context7.t5 = _objectSpread({}, options);
_context7.t6 = {};
_context7.next = 25;
return getCsrfToken();
case 25:
_context7.t7 = _context7.sent;
_context7.t8 = callbackUrl;
_context7.t9 = {
csrfToken: _context7.t7,
callbackUrl: _context7.t8,
json: true
};
_context7.t10 = (0, _context7.t4)(_context7.t5, _context7.t6, _context7.t9);
_context7.t11 = new _context7.t3(_context7.t10);
_context7.t12 = {
method: "post",
headers: _context7.t2,
body: _context7.t11
};
_context7.next = 33;
return (0, _context7.t0)(_context7.t1, _context7.t12);
case 33:
res = _context7.sent;
_context7.next = 36;
return res.json();
case 36:
data = _context7.sent;
if (!(redirect || !isSupportingReturn)) {
_context7.next = 42;
break;
}
url = (_data$url = data.url) !== null && _data$url !== void 0 ? _data$url : callbackUrl;
window.location.replace(url);
if (url.includes("#")) window.location.reload();
return _context7.abrupt("return");
case 42:
error = new URL(data.url).searchParams.get("error");
if (!res.ok) {
_context7.next = 46;
break;
}
_context7.next = 46;
return __NEXTAUTH._getSession({
event: "storage"
});
case 46:
return _context7.abrupt("return", {
error: error,
status: res.status,
ok: res.ok,
url: error ? null : data.url
});
case 47:
case "end":
return _context7.stop();
}
}
}, _callee7);
}));
return _signIn.apply(this, arguments);
}
function signOut() {
return _signOut.apply(this, arguments);
}
function _signOut() {
_signOut = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee8() {
var options,
_options$callbackUrl2,
callbackUrl,
_options$redirect2,
redirect,
baseUrl,
fetchOptions,
res,
data,
_data$url2,
url,
_args8 = arguments;
return _regenerator.default.wrap(function _callee8$(_context8) {
while (1) {
switch (_context8.prev = _context8.next) {
case 0:
options = _args8.length > 0 && _args8[0] !== undefined ? _args8[0] : {};
_options$callbackUrl2 = options.callbackUrl, callbackUrl = _options$callbackUrl2 === void 0 ? window.location.href : _options$callbackUrl2, _options$redirect2 = options.redirect, redirect = _options$redirect2 === void 0 ? true : _options$redirect2;
baseUrl = _apiBaseUrl();
_context8.t0 = {
"Content-Type": "application/x-www-form-urlencoded"
};
_context8.t1 = URLSearchParams;
_context8.next = 7;
return getCsrfToken();
case 7:
_context8.t2 = _context8.sent;
_context8.t3 = callbackUrl;
_context8.t4 = {
csrfToken: _context8.t2,
callbackUrl: _context8.t3,
json: true
};
_context8.t5 = new _context8.t1(_context8.t4);
fetchOptions = {
method: "post",
headers: _context8.t0,
body: _context8.t5
};
_context8.next = 14;
return fetch("".concat(baseUrl, "/signout"), fetchOptions);
case 14:
res = _context8.sent;
_context8.next = 17;
return res.json();
case 17:
data = _context8.sent;
broadcast.post({
event: "session",
data: {
trigger: "signout"
}
});
if (!redirect) {
_context8.next = 24;
break;
}
url = (_data$url2 = data.url) !== null && _data$url2 !== void 0 ? _data$url2 : callbackUrl;
window.location.replace(url);
if (url.includes("#")) window.location.reload();
return _context8.abrupt("return");
case 24:
_context8.next = 26;
return __NEXTAUTH._getSession({
event: "storage"
});
case 26:
return _context8.abrupt("return", data);
case 27:
case "end":
return _context8.stop();
}
}
}, _callee8);
}));
return _signOut.apply(this, arguments);
}
function setOptions() {
var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
baseUrl = _ref3.baseUrl,
basePath = _ref3.basePath,
clientMaxAge = _ref3.clientMaxAge,
keepAlive = _ref3.keepAlive;
if (baseUrl) __NEXTAUTH.baseUrl = baseUrl;
if (basePath) __NEXTAUTH.basePath = basePath;
if (clientMaxAge) __NEXTAUTH.clientMaxAge = clientMaxAge;
if (keepAlive) {
__NEXTAUTH.keepAlive = keepAlive;
if (typeof window === "undefined") return;
if (__NEXTAUTH._clientSyncTimer !== null) {
clearTimeout(__NEXTAUTH._clientSyncTimer);
}
__NEXTAUTH._clientSyncTimer = setTimeout((0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee2() {
return _regenerator.default.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
if (__NEXTAUTH._clientSession) {
_context2.next = 2;
break;
}
return _context2.abrupt("return");
case 2:
_context2.next = 4;
return __NEXTAUTH._getSession({
event: "timer"
});
case 4:
case "end":
return _context2.stop();
}
}
}, _callee2);
})), keepAlive * 1000);
}
}
function Provider(_ref5) {
var children = _ref5.children,
session = _ref5.session,
options = _ref5.options;
setOptions(options);
return (0, _react.createElement)(SessionContext.Provider, {
value: useSession(session)
}, children);
}
function _fetchData(_x4) {
return _fetchData2.apply(this, arguments);
}
function _fetchData2() {
_fetchData2 = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee9(path) {
var _ref7,
ctx,
_ref7$req,
req,
baseUrl,
options,
res,
data,
_args9 = arguments;
return _regenerator.default.wrap(function _callee9$(_context9) {
while (1) {
switch (_context9.prev = _context9.next) {
case 0:
_ref7 = _args9.length > 1 && _args9[1] !== undefined ? _args9[1] : {}, ctx = _ref7.ctx, _ref7$req = _ref7.req, req = _ref7$req === void 0 ? ctx === null || ctx === void 0 ? void 0 : ctx.req : _ref7$req;
_context9.prev = 1;
_context9.next = 4;
return _apiBaseUrl();
case 4:
baseUrl = _context9.sent;
options = req ? {
headers: {
cookie: req.headers.cookie
}
} : {};
_context9.next = 8;
return fetch("".concat(baseUrl, "/").concat(path), options);
case 8:
res = _context9.sent;
_context9.next = 11;
return res.json();
case 11:
data = _context9.sent;
if (res.ok) {
_context9.next = 14;
break;
}
throw data;
case 14:
return _context9.abrupt("return", Object.keys(data).length > 0 ? data : null);
case 17:
_context9.prev = 17;
_context9.t0 = _context9["catch"](1);
logger.error("CLIENT_FETCH_ERROR", path, _context9.t0);
return _context9.abrupt("return", null);
case 21:
case "end":
return _context9.stop();
}
}
}, _callee9, null, [[1, 17]]);
}));
return _fetchData2.apply(this, arguments);
}
function _apiBaseUrl() {
if (typeof window === "undefined") {
if (!process.env.NEXTAUTH_URL) {
logger.warn("NEXTAUTH_URL", "NEXTAUTH_URL environment variable not set");
}
return "".concat(__NEXTAUTH.baseUrlServer).concat(__NEXTAUTH.basePathServer);
}
return __NEXTAUTH.basePath;
}
function _now() {
return Math.floor(Date.now() / 1000);
}
function BroadcastChannel() {
var name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "nextauth.message";
return {
receive: function receive(onReceive) {
if (typeof window === "undefined") return;
window.addEventListener("storage", function () {
var _ref6 = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee3(event) {
var message;
return _regenerator.default.wrap(function _callee3$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
if (!(event.key !== name)) {
_context3.next = 2;
break;
}
return _context3.abrupt("return");
case 2:
message = JSON.parse(event.newValue);
if (!((message === null || message === void 0 ? void 0 : message.event) !== "session" || !(message !== null && message !== void 0 && message.data))) {
_context3.next = 5;
break;
}
return _context3.abrupt("return");
case 5:
onReceive(message);
case 6:
case "end":
return _context3.stop();
}
}
}, _callee3);
}));
return function (_x5) {
return _ref6.apply(this, arguments);
};
}());
},
post: function post(message) {
if (typeof localStorage === "undefined") return;
localStorage.setItem(name, JSON.stringify(_objectSpread(_objectSpread({}, message), {}, {
timestamp: _now()
})));
}
};
}
var _default = {
getSession: getSession,
getCsrfToken: getCsrfToken,
getProviders: getProviders,
useSession: useSession,
signIn: signIn,
signOut: signOut,
Provider: Provider,
setOptions: setOptions,
options: setOptions,
session: getSession,
providers: getProviders,
csrfToken: getCsrfToken,
signin: signIn,
signout: signOut
};
exports.default = _default;