Frontend: - Add @azure/msal-browser and @azure/msal-react packages - Create authConfig.ts with MSAL configuration for PKCE flow - Create authService.ts for token acquisition and user info - Wrap App with MsalProvider in index.tsx - Replace dummy login with real MSAL loginPopup() in Login.tsx - Update App.tsx to use useIsAuthenticated/useMsal hooks - Update Profile.tsx to display real user data from claims - Update geminiService.ts to include access_token in WebSocket messages - Update WIPReviewer.tsx to pass msalInstance for auth Backend: - Add python-jose and httpx dependencies for JWT verification - Create auth_service.py with Azure AD JWKS fetching and token verification - Create auth.py FastAPI dependency for protected REST endpoints - Update main.py to verify tokens on WebSocket and protect /info endpoint - Add AZURE_TENANT_ID, AZURE_CLIENT_ID, DISABLE_AUTH to config 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
41 lines
1.3 KiB
TypeScript
41 lines
1.3 KiB
TypeScript
|
|
import React from 'react';
|
|
import ReactDOM from 'react-dom/client';
|
|
import { PublicClientApplication, EventType, EventMessage, AuthenticationResult } from '@azure/msal-browser';
|
|
import { MsalProvider } from '@azure/msal-react';
|
|
import App from './App';
|
|
import { msalConfig } from './services/authConfig';
|
|
|
|
// Create MSAL instance
|
|
const msalInstance = new PublicClientApplication(msalConfig);
|
|
|
|
// Initialize MSAL and render app
|
|
msalInstance.initialize().then(() => {
|
|
// Check if there are accounts and set the first one as active
|
|
const accounts = msalInstance.getAllAccounts();
|
|
if (accounts.length > 0) {
|
|
msalInstance.setActiveAccount(accounts[0]);
|
|
}
|
|
|
|
// Listen for sign-in events to set active account
|
|
msalInstance.addEventCallback((event: EventMessage) => {
|
|
if (event.eventType === EventType.LOGIN_SUCCESS && event.payload) {
|
|
const payload = event.payload as AuthenticationResult;
|
|
msalInstance.setActiveAccount(payload.account);
|
|
}
|
|
});
|
|
|
|
const rootElement = document.getElementById('root');
|
|
if (!rootElement) {
|
|
throw new Error("Could not find root element to mount to");
|
|
}
|
|
|
|
const root = ReactDOM.createRoot(rootElement);
|
|
root.render(
|
|
<React.StrictMode>
|
|
<MsalProvider instance={msalInstance}>
|
|
<App />
|
|
</MsalProvider>
|
|
</React.StrictMode>
|
|
);
|
|
});
|