рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛
рдПрдЬрд╝реНрдпреЛрд░ рдмреА 2 рд╕реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдкрд░ рдЪрдХреНрд░ рдХреА рдирд┐рд░рдВрддрд░рддрд╛ред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ рдХрд┐ рд░рд┐рдПрдХреНрдЯ рдЬреЗрдПрд╕ рдкрд░ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреИрд╕реЗ рд╕рдХреНрд╖рдо рдХрд┐рдпрд╛ рдЬрд╛рдПредрд╕рдВрдмрдВрдзрд┐рдд рдкреЛрд╕реНрдЯ рдХреЗ рд▓рд┐рдВрдХрдЪрд░рдг 1
рдЖрдкрдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдПрдб-рдПрдордПрд╕рдПрд▓ (рдПрдирдкреАрдПрдо рдЖрдИ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдПрдб-рдПрдордПрд╕рдПрд▓) рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ ред рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдЦрд╛рд▓реА Cort.html рдлрд╝рд╛рдЗрд▓рдЬреЛрдбрд╝реЗрдВрдЪрд░рдг 2
./Src рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдСрдХреНрдЯрд╛ -рдкреНрд░реЛрд╡рд╛рдЗрдбрд░.рдЯреАрдПрд╕
рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБрдЖрдкрдХреЛ рдпрд╣ рднреА рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдПрдЬрд╝реНрдпреЛрд░ рдмреА 2 рд╕реА рдореЗрдВ, рдПрдкреАрдЖрдИ рдЕрдиреБрдорддрд┐рдпрд╛рдБ рдЯреИрдм рдореЗрдВ рдУрдкрдирд┐рдб рдФрд░ рдкреНрд░реЛрдлрд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╢рд╛рд╕рдХ рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЧрдИ рд╣реИ ред
import { MsalAuthProvider, LoginType } from 'react-aad-msal';
import { Configuration } from 'msal/lib-commonjs/Configuration';
export const config = (azurePolicy: string): Configuration => ({
auth: {
authority: `https://yourcompany.b2clogin.com/yourcompany.onmicrosoft.com/${azurePolicy}`,
validateAuthority: false,
clientId: '777aaa77a-7a77-7777-bb77-8888888aabc',
},
cache: {
cacheLocation: 'localStorage',
storeAuthStateInCookie: false,
},
});
const authenticationParameters = {
scopes: [
'https://myapp.onmicrosoft.com/777aaa77a-7a77-7777-bb77-8888888aabc/openid',
'https://myapp.onmicrosoft.com/777aaa77a-7a77-7777-bb77-8888888aabc/profile',
],
};
export const options = {
loginType: LoginType.Redirect,
tokenRefreshUri: `${window.location.origin}/auth.html`,
};
export const authProvider = (customConfig: Configuration): MsalAuthProvider => new MsalAuthProvider(customConfig, authenticationParameters, options);
рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдореЗрдВ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдиреАрддрд┐рдпреЛрдВ рдХрд╛ рдирд╛рдо рдХрд╣рд╛рдВ рд╣реИ
рдЪрд░рдг 3
Index.tsx рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рдЖрдкрдХреЛ рдЙрди рд▓рд┐рдкрд┐рдпреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдкрдХреЗ рдЖрд╡реЗрджрди рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░реЗрдЧрд╛ред import * as React from 'react';
import * as ReactDOM from 'react-dom';
import { Provider } from 'react-redux';
import { AzureAD, AuthenticationState, IAzureADFunctionProps } from 'react-aad-msal';
import { authProvider, config } from './auth-provider';
import App from './App';
const store = configureStore();
const unauthenticatedFunction = () => (
<AzureAD provider={authProvider(config('B2C_1A_PasswordReset'))}>
{
({
login, logout, authenticationState, error, accountInfo,
}: IAzureADFunctionProps): React.ReactElement | void => {
switch (authenticationState) {
default:
login();
return <h1>Loading...</h1>;
}
}
}
</AzureAD>
);
ReactDOM.render(
<Provider store={store}>
//
<AzureAD provider={authProvider(config('B2C_1A_signup_signin'))} reduxStore={store}>
{
({
login, logout, authenticationState, error, accountInfo,
}: IAzureADFunctionProps): React.ReactElement | void => {
switch (authenticationState) {
case AuthenticationState.Authenticated:
console.log(accountInfo); // + JWT Token
return <App />;
case AuthenticationState.Unauthenticated:
if (!accountInfo && !error) {
login();
}
if (!accountInfo && error) {
//
// AADB2C90118
if (error.errorMessage.includes('AADB2C90118')) {
return unauthenticatedFunction();
}
// ,
// ( " " "")
if (error.errorMessage.includes('AADB2C90091')) {
login();
}
}
console.log('ERROR', error);
return <h1>Not authorized</h1>;
case AuthenticationState.InProgress:
return <h1>In progress</h1>;
default:
return <h1>Default</h1>;
}
}
}
</AzureAD>
</Provider>,
document.getElementById('root'),
);
registerServiceWorker();
рдЪрд░рдг 4
"рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрдВрдЬреАрдХрд░рдг" рдЯреИрдм рдореЗрдВ рдПрдЬрд╝реНрдпреЛрд░ рдПрдбреА рдмреА 2 рд╕реА рдкрд░
рдЬрд╛рдПрдВ рдФрд░ рдЙрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ рдЬрд┐рд╕реЗ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛:IdentityExperienceFramework рдФрд░ ProxyIdentityExperienceFramework редрдпрджрд┐ рдЖрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рд╣реИ, рддреЛ "рдмреЗрд╕рд┐рдХ рдпреВрдЬрд░ рд╕реНрдЯреНрд░реАрдо" рдЪрд░рдг рдкрд░ рдЬрд╛рдПрдВ ред
рдЕрдЧрд▓рд╛, рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдореЗрдВ рдЬрд╛рдПрдВ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд URI рдЬреЛрдбрд╝реЗрдВ:
рдирд┐рд╖реНрдХрд░реНрд╖
рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдп рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рддреЗ рд╕рдордп, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдкреГрд╖реНрда рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛редрдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдзрдиреНрдпрд╡рд╛рдж!