如何将 MSAL 与 React 结合使用?

How to use MSAL with React?

我觉得我可能很接近,但我无法让 msal.js 库与 React 一起工作。

通过 Microsoft 登录后,我被重定向到我的回调,但代码在 URL 中,例如

http://localhost:3000/authcallback#code=0.AQsAuJTIrioCF0ambVF28BQibk37J9vZQ05FkNq4OB...etc

本地存储中的 interaction.status 键卡在 interaction_in_progress

我正在使用重定向流程,我怀疑我注册所需回调的方式有问题。

这是我的包装纸classAuthService.ts

export class AuthService {
    msalClient: PublicClientApplication;
    loginRequest: RedirectRequest;
    account: AccountInfo | null;

    constructor(configuration: Configuration, loginScope: string) {
        this.msalClient = new PublicClientApplication(configuration);
        this.loginRequest = {
            scopes: [loginScope, "openid", "profile"],
        };
        this.account = null;
    }

    loadAuthModule(): void {
        this.msalClient
            .handleRedirectPromise()
            .then((resp: AuthenticationResult | null) => {
                if (resp) {
                    this.handleResponse(resp);
                }
            })
            .catch(console.error);
    }

    handleResponse(response: AuthenticationResult) {
        if (response !== null) {
            store.dispatch(signIn(response.account));
        }
    }

    signIn(): void {
        this.msalClient.loginRedirect(this.loginRequest);
    }

    signOut(): void {
        this.msalClient.logout();
    }

    async getIdentity(): Promise<AuthenticationResult | null> {
        // Stuff
    }
}

这是我的配置包装器 class

export class AuthConfig {
    configuration: Configuration;
    loginScope: string;

    constructor(clientId: string, authority: string, redirectUrl: string, loginScope: string) {
        this.loginScope = loginScope;
        this.configuration = {
            auth: {
                clientId: clientId,
                authority: authority,
                redirectUri: redirectUrl,
                navigateToLoginRequestUrl: false,
            },
            cache: {
                cacheLocation: "localStorage",
                storeAuthStateInCookie: false,
            },
            system: {
                loggerOptions: {
                    loggerCallback: (level: any, message: any, containsPii: any) => {
                        if (containsPii) {
                            return;
                        }
                        switch (level) {
                            case LogLevel.Error:
                                console.error(message);
                                return;
                            case LogLevel.Info:
                                console.info(message);
                                return;
                            case LogLevel.Verbose:
                                console.debug(message);
                                return;
                            case LogLevel.Warning:
                                console.warn(message);
                                return;
                        }
                    },
                },
            },
        };
    }
}

然后在我的登录页面,也就是网站的第一页...

export let authService = {} as AuthService;

const LoginPage: React.FC<RouteComponentProps> = ({}) => {

    useEffect(() => {
        const config = new AuthConfig(
            (window as any).ENV.CLIENT_ID,
            (window as any).ENV.AUTHORITY,
            (window as any).ENV.REDIRECT_URL,
            (window as any).ENV.LOGIN_SCOPE
        );

        authService = new AuthService(config.configuration, config.loginScope);  
        authService.loadAuthModule();    
    }, [])

    const signIn = () => {
        authService.signIn();
    };

    return (    
        <Button onClick={() => signIn()}>Sign In</Button>          
    );
};

export default LoginPage;

我的配置细节是正确的。如果他们不正确,我想我不会尽我所能。

我哪里错了?

我看到的每个示例都有配置的硬编码值,但这似乎不太安全,因此试图从我的 config.js 文件中注入它们。我愿意接受有关如何在维护全局可访问的 msal 实例的同时执行此操作的建议。

我们刚刚发布了官方 Msal React 包装器的第一个 alpha 版,您可以在其中看到我们的方法:https://github.com/AzureAD/microsoft-authentication-library-for-js/releases/tag/msal-react-v1.0.0-alpha.0

我肯定能看到关于将其推送到配置的可维护性的争论,但您不应将其视为安全措施。如果客户端可用 javascript,则可以在开发工具中进行检查。