next-auth
Version:
Authentication for Next.js
160 lines (159 loc) • 5.88 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = oAuthCallback;
var _openidClient = require("openid-client");
var _client = require("./client");
var _clientLegacy = require("./client-legacy");
var _checks = _interopRequireWildcard(require("./checks"));
var _errors = require("../../errors");
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
async function oAuthCallback(params) {
var _body$error, _provider$version;
const {
options,
query,
body,
method,
cookies
} = params;
const {
logger,
provider
} = options;
const errorMessage = (_body$error = body === null || body === void 0 ? void 0 : body.error) !== null && _body$error !== void 0 ? _body$error : query === null || query === void 0 ? void 0 : query.error;
if (errorMessage) {
const error = new Error(errorMessage);
logger.error("OAUTH_CALLBACK_HANDLER_ERROR", {
error,
error_description: query === null || query === void 0 ? void 0 : query.error_description,
providerId: provider.id
});
logger.debug("OAUTH_CALLBACK_HANDLER_ERROR", {
body
});
throw error;
}
if ((_provider$version = provider.version) !== null && _provider$version !== void 0 && _provider$version.startsWith("1.")) {
try {
const client = await (0, _clientLegacy.oAuth1Client)(options);
const {
oauth_token,
oauth_verifier
} = query !== null && query !== void 0 ? query : {};
const tokens = await client.getOAuthAccessToken(oauth_token, _clientLegacy.oAuth1TokenStore.get(oauth_token), oauth_verifier);
let profile = await client.get(provider.profileUrl, tokens.oauth_token, tokens.oauth_token_secret);
if (typeof profile === "string") {
profile = JSON.parse(profile);
}
const newProfile = await getProfile({
profile,
tokens,
provider,
logger
});
return {
...newProfile,
cookies: []
};
} catch (error) {
logger.error("OAUTH_V1_GET_ACCESS_TOKEN_ERROR", error);
throw error;
}
}
if (query !== null && query !== void 0 && query.oauth_token) _clientLegacy.oAuth1TokenStore.delete(query.oauth_token);
try {
var _provider$token, _provider$token2, _provider$userinfo;
const client = await (0, _client.openidClient)(options);
let tokens;
const checks = {};
const resCookies = [];
await _checks.state.use(cookies, resCookies, options, checks);
await _checks.pkce.use(cookies, resCookies, options, checks);
await _checks.nonce.use(cookies, resCookies, options, checks);
const params = {
...client.callbackParams({
url: `http://n?${new URLSearchParams(query)}`,
body,
method
}),
...((_provider$token = provider.token) === null || _provider$token === void 0 ? void 0 : _provider$token.params)
};
if ((_provider$token2 = provider.token) !== null && _provider$token2 !== void 0 && _provider$token2.request) {
const response = await provider.token.request({
provider,
params,
checks,
client
});
tokens = new _openidClient.TokenSet(response.tokens);
} else if (provider.idToken) {
tokens = await client.callback(provider.callbackUrl, params, checks);
} else {
tokens = await client.oauthCallback(provider.callbackUrl, params, checks);
}
if (Array.isArray(tokens.scope)) {
tokens.scope = tokens.scope.join(" ");
}
let profile;
if ((_provider$userinfo = provider.userinfo) !== null && _provider$userinfo !== void 0 && _provider$userinfo.request) {
profile = await provider.userinfo.request({
provider,
tokens,
client
});
} else if (provider.idToken) {
profile = tokens.claims();
} else {
var _provider$userinfo2;
profile = await client.userinfo(tokens, {
params: (_provider$userinfo2 = provider.userinfo) === null || _provider$userinfo2 === void 0 ? void 0 : _provider$userinfo2.params
});
}
const profileResult = await getProfile({
profile,
provider,
tokens,
logger
});
return {
...profileResult,
cookies: resCookies
};
} catch (error) {
throw new _errors.OAuthCallbackError(error);
}
}
async function getProfile({
profile: OAuthProfile,
tokens,
provider,
logger
}) {
try {
var _profile$email;
logger.debug("PROFILE_DATA", {
OAuthProfile
});
const profile = await provider.profile(OAuthProfile, tokens);
profile.email = (_profile$email = profile.email) === null || _profile$email === void 0 ? void 0 : _profile$email.toLowerCase();
if (!profile.id) throw new TypeError(`Profile id is missing in ${provider.name} OAuth profile response`);
return {
profile,
account: {
provider: provider.id,
type: provider.type,
providerAccountId: profile.id.toString(),
...tokens
},
OAuthProfile
};
} catch (error) {
logger.error("OAUTH_PARSE_PROFILE_ERROR", {
error: error,
OAuthProfile
});
}
}