From 71837075264267aeacce0737d882fb2c74a5966f Mon Sep 17 00:00:00 2001 From: Nathan Vecchiarelli Date: Tue, 26 Jan 2021 13:39:11 -0500 Subject: [PATCH] support relay state when calling createLoginRequest --- src/binding-redirect.ts | 5 +++-- src/entity-sp.ts | 7 ++++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/binding-redirect.ts b/src/binding-redirect.ts index 1ac37ac0..1a7937d0 100644 --- a/src/binding-redirect.ts +++ b/src/binding-redirect.ts @@ -72,10 +72,11 @@ function buildRedirectURL(opts: BuildRedirectConfig) { * @param {function} customTagReplacement used when developers have their own login response template * @return {string} redirect URL */ -function loginRequestRedirectURL(entity: { idp: Idp, sp: Sp }, customTagReplacement?: (template: string) => BindingContext): BindingContext { +function loginRequestRedirectURL(entity: { idp: Idp, sp: Sp, relayState?: string }, customTagReplacement?: (template: string) => BindingContext): BindingContext { const metadata: any = { idp: entity.idp.entityMeta, sp: entity.sp.entityMeta }; const spSetting: any = entity.sp.entitySetting; + const relayState = entity.relayState ?? entity.sp.entitySetting.relayState; let id: string = ''; if (metadata && metadata.idp && metadata.sp) { @@ -108,7 +109,7 @@ function loginRequestRedirectURL(entity: { idp: Idp, sp: Sp }, customTagReplacem isSigned: metadata.sp.isAuthnRequestSigned(), entitySetting: spSetting, baseUrl: base, - relayState: spSetting.relayState, + relayState, }), }; } diff --git a/src/entity-sp.ts b/src/entity-sp.ts index c89e33bc..30d19157 100644 --- a/src/entity-sp.ts +++ b/src/entity-sp.ts @@ -54,7 +54,8 @@ export class ServiceProvider extends Entity { */ public createLoginRequest( idp: IdentityProvider, - binding = 'redirect', + binding: 'redirect' | 'post' = 'redirect', + relayState?: string, customTagReplacement?: (template: string) => BindingContext, ): BindingContext | PostBindingContext { const nsBinding = namespace.binding; @@ -64,14 +65,14 @@ export class ServiceProvider extends Entity { } if (protocol === nsBinding.redirect) { - return redirectBinding.loginRequestRedirectURL({ idp, sp: this }, customTagReplacement); + return redirectBinding.loginRequestRedirectURL({ idp, sp: this, relayState }, customTagReplacement); } if (protocol === nsBinding.post) { const context = postBinding.base64LoginRequest("/*[local-name(.)='AuthnRequest']", { idp, sp: this }, customTagReplacement); return { ...context, - relayState: this.entitySetting.relayState, + relayState: relayState ?? this.entitySetting.relayState, entityEndpoint: idp.entityMeta.getSingleSignOnService(binding) as string, type: 'SAMLRequest', };