app/RefreshLoginComponent.tsx (44 lines of code) (raw):
import React, { useContext } from "react";
import QueryString from "query-string";
import AbsoluteRedirect from "./login/AbsoluteRedirect";
import { OAuthContext } from "@guardian/pluto-headers";
import { useHistory } from "react-router";
function generateCodeChallenge() {
const firstData =
(Math.random() + 1).toString(36).substring(2) +
(Math.random() + 1).toString(36).substring(2) +
(Math.random() + 1).toString(36).substring(2) +
(Math.random() + 1).toString(36).substring(2) +
(Math.random() + 1).toString(36).substring(2) +
(Math.random() + 1).toString(36).substring(2) +
(Math.random() + 1).toString(36).substring(2);
const r = firstData.substr(0, 64);
sessionStorage.setItem("cx", r);
return r;
}
const RefreshLoginComponent: React.FC = () => {
const oAuthContext = useContext(OAuthContext);
const history = useHistory();
const makeLoginUrl = () => {
const parsedQuery = history.location.search
? QueryString.parse(history.location.search)
: undefined;
const redirectState =
parsedQuery && parsedQuery.returnTo ? parsedQuery.returnTo : "/";
const args = {
response_type: "code",
client_id: oAuthContext?.clientId,
scope: oAuthContext?.scope,
redirect_uri: oAuthContext?.redirectUri,
state: redirectState,
code_challenge: generateCodeChallenge(),
};
const encoded = Object.entries(args).map(
([k, v]) => `${k}=${encodeURIComponent(v as string)}`
);
return oAuthContext?.oAuthUri + "?" + encoded.join("&");
};
if (oAuthContext) {
window.location.assign(makeLoginUrl());
}
return <></>;
};
export default RefreshLoginComponent;