Skip to content

Commit e0188fe

Browse files
committed
fix: authts#769 allow multiple resource parameters
1 parent 85225fa commit e0188fe

5 files changed

Lines changed: 30 additions & 11 deletions

File tree

docs/oidc-client-ts.api.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ export interface CreateSigninRequestArgs {
7676
// (undocumented)
7777
request_uri?: string;
7878
// (undocumented)
79-
resource?: string;
79+
resource?: string | string[];
8080
// (undocumented)
8181
response_mode?: "query" | "fragment";
8282
// (undocumented)
@@ -357,7 +357,7 @@ export interface OidcClientSettings {
357357
redirect_uri: string;
358358
// @deprecated (undocumented)
359359
refreshTokenCredentials?: "same-origin" | "include" | "omit";
360-
resource?: string;
360+
resource?: string | string[];
361361
response_mode?: "query" | "fragment";
362362
response_type?: string;
363363
revokeTokenAdditionalContentTypes?: string[];
@@ -414,7 +414,7 @@ export class OidcClientSettingsStore {
414414
// (undocumented)
415415
readonly redirect_uri: string;
416416
// (undocumented)
417-
readonly resource: string | undefined;
417+
readonly resource: string | string[] | undefined;
418418
// (undocumented)
419419
readonly response_mode: "query" | "fragment";
420420
// (undocumented)
@@ -615,7 +615,7 @@ export type SigninRedirectArgs = RedirectParams & ExtraSigninRequestArgs;
615615

616616
// @public (undocumented)
617617
export class SigninRequest {
618-
constructor({ url, authority, client_id, redirect_uri, response_type, scope, state_data, response_mode, request_type, client_secret, nonce, skipUserInfo, extraQueryParams, extraTokenParams, ...optionalParams }: SigninRequestArgs);
618+
constructor({ url, authority, client_id, redirect_uri, response_type, scope, state_data, response_mode, request_type, client_secret, nonce, resource, skipUserInfo, extraQueryParams, extraTokenParams, ...optionalParams }: SigninRequestArgs);
619619
// (undocumented)
620620
readonly state: SigninState;
621621
// (undocumented)
@@ -657,7 +657,7 @@ export interface SigninRequestArgs {
657657
// (undocumented)
658658
request_uri?: string;
659659
// (undocumented)
660-
resource?: string;
660+
resource?: string | string[];
661661
// (undocumented)
662662
response_mode?: "query" | "fragment";
663663
// (undocumented)

src/OidcClient.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ export interface CreateSigninRequestArgs {
3434
id_token_hint?: string;
3535
login_hint?: string;
3636
acr_values?: string;
37-
resource?: string;
37+
resource?: string | string[];
3838
response_mode?: "query" | "fragment";
3939
request?: string;
4040
request_uri?: string;

src/OidcClientSettings.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ export interface OidcClientSettings {
6666
/** optional protocol param */
6767
acr_values?: string;
6868
/** optional protocol param */
69-
resource?: string;
69+
resource?: string | string[];
7070

7171
/** optional protocol param (default: "query") */
7272
response_mode?: "query" | "fragment";
@@ -149,7 +149,7 @@ export class OidcClientSettingsStore {
149149
public readonly max_age: number | undefined;
150150
public readonly ui_locales: string | undefined;
151151
public readonly acr_values: string | undefined;
152-
public readonly resource: string | undefined;
152+
public readonly resource: string | string[] | undefined;
153153
public readonly response_mode: "query" | "fragment";
154154

155155
// behavior flags

src/SigninRequest.test.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ describe("SigninRequest", () => {
142142
expect(subject.url).toContain("acr_values=foo");
143143
});
144144

145-
it("should include resource", () => {
145+
it("should include a resource", () => {
146146
// arrange
147147
settings.resource = "foo";
148148

@@ -153,6 +153,17 @@ describe("SigninRequest", () => {
153153
expect(subject.url).toContain("resource=foo");
154154
});
155155

156+
it("should include multiple resources", () => {
157+
// arrange
158+
settings.resource = ["foo", "bar"];
159+
160+
// act
161+
subject = new SigninRequest(settings);
162+
163+
// assert
164+
expect(subject.url).toContain("resource=foo&resource=bar");
165+
});
166+
156167
it("should include response_mode", () => {
157168
// arrange
158169
settings.response_mode = "fragment";

src/SigninRequest.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ export interface SigninRequestArgs {
2424
id_token_hint?: string;
2525
login_hint?: string;
2626
acr_values?: string;
27-
resource?: string;
27+
resource?: string | string[];
2828
response_mode?: "query" | "fragment" ;
2929
request?: string;
3030
request_uri?: string;
@@ -33,7 +33,7 @@ export interface SigninRequestArgs {
3333
client_secret?: string;
3434
extraTokenParams?: Record<string, unknown>;
3535
skipUserInfo?: boolean;
36-
nonce?: string;
36+
nonce?: string;
3737

3838
/** custom "state", which can be used by a caller to have "data" round tripped */
3939
state_data?: unknown;
@@ -53,6 +53,7 @@ export class SigninRequest {
5353
url, authority, client_id, redirect_uri, response_type, scope,
5454
// optional
5555
state_data, response_mode, request_type, client_secret, nonce,
56+
resource,
5657
skipUserInfo,
5758
extraQueryParams,
5859
extraTokenParams,
@@ -108,6 +109,13 @@ export class SigninRequest {
108109
parsedUrl.searchParams.append("code_challenge_method", "S256");
109110
}
110111

112+
if (resource) {
113+
// https://datatracker.ietf.org/doc/html/rfc8707
114+
const resources = Array.isArray(resource) ? resource : [resource];
115+
resources
116+
.forEach(r => parsedUrl.searchParams.append("resource", r));
117+
}
118+
111119
for (const [key, value] of Object.entries({ response_mode, ...optionalParams, ...extraQueryParams })) {
112120
if (value != null) {
113121
parsedUrl.searchParams.append(key, value.toString());

0 commit comments

Comments
 (0)