Я пытаюсь аутентифицировать пользователей в приложении, используя Azure AD open id connect passport стратегии. Согласно документации, если в запрос включен параметр состояния, то же значение должно появиться в ответе. Я пытаюсь реализовать это, передавая состояние в параметрах запроса API входа в систему и, альтернативно, передавая объект опций стратегии паспорта. Но в любом случае, переданное состояние не приходит в объект запроса api обратного вызова, скорее приходит случайно сгенерированное значение для состояния. Мой вариант использования - передать client_id клиента авторизации, запрашивающего доступ к azure ad auth, и подписать jwt на основе этого в API обратного вызова из AD. Я использую Nest Js в качестве основы внутреннего узла. Ниже приведены соответствующие фрагменты кода: azure -ad.strategy.ts
import { Injectable, UnauthorizedException } from '@nestjs/common';
import { OIDCStrategy } from 'passport-azure-ad';
import { PassportStrategy } from '@nestjs/passport';
import { AuthService } from '../services/auth.service';
const options = {
identityMetadata: process.env.AZUREAD_IDENTITY_METADATA,
clientID: process.env.AZUREAD_AUTH_CLIENT_ID,
responseType: 'id_token',
responseMode: 'form_post',
redirectUrl: process.env.AZUREAD_REDIRECT_URL,
allowHttpForRedirectUrl: true,
clientSecret: process.env.AZUREAD_AUTH_CLIENT_SECRET,
validateIssuer: false,
issuer: null,
passReqToCallback: true,
useCookieInsteadOfSession: true,
cookieEncryptionKeys: [
{ key: '12345678901234567890123456789012', iv: '123456789012' },
{ key: 'abcdefghijklmnopqrstuvwxyzabcdef', iv: 'abcdefghijkl' },
],
scope: ['profile', 'offline_access', 'https://graph.microsoft.com/mail.read'],
loggingLevel: 'info',
nonceLifetime: null,
nonceMaxAmount: 5,
clockSkew: null,
state: 'app',
};
@Injectable()
export class AzureAdStrategy extends PassportStrategy(OIDCStrategy) {
constructor(private readonly authService: AuthService) {
super(options);
}
async validate(req, profile, done): Promise<any> {
const user = await this.authService.validateUser(profile);
if (!user) {
throw new UnauthorizedException();
}
return user;
}
}
azure -ad-login.controller.ts
@Controller('auth')
export class AzureADLoginController {
constructor(
private readonly userService: UsersService,
private readonly authClientRepo: AuthClientRepository,
private readonly jwtService: JwtService,
) {}
@UseGuards(AuthGuard('azuread-openidconnect'))
@Get('login')
// eslint-disable-next-line @typescript-eslint/no-empty-function
async login(@Query('client_id') clientId: string, @Query('client_secret') clientSecret: string): Promise<void> {}
@UseGuards(AuthGuard('azuread-openidconnect'))
@Post('azure-ad-redirect')
async returnUrl(@Request() req, @Query('state') state: string, @Response() resp): Promise<void> {
...
}
Пожалуйста, помогите, показывая, как правильно передать параметры состояния в этом сценарии, чтобы я мог получить их в API обратного вызова из AD.