Skip to content

Commit 8b90496

Browse files
Merge pull request #213433 from salman90/update-react-quickstart-sample
Update react QuickStart sample
2 parents fa7fd03 + 0fa1370 commit 8b90496

File tree

2 files changed

+51
-44
lines changed

2 files changed

+51
-44
lines changed

articles/active-directory/develop/tutorial-v2-javascript-spa.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ sampleApp/
159159
In the next steps you'll create a new folder for the JavaScript SPA, and set up the user interface (UI).
160160

161161
> [!TIP]
162-
> When you set up an Azure Active Directory (Azure AD) account, you create a tenant. This is a digital representation of your organization, and is primarily associated with a domain, like Microsoft.com. If you wish to learn how applications can work with multiple tenants, refer to the [application model](https://docs.microsoft.com/azure/active-directory/develop/application-model).
162+
> When you set up an Azure Active Directory (Azure AD) account, you create a tenant. This is a digital representation of your organization, and is primarily associated with a domain, like Microsoft.com. If you wish to learn how applications can work with multiple tenants, refer to the [application model](/articles/active-directory/develop/application-model.md).
163163
164164
## Create the SPA UI
165165

@@ -488,7 +488,7 @@ The `acquireTokenSilent` method handles token acquisition and renewal without an
488488
489489
## Call the Microsoft Graph API using the acquired token
490490

491-
1. In the *JavaScriptSPA* folder create a *.js* file named *graphConfig.js*, which stores the Representational State Transfer ([REST](https://docs.microsoft.com/rest/api/azure/)) endpoints. Add the following code:
491+
1. In the *JavaScriptSPA* folder create a *.js* file named *graphConfig.js*, which stores the Representational State Transfer ([REST](/rest/api/azure/)) endpoints. Add the following code:
492492

493493
```JavaScript
494494
const graphConfig = {

articles/active-directory/develop/tutorial-v2-react.md

Lines changed: 49 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -133,26 +133,24 @@ In the [Redirect URI: MSAL.js 2.0 with auth code flow](scenario-spa-app-registra
133133
import { msalConfig } from "./authConfig";
134134
```
135135

136-
1. Underneath the imports in *src/index.js* create a `PublicClientApplication` instance using the configuration from step 1.
136+
2. Underneath the imports in *src/index.js* create a `PublicClientApplication` instance using the configuration from step 1.
137137

138138
```javascript
139139
const msalInstance = new PublicClientApplication(msalConfig);
140140
```
141141

142-
1. Find the `<App />` component in *src/index.js* and wrap it in the `MsalProvider` component. Your render function should look like this:
142+
3. Find the `<App />` component in *src/index.js* and wrap it in the `MsalProvider` component. Your render function should look like this:
143143

144144
```jsx
145-
ReactDOM.render(
145+
root.render(
146146
<React.StrictMode>
147147
<MsalProvider instance={msalInstance}>
148148
<App />
149149
</MsalProvider>
150-
</React.StrictMode>,
151-
document.getElementById("root")
150+
</React.StrictMode>
152151
);
153152
```
154153

155-
156154
## Sign in users
157155

158156
Create a folder in *src* called *components* and create a file inside this folder named *SignInButton.jsx*. Add the code from either of the following sections to invoke login using a pop-up window or a full-frame redirect:
@@ -167,20 +165,22 @@ import { useMsal } from "@azure/msal-react";
167165
import { loginRequest } from "../authConfig";
168166
import Button from "react-bootstrap/Button";
169167

170-
function handleLogin(instance) {
171-
instance.loginPopup(loginRequest).catch(e => {
172-
console.error(e);
173-
});
174-
}
175168

176169
/**
177170
* Renders a button which, when selected, will open a popup for login
178171
*/
179172
export const SignInButton = () => {
180173
const { instance } = useMsal();
181174

175+
const handleLogin = (loginType) => {
176+
if (loginType === "popup") {
177+
instance.loginPopup(loginRequest).catch(e => {
178+
console.log(e);
179+
});
180+
}
181+
}
182182
return (
183-
<Button variant="secondary" className="ml-auto" onClick={() => handleLogin(instance)}>Sign in using Popup</Button>
183+
<Button variant="secondary" className="ml-auto" onClick={() => handleLogin("popup")}>Sign in using Popup</Button>
184184
);
185185
}
186186
```
@@ -195,20 +195,22 @@ import { useMsal } from "@azure/msal-react";
195195
import { loginRequest } from "../authConfig";
196196
import Button from "react-bootstrap/Button";
197197

198-
function handleLogin(instance) {
199-
instance.loginRedirect(loginRequest).catch(e => {
200-
console.error(e);
201-
});
202-
}
203198

204199
/**
205200
* Renders a button which, when selected, will redirect the page to the login prompt
206201
*/
207202
export const SignInButton = () => {
208203
const { instance } = useMsal();
209204

205+
const handleLogin = (loginType) => {
206+
if (loginType === "redirect") {
207+
instance.loginRedirect(loginRequest).catch(e => {
208+
console.log(e);
209+
});
210+
}
211+
}
210212
return (
211-
<Button variant="secondary" className="ml-auto" onClick={() => handleLogin(instance)}>Sign in using Redirect</Button>
213+
<Button variant="secondary" className="ml-auto" onClick={() => handleLogin("redirect")}>Sign in using Redirect</Button>
212214
);
213215
}
214216
```
@@ -244,7 +246,7 @@ export const SignInButton = () => {
244246
};
245247
```
246248

247-
2. Now open *src/App.js* and add replace the existing content with the following code:
249+
1. Now open *src/App.js* and add replace the existing content with the following code:
248250

249251
```jsx
250252
import React from "react";
@@ -280,20 +282,23 @@ import React from "react";
280282
import { useMsal } from "@azure/msal-react";
281283
import Button from "react-bootstrap/Button";
282284
283-
function handleLogout(instance) {
284-
instance.logoutPopup().catch(e => {
285-
console.error(e);
286-
});
287-
}
288-
289285
/**
290286
* Renders a button which, when selected, will open a popup for logout
291287
*/
292288
export const SignOutButton = () => {
293289
const { instance } = useMsal();
294290
291+
const handleLogout = (logoutType) => {
292+
if (logoutType === "popup") {
293+
instance.logoutPopup({
294+
postLogoutRedirectUri: "/",
295+
mainWindowRedirectUri: "/" // redirects the top level app after logout
296+
});
297+
}
298+
}
299+
295300
return (
296-
<Button variant="secondary" className="ml-auto" onClick={() => handleLogout(instance)}>Sign out using Popup</Button>
301+
<Button variant="secondary" className="ml-auto" onClick={() => handleLogout("popup")}>Sign out using Popup</Button>
297302
);
298303
}
299304
```
@@ -307,20 +312,22 @@ import React from "react";
307312
import { useMsal } from "@azure/msal-react";
308313
import Button from "react-bootstrap/Button";
309314
310-
function handleLogout(instance) {
311-
instance.logoutRedirect().catch(e => {
312-
console.error(e);
313-
});
314-
}
315-
316315
/**
317316
* Renders a button which, when selected, will redirect the page to the logout prompt
318317
*/
319318
export const SignOutButton = () => {
320319
const { instance } = useMsal();
320+
321+
const handleLogout = (logoutType) => {
322+
if (logoutType === "redirect") {
323+
instance.logoutRedirect({
324+
postLogoutRedirectUri: "/",
325+
});
326+
}
327+
}
321328
322329
return (
323-
<Button variant="secondary" className="ml-auto" onClick={() => handleLogout(instance)}>Sign out using Redirect</Button>
330+
<Button variant="secondary" className="ml-auto" onClick={() => handleLogout("redirect")}>Sign out using Redirect</Button>
324331
);
325332
}
326333
```
@@ -406,15 +413,15 @@ In order to render certain components only for authenticated or unauthenticated
406413
function ProfileContent() {
407414
const { instance, accounts, inProgress } = useMsal();
408415
const [accessToken, setAccessToken] = useState(null);
409-
416+
410417
const name = accounts[0] && accounts[0].name;
411-
418+
412419
function RequestAccessToken() {
413420
const request = {
414421
...loginRequest,
415422
account: accounts[0]
416423
};
417-
424+
418425
// Silently acquires an access token which is then attached to a request for Microsoft Graph data
419426
instance.acquireTokenSilent(request).then((response) => {
420427
setAccessToken(response.accessToken);
@@ -424,7 +431,7 @@ In order to render certain components only for authenticated or unauthenticated
424431
});
425432
});
426433
}
427-
434+
428435
return (
429436
<>
430437
<h5 className="card-title">Welcome {name}</h5>
@@ -450,7 +457,7 @@ In order to render certain components only for authenticated or unauthenticated
450457

451458
1. Finally, add your new `ProfileContent` component as a child of the `AuthenticatedTemplate` in your `App` component in *src/App.js*. Your `App` component should look like this:
452459

453-
```javascript
460+
```jsx
454461
function App() {
455462
return (
456463
<PageLayout>
@@ -538,15 +545,15 @@ If you're using Internet Explorer, we recommend that you use the `loginRedirect`
538545
function ProfileContent() {
539546
const { instance, accounts } = useMsal();
540547
const [graphData, setGraphData] = useState(null);
541-
548+
542549
const name = accounts[0] && accounts[0].name;
543-
550+
544551
function RequestProfileData() {
545552
const request = {
546553
...loginRequest,
547554
account: accounts[0]
548555
};
549-
556+
550557
// Silently acquires an access token which is then attached to a request for Microsoft Graph data
551558
instance.acquireTokenSilent(request).then((response) => {
552559
callMsGraph(response.accessToken).then(response => setGraphData(response));
@@ -556,7 +563,7 @@ If you're using Internet Explorer, we recommend that you use the `loginRedirect`
556563
});
557564
});
558565
}
559-
566+
560567
return (
561568
<>
562569
<h5 className="card-title">Welcome {name}</h5>

0 commit comments

Comments
 (0)