JWT Of the Access Token
And why it's not supposed to be read on the client side.
import { decodeJwt } from "oidc-spa/tools/decodeJwt";
const decodedAccessToken = decodeJwt((await oidc.getTokens()).accessToken);import { useState, useEffect } from "react";
import { assert } from "tsafe/assert";
import { getOidc } from "../oidc";
import { decodeJwt } from "oidc-spa/tools/decodeJwt";
export function LogTokens() {
const { decodedAccessToken } = useDecodedAccessToken();
if (decodedAccessToken === undefined) {
// Loading...
return null;
}
return (
<>
<h3>Decoded Access Token:</h3>
<pre>{JSON.stringify(decodedAccessToken, null, 2)}</pre>
<br />
<button onClick={() => renewTokens()}>Refresh Tokens</button>
</>
);
}
function useDecodedAccessToken() {
const [decodedAccessToken, setDecodedAccessToken] = useState<
Record<string, unknown> | undefined /* Loading */
>(undefined);
useEffect(() => {
let cleanup: (() => void) | undefined = undefined;
let isActive = true;
(async () => {
const oidc = await getOidc();
if (!isActive) {
return;
}
assert(oidc.isUserLoggedIn);
const update = (accessToken: string) => setDecodedAccessToken(decodeJwt(accessToken));
const { unsubscribe } = oidc.subscribeToTokensChange(tokens => update(tokens.accessToken));
cleanup = () => {
unsubscribe();
};
{
const { accessToken } = await oidc.getTokens();
if (!isActive) {
return;
}
update(accessToken);
}
})();
return () => {
isActive = false;
cleanup?.();
};
}, []);
return { decodedAccessToken };
}
Last updated
Was this helpful?