1+ import {
2+ AUTH_GRANT_TYPE ,
3+ PKCE_CHALLENGE_METHOD ,
4+ REFRESH_GRANT_TYPE ,
5+ RESPONSE_TYPE ,
6+ TOKEN_ENDPOINT_AUTH_METHOD ,
7+ } from "./constants" ;
8+
19import type { AxiosInstance } from "axios" ;
210
311import type { Logger } from "../logging/logger" ;
@@ -11,20 +19,17 @@ import type {
1119
1220const OAUTH_DISCOVERY_ENDPOINT = "/.well-known/oauth-authorization-server" ;
1321
14- const AUTH_GRANT_TYPE = "authorization_code" as const ;
15- const REFRESH_GRANT_TYPE = "refresh_token" as const ;
16- const RESPONSE_TYPE = "code" as const ;
17- const OAUTH_METHOD = "client_secret_post" as const ;
18- const PKCE_CHALLENGE_METHOD = "S256" as const ;
19-
20- const REQUIRED_GRANT_TYPES = [ AUTH_GRANT_TYPE , REFRESH_GRANT_TYPE ] as const ;
22+ const REQUIRED_GRANT_TYPES : readonly string [ ] = [
23+ AUTH_GRANT_TYPE ,
24+ REFRESH_GRANT_TYPE ,
25+ ] ;
2126
2227// RFC 8414 defaults when fields are omitted
23- const DEFAULT_GRANT_TYPES = [ AUTH_GRANT_TYPE ] as GrantType [ ] ;
24- const DEFAULT_RESPONSE_TYPES = [ RESPONSE_TYPE ] as ResponseType [ ] ;
25- const DEFAULT_AUTH_METHODS = [
28+ const DEFAULT_GRANT_TYPES : readonly GrantType [ ] = [ AUTH_GRANT_TYPE ] ;
29+ const DEFAULT_RESPONSE_TYPES : readonly ResponseType [ ] = [ RESPONSE_TYPE ] ;
30+ const DEFAULT_AUTH_METHODS : readonly TokenEndpointAuthMethod [ ] = [
2631 "client_secret_basic" ,
27- ] as TokenEndpointAuthMethod [ ] ;
32+ ] ;
2833
2934/**
3035 * Client for discovering and validating OAuth server metadata.
@@ -95,7 +100,7 @@ export class OAuthMetadataClient {
95100 const supported = metadata . grant_types_supported ?? DEFAULT_GRANT_TYPES ;
96101 if ( ! includesAllTypes ( supported , REQUIRED_GRANT_TYPES ) ) {
97102 throw new Error (
98- `Server does not support required grant types: ${ REQUIRED_GRANT_TYPES . join ( ", " ) } . Supported: ${ supported . join ( ", " ) } ` ,
103+ `Server does not support required grant types: ${ REQUIRED_GRANT_TYPES . join ( ", " ) } . Supported: ${ formatSupported ( supported ) } ` ,
99104 ) ;
100105 }
101106 }
@@ -105,17 +110,17 @@ export class OAuthMetadataClient {
105110 metadata . response_types_supported ?? DEFAULT_RESPONSE_TYPES ;
106111 if ( ! includesAllTypes ( supported , [ RESPONSE_TYPE ] ) ) {
107112 throw new Error (
108- `Server does not support required response type: ${ RESPONSE_TYPE } . Supported: ${ supported . join ( ", " ) } ` ,
113+ `Server does not support required response type: ${ RESPONSE_TYPE } . Supported: ${ formatSupported ( supported ) } ` ,
109114 ) ;
110115 }
111116 }
112117
113118 private validateAuthMethods ( metadata : OAuthServerMetadata ) : void {
114119 const supported =
115120 metadata . token_endpoint_auth_methods_supported ?? DEFAULT_AUTH_METHODS ;
116- if ( ! includesAllTypes ( supported , [ OAUTH_METHOD ] ) ) {
121+ if ( ! includesAllTypes ( supported , [ TOKEN_ENDPOINT_AUTH_METHOD ] ) ) {
117122 throw new Error (
118- `Server does not support required auth method: ${ OAUTH_METHOD } . Supported: ${ supported . join ( ", " ) } ` ,
123+ `Server does not support required auth method: ${ TOKEN_ENDPOINT_AUTH_METHOD } . Supported: ${ formatSupported ( supported ) } ` ,
119124 ) ;
120125 }
121126 }
@@ -125,7 +130,7 @@ export class OAuthMetadataClient {
125130 const supported = metadata . code_challenge_methods_supported ?? [ ] ;
126131 if ( ! includesAllTypes ( supported , [ PKCE_CHALLENGE_METHOD ] ) ) {
127132 throw new Error (
128- `Server does not support required PKCE method: ${ PKCE_CHALLENGE_METHOD } . Supported: ${ supported . length > 0 ? supported . join ( ", " ) : "none" } ` ,
133+ `Server does not support required PKCE method: ${ PKCE_CHALLENGE_METHOD } . Supported: ${ formatSupported ( supported ) } ` ,
129134 ) ;
130135 }
131136 }
@@ -140,3 +145,7 @@ function includesAllTypes(
140145) : boolean {
141146 return requiredTypes . every ( ( type ) => arr . includes ( type ) ) ;
142147}
148+
149+ function formatSupported ( supported : readonly string [ ] ) : string {
150+ return supported . length > 0 ? supported . join ( ", " ) : "none" ;
151+ }
0 commit comments