backend-app-api: move limited token creation to UserTokenHandler

Co-authored-by: Camila Belo <camilaibs@gmail.com>
Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
This commit is contained in:
Patrik Oldsberg
2024-04-02 17:43:35 +02:00
committed by Camila Belo
parent 7396a75d62
commit c2aa1ffe1c
2 changed files with 34 additions and 29 deletions
@@ -19,6 +19,7 @@ import { DiscoveryService } from '@backstage/backend-plugin-api';
import { AuthenticationError } from '@backstage/errors';
import { TokenTypes } from '@backstage/plugin-auth-node';
import {
base64url,
createRemoteJWKSet,
decodeJwt,
decodeProtectedHeader,
@@ -102,6 +103,37 @@ export class UserTokenHandler {
return { userEntityRef };
}
createLimitedUserToken(backstageToken: string) {
const [headerRaw, payloadRaw] = backstageToken.split('.');
const header = JSON.parse(
new TextDecoder().decode(base64url.decode(headerRaw)),
);
const payload = JSON.parse(
new TextDecoder().decode(base64url.decode(payloadRaw)),
);
const limitedUserToken = [
base64url.encode(
JSON.stringify({
typ: 'vnd.backstage.limited-user',
alg: header.alg,
kid: header.kid,
}),
),
base64url.encode(
JSON.stringify({
sub: payload.sub,
ent: payload.ent,
iat: payload.iat,
exp: payload.exp,
}),
),
payload.uip,
].join('.');
return { token: limitedUserToken, expiresAt: new Date(payload.exp * 1000) };
}
/**
* If the last keystore refresh is stale, update the keystore URL to the latest
*/
@@ -27,7 +27,7 @@ import {
} from '@backstage/backend-plugin-api';
import { AuthenticationError } from '@backstage/errors';
import { TokenTypes } from '@backstage/plugin-auth-node';
import { base64url, decodeJwt, decodeProtectedHeader } from 'jose';
import { decodeJwt, decodeProtectedHeader } from 'jose';
import { UserTokenHandler } from './UserTokenHandler';
/** @internal */
@@ -231,34 +231,7 @@ class DefaultAuthService implements AuthService {
);
}
const [headerRaw, payloadRaw] = backstageToken.split('.');
const header = JSON.parse(
new TextDecoder().decode(base64url.decode(headerRaw)),
);
const payload = JSON.parse(
new TextDecoder().decode(base64url.decode(payloadRaw)),
);
const limitedUserToken = [
base64url.encode(
JSON.stringify({
typ: 'vnd.backstage.limited-user',
alg: header.alg,
kid: header.kid,
}),
),
base64url.encode(
JSON.stringify({
sub: payload.sub,
ent: payload.ent,
iat: payload.iat,
exp: payload.exp,
}),
),
payload.uip,
].join('.');
return { token: limitedUserToken, expiresAt: new Date(payload.exp * 1000) };
return this.userTokenHandler.createLimitedUserToken(backstageToken);
}
#getJwtExpiration(token: string) {