fix(auth): sso auth bug when deploying with subpath (#3764)
This commit is contained in:
		
							parent
							
								
									a2ae4f7b70
								
							
						
					
					
						commit
						6a1be0fcd5
					
				@ -3,20 +3,25 @@ import { AppSupervisor } from '@nocobase/server';
 | 
				
			|||||||
import { CASAuth } from '../auth';
 | 
					import { CASAuth } from '../auth';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const service = async (ctx: Context, next: Next) => {
 | 
					export const service = async (ctx: Context, next: Next) => {
 | 
				
			||||||
  const { authenticator, __appName: appName, redirect = '/admin' } = ctx.action.params;
 | 
					  const { authenticator, __appName: appName, redirect } = ctx.action.params;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  let prefix = '';
 | 
					  let prefix = process.env.APP_PUBLIC_PATH || '';
 | 
				
			||||||
  if (appName && appName !== 'main') {
 | 
					  if (appName && appName !== 'main') {
 | 
				
			||||||
    const appSupervisor = AppSupervisor.getInstance();
 | 
					    const appSupervisor = AppSupervisor.getInstance();
 | 
				
			||||||
    if (appSupervisor?.runningMode !== 'single') {
 | 
					    if (appSupervisor?.runningMode !== 'single') {
 | 
				
			||||||
      prefix = process.env.APP_PUBLIC_PATH + `apps/${appName}`;
 | 
					      prefix += `apps/${appName}`;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const auth = (await ctx.app.authManager.get(authenticator, ctx)) as CASAuth;
 | 
					  const auth = (await ctx.app.authManager.get(authenticator, ctx)) as CASAuth;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (prefix.endsWith('/')) {
 | 
				
			||||||
 | 
					    prefix = prefix.slice(0, -1);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  try {
 | 
					  try {
 | 
				
			||||||
    const { token } = await auth.signIn();
 | 
					    const { token } = await auth.signIn();
 | 
				
			||||||
    ctx.redirect(`${prefix}${redirect}?authenticator=${authenticator}&token=${token}`);
 | 
					    ctx.redirect(`${prefix}${redirect || '/admin'}?authenticator=${authenticator}&token=${token}`);
 | 
				
			||||||
  } catch (error) {
 | 
					  } catch (error) {
 | 
				
			||||||
    ctx.redirect(`${prefix}/signin?authenticator=${authenticator}&error=${error.message}&redirect=${redirect}`);
 | 
					    ctx.redirect(`${prefix}/signin?authenticator=${authenticator}&error=${error.message}&redirect=${redirect}`);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
				
			|||||||
@ -10,14 +10,17 @@ export const redirect = async (ctx: Context, next: Next) => {
 | 
				
			|||||||
  const authenticator = search.get('name');
 | 
					  const authenticator = search.get('name');
 | 
				
			||||||
  const appName = search.get('app');
 | 
					  const appName = search.get('app');
 | 
				
			||||||
  const redirect = search.get('redirect') || '/admin';
 | 
					  const redirect = search.get('redirect') || '/admin';
 | 
				
			||||||
  let prefix = '';
 | 
					  let prefix = process.env.APP_PUBLIC_PATH || '';
 | 
				
			||||||
  if (appName && appName !== 'main') {
 | 
					  if (appName && appName !== 'main') {
 | 
				
			||||||
    const appSupervisor = AppSupervisor.getInstance();
 | 
					    const appSupervisor = AppSupervisor.getInstance();
 | 
				
			||||||
    if (appSupervisor?.runningMode !== 'single') {
 | 
					    if (appSupervisor?.runningMode !== 'single') {
 | 
				
			||||||
      prefix = process.env.APP_PUBLIC_PATH + `apps/${appName}`;
 | 
					      prefix += `apps/${appName}`;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  const auth = (await ctx.app.authManager.get(authenticator, ctx)) as OIDCAuth;
 | 
					  const auth = (await ctx.app.authManager.get(authenticator, ctx)) as OIDCAuth;
 | 
				
			||||||
 | 
					  if (prefix.endsWith('/')) {
 | 
				
			||||||
 | 
					    prefix = prefix.slice(0, -1);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
  try {
 | 
					  try {
 | 
				
			||||||
    const { token } = await auth.signIn();
 | 
					    const { token } = await auth.signIn();
 | 
				
			||||||
    ctx.redirect(`${prefix}${redirect}?authenticator=${authenticator}&token=${token}`);
 | 
					    ctx.redirect(`${prefix}${redirect}?authenticator=${authenticator}&token=${token}`);
 | 
				
			||||||
 | 
				
			|||||||
@ -4,18 +4,21 @@ import { SAMLAuth } from '../saml-auth';
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
export const redirect = async (ctx: Context, next: Next) => {
 | 
					export const redirect = async (ctx: Context, next: Next) => {
 | 
				
			||||||
  const { authenticator, __appName: appName } = ctx.action.params || {};
 | 
					  const { authenticator, __appName: appName } = ctx.action.params || {};
 | 
				
			||||||
  const { RelayState: redirect = '/admin' } = ctx.action.params.values || {};
 | 
					  const { RelayState: redirect } = ctx.action.params.values || {};
 | 
				
			||||||
  let prefix = '';
 | 
					  let prefix = process.env.APP_PUBLIC_PATH || '';
 | 
				
			||||||
  if (appName && appName !== 'main') {
 | 
					  if (appName && appName !== 'main') {
 | 
				
			||||||
    const appSupervisor = AppSupervisor.getInstance();
 | 
					    const appSupervisor = AppSupervisor.getInstance();
 | 
				
			||||||
    if (appSupervisor?.runningMode !== 'single') {
 | 
					    if (appSupervisor?.runningMode !== 'single') {
 | 
				
			||||||
      prefix = process.env.APP_PUBLIC_PATH + `apps/${appName}`;
 | 
					      prefix += `/apps/${appName}`;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  const auth = (await ctx.app.authManager.get(authenticator, ctx)) as SAMLAuth;
 | 
					  const auth = (await ctx.app.authManager.get(authenticator, ctx)) as SAMLAuth;
 | 
				
			||||||
 | 
					  if (prefix.endsWith('/')) {
 | 
				
			||||||
 | 
					    prefix = prefix.slice(0, -1);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
  try {
 | 
					  try {
 | 
				
			||||||
    const { token } = await auth.signIn();
 | 
					    const { token } = await auth.signIn();
 | 
				
			||||||
    ctx.redirect(`${prefix}${redirect}?authenticator=${authenticator}&token=${token}`);
 | 
					    ctx.redirect(`${prefix}${redirect || '/admin'}?authenticator=${authenticator}&token=${token}`);
 | 
				
			||||||
  } catch (error) {
 | 
					  } catch (error) {
 | 
				
			||||||
    ctx.redirect(`${prefix}/signin?authenticator=${authenticator}&error=${error.message}&redirect=${redirect}`);
 | 
					    ctx.redirect(`${prefix}/signin?authenticator=${authenticator}&error=${error.message}&redirect=${redirect}`);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user