Files
zitadel/packages/zitadel-client/src/node.ts
T
df75be96ff Merge commit from fork
* fix: Improve host header handling and deployment mode detection

* ZITADEL_CLOUD env

* refactor service config

* service config

* cleanup

* cleanup

* util for original and public host

* instanceHost, publicHost

* cleanup constructUrl

* cleanup middleware

* add x-zitadel-forward-host as fallback for current cloud setup

* fix build

* fix: lint

* fix: update test mocks

* fix: provide basepath to unit tests

* host handling

* unit tests

* imports

* fix: getPublicHost instead of getInstanceHost

* unit tests

* update nextjs, implement jwt verify for logout_token

* pass logout information in jwt to login v2

* handle hosts in jwks url

* point idp callbacks to the api and not the login UI

* logout_hint out of logout token, typecheck

* rm unused imports

* fix oidc integration test

---------

Co-authored-by: Livio Spring <[email protected]>
2025-12-08 10:01:49 +01:00

85 lines
1.9 KiB
TypeScript

import {
createGrpcTransport,
GrpcTransportOptions,
} from "@connectrpc/connect-node";
import {
createRemoteJWKSet,
importPKCS8,
jwtVerify,
JWTPayload,
SignJWT,
} from "jose";
import { NewAuthorizationBearerInterceptor } from "./interceptors.js";
/**
* Create a server transport using grpc with the given token and configuration options.
* @param token
* @param opts
*/
export function createServerTransport(
token: string,
opts: GrpcTransportOptions
) {
return createGrpcTransport({
...opts,
interceptors: [
...(opts.interceptors || []),
NewAuthorizationBearerInterceptor(token),
],
});
}
export async function newSystemToken({
audience,
subject,
key,
expirationTime,
}: {
audience: string;
subject: string;
key: string;
expirationTime?: number | string | Date;
}) {
return await new SignJWT({})
.setProtectedHeader({ alg: "RS256" })
.setIssuedAt()
.setExpirationTime(expirationTime ?? "1h")
.setIssuer(subject)
.setSubject(subject)
.setAudience(audience)
.sign(await importPKCS8(key, "RS256"));
}
/**
* Verify a signed JWT with the given keys endpoint.
* @param token
* @param keysEndpoint
* @param options
*/
export async function verifyJwt<T = JWTPayload>(
token: string,
keysEndpoint: string,
options?: {
issuer?: string;
audience?: string;
instanceHost?: string;
publicHost?: string;
},
): Promise<T & JWTPayload> {
const headers: Record<string, string> = {};
if (options?.instanceHost) {
headers["x-zitadel-instance-host"] = options.instanceHost;
}
if (options?.publicHost) {
headers["x-zitadel-public-host"] = options.publicHost;
}
const JWKS = createRemoteJWKSet(new URL(keysEndpoint), {headers: headers});
const { payload } = await jwtVerify(token, JWKS, {
issuer: options?.issuer,
audience: options?.audience,
});
return payload as T & JWTPayload;
}