84 lines
2.0 KiB
TypeScript
84 lines
2.0 KiB
TypeScript
import { Request, Response } from 'express';
|
|
import { OAuth2Error, ServerError } from '../model/error';
|
|
import { OAuth2TokenResponse } from '../model/model';
|
|
|
|
interface ErrorResponseData {
|
|
[x: string]: string | undefined;
|
|
error: string;
|
|
error_description: string;
|
|
state?: string;
|
|
}
|
|
|
|
function dataRes(req: Request, res: Response, code: number, data: any): void {
|
|
res.header('Cache-Control', 'no-store');
|
|
res.header('Pragma', 'no-cache');
|
|
res.status(code).send(data);
|
|
req.oauth2.logger.debug('Response:', data);
|
|
}
|
|
|
|
function redirect(req: Request, res: Response, redirectUri: string): void {
|
|
res.header('Location', redirectUri);
|
|
res.status(302).end();
|
|
req.oauth2.logger.debug('Redirecting to', redirectUri);
|
|
}
|
|
|
|
export function error(
|
|
req: Request,
|
|
res: Response,
|
|
err: OAuth2Error,
|
|
redirectUri?: string
|
|
): void {
|
|
// Transform unknown error
|
|
if (!(err instanceof OAuth2Error)) {
|
|
req.oauth2.logger.error((err as Error).stack);
|
|
err = new ServerError('Uncaught exception');
|
|
} else {
|
|
req.oauth2.logger.error('Exception caught', err.stack);
|
|
}
|
|
|
|
if (redirectUri) {
|
|
const obj: ErrorResponseData = {
|
|
error: err.code,
|
|
error_description: err.message,
|
|
};
|
|
|
|
if (req.query.state) {
|
|
obj.state = req.query.state as string;
|
|
}
|
|
|
|
redirectUri +=
|
|
'?' + new URLSearchParams(obj as Record<string, string>).toString();
|
|
redirect(req, res, redirectUri);
|
|
return;
|
|
}
|
|
|
|
dataRes(req, res, err.status, {
|
|
error: err.code,
|
|
error_description: err.message,
|
|
});
|
|
}
|
|
|
|
export function data(
|
|
req: Request,
|
|
res: Response,
|
|
obj: OAuth2TokenResponse,
|
|
redirectUri?: string,
|
|
fragment: boolean = false
|
|
): void {
|
|
if (redirectUri) {
|
|
redirectUri += fragment ? '#' : redirectUri.indexOf('?') === -1 ? '?' : '&';
|
|
|
|
if (req.query.state) {
|
|
obj.state = req.query.state as string;
|
|
}
|
|
|
|
redirectUri += new URLSearchParams(
|
|
obj as Record<string, string>
|
|
).toString();
|
|
redirect(req, res, redirectUri);
|
|
return;
|
|
}
|
|
|
|
dataRes(req, res, 200, obj);
|
|
}
|