Параметр состояния не возвращает значение в Azure AD открытый идентификатор подключения паспорт стратегии - PullRequest
0 голосов
/ 30 января 2020

Я пытаюсь аутентифицировать пользователей в приложении, используя 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...