Oktatóanyag: Felhasználók bejelentkezése és jogkivonat beszerzése a Microsoft Graphhoz egy Node.js > Express-webalkalmazásban

Ebben az oktatóanyagban létrehoz egy webalkalmazást, amely bejelentkezik a felhasználókba, és hozzáférési jogkivonatokat szerez be a Microsoft Graph meghívásához. A buildelt webalkalmazás a Microsoft Authentication Libraryt (MSAL) használja a Node-hoz.

Kövesse az oktatóanyag lépéseit a következőkhöz:

  • Az alkalmazás regisztrálása az Azure Portalon
  • Express webalkalmazás-projekt létrehozása
  • A hitelesítési kódtárcsomagok telepítése
  • Alkalmazásregisztráció részleteinek hozzáadása
  • Kód hozzáadása felhasználói bejelentkezéshez
  • Az alkalmazás tesztelése

További információkért tekintse meg a mintakódot, amely bemutatja, hogyan használhatja az MSAL-csomópontot a bejelentkezéshez, kijelentkezéshez és hozzáférési jogkivonat beszerzéséhez egy védett erőforráshoz, például a Microsoft Graphhoz.

Előfeltételek

Az alkalmazás regisztrálása

Először végezze el az alkalmazás regisztrálásához szükséges lépéseket az alkalmazás regisztrálásához az Microsoft Identitásplatform.

Az alkalmazásregisztrációhoz használja az alábbi beállításokat:

  • Név: ExpressWebApp (javasolt)
  • Támogatott fióktípusok: Csak ebben a szervezeti címtárban lévő fiókok
  • Platform típusa: Web
  • Átirányítási URI: http://localhost:3000/auth/redirect
  • Titkos ügyfélkód: ********* (ezt az értéket egy későbbi lépésben rögzítheti – csak egyszer jelenik meg)

A projekt létrehozása

Az Express alkalmazásgenerátor eszközzel hozzon létre egy alkalmazásvázzat.

  1. Először telepítse az express-generator csomagot:
    npm install -g express-generator
  1. Ezután hozzon létre egy alkalmazásvázzat az alábbiak szerint:
    express --view=hbs /ExpressWebApp && cd /ExpressWebApp
    npm install

Most már rendelkezik egy egyszerű Express-webalkalmazással. A projekt fájl- és mappaszerkezetének a következő mappastruktúrához hasonlóan kell kinéznie:

ExpressWebApp/
├── bin/
|    └── wwww
├── public/
|    ├── images/
|    ├── javascript/
|    └── stylesheets/
|        └── style.css
├── routes/
|    ├── index.js
|    └── users.js
├── views/
|    ├── error.hbs
|    ├── index.hbs
|    └── layout.hbs
├── app.js
└── package.json

A hitelesítési kódtár telepítése

Keresse meg a projektkönyvtár gyökerét egy terminálban, és telepítse az MSAL Node-csomagot npm-en keresztül.

    npm install --save @azure/msal-node

Egyéb függőségek telepítése

Az oktatóanyagban szereplő webalkalmazás-minta az express-session csomagot használja a munkamenet-kezeléshez, a dotenv-csomagot a környezet paramétereinek olvasásához a fejlesztés során, valamint axiost a Microsoft Graph API felé irányuló hálózati hívásokhoz. Telepítse ezeket az npm-en keresztül:

    npm install --save express-session dotenv axios

Alkalmazásregisztráció részleteinek hozzáadása

  1. Hozzon létre egy .env.dev fájlt a projektmappa gyökerében. Ezután írja be a következő kódot:
CLOUD_INSTANCE="Enter_the_Cloud_Instance_Id_Here" # cloud instance string should end with a trailing slash
TENANT_ID="Enter_the_Tenant_Info_Here"
CLIENT_ID="Enter_the_Application_Id_Here"
CLIENT_SECRET="Enter_the_Client_Secret_Here"

REDIRECT_URI="http://localhost:3000/auth/redirect"
POST_LOGOUT_REDIRECT_URI="http://localhost:3000"

GRAPH_API_ENDPOINT="Enter_the_Graph_Endpoint_Here" # graph api endpoint string should end with a trailing slash

EXPRESS_SESSION_SECRET="Enter_the_Express_Session_Secret_Here"

Töltse ki ezeket a részleteket az Azure alkalmazásregisztrációs portálról beszerzett értékekkel:

  • Enter_the_Cloud_Instance_Id_Here: Az az Azure-felhőpéldány, amelyben az alkalmazás regisztrálva van.
    • A fő (vagy globális) Azure-felhőben adja meg https://login.microsoftonline.com/ (a záró perjelet is).
    • A nemzeti felhők (például Kína) esetében a nemzeti felhőkben megtalálhatja a megfelelő értékeket.
  • Enter_the_Tenant_Info_here az alábbi paraméterek egyikének kell lennie:
    • Ha az alkalmazás támogatja a szervezeti címtárban lévő fiókokat, cserélje le ezt az értéket a bérlőazonosítóra vagy a bérlő nevére. Például: contoso.microsoft.com.
    • Ha az alkalmazás bármely szervezeti könyvtárban támogatja a fiókokat, cserélje le ezt az értéket a következőreorganizations: .
    • Ha az alkalmazás bármely szervezeti címtárban és személyes Microsoft-fiókban támogatja a fiókokat, cserélje le ezt az értéket a következőre common: .
    • Ha csak a személyes Microsoft-fiókok támogatását szeretné korlátozni, cserélje le ezt az értéket consumersa gombra.
  • Enter_the_Application_Id_Here: A regisztrált alkalmazás (ügyfél) azonosítója .
  • Enter_the_Client_secret: Cserélje le ezt az értéket a korábban létrehozott ügyfélkódra. Új kulcs létrehozásához használja a Tanúsítványok > titkos kulcsokat az Azure Portal alkalmazásregisztrációs beállításai között.

Figyelmeztetés

A forráskódban lévő egyszerű szöveges titkos kódok nagyobb biztonsági kockázatot jelentenek. Ez a cikk egyszerű szöveges ügyfélkulcsot használ csak az egyszerűség kedvéért. A bizalmas ügyfélalkalmazásokban használjon tanúsítvány-hitelesítő adatokat az ügyfél titkos kulcsai helyett, különösen az éles környezetben üzembe helyezni kívánt alkalmazásokat.

  • Enter_the_Graph_Endpoint_Here: Az alkalmazás által meghívni kívánt Microsoft Graph API felhőpéldány. A fő (globális) Microsoft Graph API-szolgáltatás esetében adja meg https://graph.microsoft.com/ (a záró perjelet is).
  • Enter_the_Express_Session_Secret_Here az Express session cookie aláírásához használt titkos kód. Válasszon ki egy véletlenszerű karaktersorozatot a sztring lecseréléséhez, például az ügyfél titkos kódjára.
  1. Ezután hozzon létre egy authConfig.js nevű fájlt a projekt gyökerében az ezekben a paraméterekben való olvasáshoz. A létrehozás után adja hozzá a következő kódot:
/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */

require('dotenv').config({ path: '.env.dev' });

/**
 * Configuration object to be passed to MSAL instance on creation.
 * For a full list of MSAL Node configuration parameters, visit:
 * https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-node/docs/configuration.md
 */
const msalConfig = {
    auth: {
        clientId: process.env.CLIENT_ID, // 'Application (client) ID' of app registration in Azure portal - this value is a GUID
        authority: process.env.CLOUD_INSTANCE + process.env.TENANT_ID, // Full directory URL, in the form of https://login.microsoftonline.com/<tenant>
        clientSecret: process.env.CLIENT_SECRET // Client secret generated from the app registration in Azure portal
    },
    system: {
        loggerOptions: {
            loggerCallback(loglevel, message, containsPii) {
                console.log(message);
            },
            piiLoggingEnabled: false,
            logLevel: 3,
        }
    }
}

const REDIRECT_URI = process.env.REDIRECT_URI;
const POST_LOGOUT_REDIRECT_URI = process.env.POST_LOGOUT_REDIRECT_URI;
const GRAPH_ME_ENDPOINT = process.env.GRAPH_API_ENDPOINT + "v1.0/me";

module.exports = {
    msalConfig,
    REDIRECT_URI,
    POST_LOGOUT_REDIRECT_URI,
    GRAPH_ME_ENDPOINT
};

Kód hozzáadása a felhasználói bejelentkezéshez és a jogkivonatok beszerzéséhez

  1. Hozzon létre egy új, hitelesítés nevű mappát, és adjon hozzá egy új, AuthProvider.js nevű fájlt. Ez tartalmazza az AuthProvider osztályt, amely az MSAL-csomóponttal foglalja magában a szükséges hitelesítési logikát. Adja hozzá a következő kódot:
const msal = require('@azure/msal-node');
const axios = require('axios');

const { msalConfig } = require('../authConfig');

class AuthProvider {
    msalConfig;
    cryptoProvider;

    constructor(msalConfig) {
        this.msalConfig = msalConfig
        this.cryptoProvider = new msal.CryptoProvider();
    };

    login(options = {}) {
        return async (req, res, next) => {

            /**
             * MSAL Node library allows you to pass your custom state as state parameter in the Request object.
             * The state parameter can also be used to encode information of the app's state before redirect.
             * You can pass the user's state in the app, such as the page or view they were on, as input to this parameter.
             */
            const state = this.cryptoProvider.base64Encode(
                JSON.stringify({
                    successRedirect: options.successRedirect || '/',
                })
            );

            const authCodeUrlRequestParams = {
                state: state,

                /**
                 * By default, MSAL Node will add OIDC scopes to the auth code url request. For more information, visit:
                 * https://docs.microsoft.com/azure/active-directory/develop/v2-permissions-and-consent#openid-connect-scopes
                 */
                scopes: options.scopes || [],
                redirectUri: options.redirectUri,
            };

            const authCodeRequestParams = {
                state: state,

                /**
                 * By default, MSAL Node will add OIDC scopes to the auth code request. For more information, visit:
                 * https://docs.microsoft.com/azure/active-directory/develop/v2-permissions-and-consent#openid-connect-scopes
                 */
                scopes: options.scopes || [],
                redirectUri: options.redirectUri,
            };

            /**
             * If the current msal configuration does not have cloudDiscoveryMetadata or authorityMetadata, we will 
             * make a request to the relevant endpoints to retrieve the metadata. This allows MSAL to avoid making 
             * metadata discovery calls, thereby improving performance of token acquisition process. For more, see:
             * https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-node/docs/performance.md
             */
            if (!this.msalConfig.auth.cloudDiscoveryMetadata || !this.msalConfig.auth.authorityMetadata) {

                const [cloudDiscoveryMetadata, authorityMetadata] = await Promise.all([
                    this.getCloudDiscoveryMetadata(this.msalConfig.auth.authority),
                    this.getAuthorityMetadata(this.msalConfig.auth.authority)
                ]);

                this.msalConfig.auth.cloudDiscoveryMetadata = JSON.stringify(cloudDiscoveryMetadata);
                this.msalConfig.auth.authorityMetadata = JSON.stringify(authorityMetadata);
            }

            const msalInstance = this.getMsalInstance(this.msalConfig);

            // trigger the first leg of auth code flow
            return this.redirectToAuthCodeUrl(
                authCodeUrlRequestParams,
                authCodeRequestParams,
                msalInstance
            )(req, res, next);
        };
    }

    acquireToken(options = {}) {
        return async (req, res, next) => {
            try {
                const msalInstance = this.getMsalInstance(this.msalConfig);

                /**
                 * If a token cache exists in the session, deserialize it and set it as the 
                 * cache for the new MSAL CCA instance. For more, see: 
                 * https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-node/docs/caching.md
                 */
                if (req.session.tokenCache) {
                    msalInstance.getTokenCache().deserialize(req.session.tokenCache);
                }

                const tokenResponse = await msalInstance.acquireTokenSilent({
                    account: req.session.account,
                    scopes: options.scopes || [],
                });

                /**
                 * On successful token acquisition, write the updated token 
                 * cache back to the session. For more, see: 
                 * https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-node/docs/caching.md
                 */
                req.session.tokenCache = msalInstance.getTokenCache().serialize();
                req.session.accessToken = tokenResponse.accessToken;
                req.session.idToken = tokenResponse.idToken;
                req.session.account = tokenResponse.account;

                res.redirect(options.successRedirect);
            } catch (error) {
                if (error instanceof msal.InteractionRequiredAuthError) {
                    return this.login({
                        scopes: options.scopes || [],
                        redirectUri: options.redirectUri,
                        successRedirect: options.successRedirect || '/',
                    })(req, res, next);
                }

                next(error);
            }
        };
    }

    handleRedirect(options = {}) {
        return async (req, res, next) => {
            if (!req.body || !req.body.state) {
                return next(new Error('Error: response not found'));
            }

            const authCodeRequest = {
                ...req.session.authCodeRequest,
                code: req.body.code,
                codeVerifier: req.session.pkceCodes.verifier,
            };

            try {
                const msalInstance = this.getMsalInstance(this.msalConfig);

                if (req.session.tokenCache) {
                    msalInstance.getTokenCache().deserialize(req.session.tokenCache);
                }

                const tokenResponse = await msalInstance.acquireTokenByCode(authCodeRequest, req.body);

                req.session.tokenCache = msalInstance.getTokenCache().serialize();
                req.session.idToken = tokenResponse.idToken;
                req.session.account = tokenResponse.account;
                req.session.isAuthenticated = true;

                const state = JSON.parse(this.cryptoProvider.base64Decode(req.body.state));
                res.redirect(state.successRedirect);
            } catch (error) {
                next(error);
            }
        }
    }

    logout(options = {}) {
        return (req, res, next) => {

            /**
             * Construct a logout URI and redirect the user to end the
             * session with Azure AD. For more information, visit:
             * https://docs.microsoft.com/azure/active-directory/develop/v2-protocols-oidc#send-a-sign-out-request
             */
            let logoutUri = `${this.msalConfig.auth.authority}/oauth2/v2.0/`;

            if (options.postLogoutRedirectUri) {
                logoutUri += `logout?post_logout_redirect_uri=${options.postLogoutRedirectUri}`;
            }

            req.session.destroy(() => {
                res.redirect(logoutUri);
            });
        }
    }

    /**
     * Instantiates a new MSAL ConfidentialClientApplication object
     * @param msalConfig: MSAL Node Configuration object 
     * @returns 
     */
    getMsalInstance(msalConfig) {
        return new msal.ConfidentialClientApplication(msalConfig);
    }


    /**
     * Prepares the auth code request parameters and initiates the first leg of auth code flow
     * @param req: Express request object
     * @param res: Express response object
     * @param next: Express next function
     * @param authCodeUrlRequestParams: parameters for requesting an auth code url
     * @param authCodeRequestParams: parameters for requesting tokens using auth code
     */
    redirectToAuthCodeUrl(authCodeUrlRequestParams, authCodeRequestParams, msalInstance) {
        return async (req, res, next) => {
            // Generate PKCE Codes before starting the authorization flow
            const { verifier, challenge } = await this.cryptoProvider.generatePkceCodes();

            // Set generated PKCE codes and method as session vars
            req.session.pkceCodes = {
                challengeMethod: 'S256',
                verifier: verifier,
                challenge: challenge,
            };

            /**
             * By manipulating the request objects below before each request, we can obtain
             * auth artifacts with desired claims. For more information, visit:
             * https://azuread.github.io/microsoft-authentication-library-for-js/ref/modules/_azure_msal_node.html#authorizationurlrequest
             * https://azuread.github.io/microsoft-authentication-library-for-js/ref/modules/_azure_msal_node.html#authorizationcoderequest
             **/
            req.session.authCodeUrlRequest = {
                ...authCodeUrlRequestParams,
                responseMode: msal.ResponseMode.FORM_POST, // recommended for confidential clients
                codeChallenge: req.session.pkceCodes.challenge,
                codeChallengeMethod: req.session.pkceCodes.challengeMethod,
            };

            req.session.authCodeRequest = {
                ...authCodeRequestParams,
                code: '',
            };

            try {
                const authCodeUrlResponse = await msalInstance.getAuthCodeUrl(req.session.authCodeUrlRequest);
                res.redirect(authCodeUrlResponse);
            } catch (error) {
                next(error);
            }
        };
    }

    /**
     * Retrieves cloud discovery metadata from the /discovery/instance endpoint
     * @returns 
     */
    async getCloudDiscoveryMetadata(authority) {
        const endpoint = 'https://login.microsoftonline.com/common/discovery/instance';

        try {
            const response = await axios.get(endpoint, {
                params: {
                    'api-version': '1.1',
                    'authorization_endpoint': `${authority}/oauth2/v2.0/authorize`
                }
            });

            return await response.data;
        } catch (error) {
            throw error;
        }
    }

    /**
     * Retrieves oidc metadata from the openid endpoint
     * @returns
     */
    async getAuthorityMetadata(authority) {
        const endpoint = `${authority}/v2.0/.well-known/openid-configuration`;

        try {
            const response = await axios.get(endpoint);
            return await response.data;
        } catch (error) {
            console.log(error);
        }
    }
}

const authProvider = new AuthProvider(msalConfig);

module.exports = authProvider;
  1. Ezután hozzon létre egy auth.js nevű új fájlt az Útvonalak mappában, és adja hozzá a következő kódot:
/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */

var express = require('express');

const authProvider = require('../auth/AuthProvider');
const { REDIRECT_URI, POST_LOGOUT_REDIRECT_URI } = require('../authConfig');

const router = express.Router();

router.get('/signin', authProvider.login({
    scopes: [],
    redirectUri: REDIRECT_URI,
    successRedirect: '/'
}));

router.get('/acquireToken', authProvider.acquireToken({
    scopes: ['User.Read'],
    redirectUri: REDIRECT_URI,
    successRedirect: '/users/profile'
}));

router.post('/redirect', authProvider.handleRedirect());

router.get('/signout', authProvider.logout({
    postLogoutRedirectUri: POST_LOGOUT_REDIRECT_URI
}));

module.exports = router;
  1. Frissítse a index.js útvonalat úgy, hogy lecseréli a meglévő kódot a következő kódrészletre:
/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */

var express = require('express');
var router = express.Router();

router.get('/', function (req, res, next) {
    res.render('index', {
        title: 'MSAL Node & Express Web App',
        isAuthenticated: req.session.isAuthenticated,
        username: req.session.account?.username,
    });
});

module.exports = router;
  1. Végül frissítse a users.js útvonalat úgy, hogy lecseréli a meglévő kódot a következő kódrészletre:
/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */

var express = require('express');
var router = express.Router();

var fetch = require('../fetch');

var { GRAPH_ME_ENDPOINT } = require('../authConfig');

// custom middleware to check auth state
function isAuthenticated(req, res, next) {
    if (!req.session.isAuthenticated) {
        return res.redirect('/auth/signin'); // redirect to sign-in route
    }

    next();
};

router.get('/id',
    isAuthenticated, // check if user is authenticated
    async function (req, res, next) {
        res.render('id', { idTokenClaims: req.session.account.idTokenClaims });
    }
);

router.get('/profile',
    isAuthenticated, // check if user is authenticated
    async function (req, res, next) {
        try {
            const graphResponse = await fetch(GRAPH_ME_ENDPOINT, req.session.accessToken);
            res.render('profile', { profile: graphResponse });
        } catch (error) {
            next(error);
        }
    }
);

module.exports = router;

Kód hozzáadása a Microsoft Graph API meghívásához

Hozzon létre egy fetch.js nevű fájlt a projekt gyökerében, és adja hozzá a következő kódot:

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */

var axios = require('axios');

/**
 * Attaches a given access token to a MS Graph API call
 * @param endpoint: REST API endpoint to call
 * @param accessToken: raw access token string
 */
async function fetch(endpoint, accessToken) {
    const options = {
        headers: {
            Authorization: `Bearer ${accessToken}`
        }
    };

    console.log(`request made to ${endpoint} at: ` + new Date().toString());

    try {
        const response = await axios.get(endpoint, options);
        return await response.data;
    } catch (error) {
        throw new Error(error);
    }
}

module.exports = fetch;

Nézetek hozzáadása az adatok megjelenítéséhez

  1. A nézetek mappában frissítse az index.hbs fájlt úgy, hogy a meglévő kódot a következőre cseréli:
<h1>{{title}}</h1>
{{#if isAuthenticated }}
<p>Hi {{username}}!</p>
<a href="/users/id">View ID token claims</a>
<br>
<a href="/auth/acquireToken">Acquire a token to call the Microsoft Graph API</a>
<br>
<a href="/auth/signout">Sign out</a>
{{else}}
<p>Welcome to {{title}}</p>
<a href="/auth/signin">Sign in</a>
{{/if}}
  1. Még ugyanabban a mappában hozzon létre egy másik id.hbs nevű fájlt a felhasználó azonosító jogkivonatának tartalmának megjelenítéséhez:
<h1>Azure AD</h1>
<h3>ID Token</h3>
<table>
    <tbody>
        {{#each idTokenClaims}}
        <tr>
            <td>{{@key}}</td>
            <td>{{this}}</td>
        </tr>
        {{/each}}
    </tbody>
</table>
<br>
<a href="https://aka.ms/id-tokens" target="_blank">Learn about claims in this ID token</a>
<br>
<a href="/">Go back</a>
  1. Végül hozzon létre egy másik, profile.hbs nevű fájlt a Microsoft Graph felé irányuló hívás eredményének megjelenítéséhez:
<h1>Microsoft Graph API</h1>
<h3>/me endpoint response</h3>
<table>
    <tbody>
        {{#each profile}}
        <tr>
            <td>{{@key}}</td>
            <td>{{this}}</td>
        </tr>
        {{/each}}
    </tbody>
</table>
<br>
<a href="/">Go back</a>

Útválasztók regisztrálása és állapotkezelés hozzáadása

A projektmappa gyökerében található app.js fájlban regisztrálja a korábban létrehozott útvonalakat, és adja hozzá a munkamenet-támogatást a hitelesítési állapot express-session csomag használatával történő nyomon követéséhez. Cserélje le a meglévő kódot a következő kódrészletre:

/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */

require('dotenv').config();

var path = require('path');
var express = require('express');
var session = require('express-session');
var createError = require('http-errors');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var authRouter = require('./routes/auth');

// initialize express
var app = express();

/**
 * Using express-session middleware for persistent user session. Be sure to
 * familiarize yourself with available options. Visit: https://www.npmjs.com/package/express-session
 */
 app.use(session({
    secret: process.env.EXPRESS_SESSION_SECRET,
    resave: false,
    saveUninitialized: false,
    cookie: {
        httpOnly: true,
        secure: false, // set this to true on production
    }
}));

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'hbs');

app.use(logger('dev'));
app.use(express.json());
app.use(cookieParser());
app.use(express.urlencoded({ extended: false }));
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', indexRouter);
app.use('/users', usersRouter);
app.use('/auth', authRouter);

// catch 404 and forward to error handler
app.use(function (req, res, next) {
    next(createError(404));
});

// error handler
app.use(function (err, req, res, next) {
    // set locals, only providing error in development
    res.locals.message = err.message;
    res.locals.error = req.app.get('env') === 'development' ? err : {};

    // render the error page
    res.status(err.status || 500);
    res.render('error');
});

module.exports = app;

Bejelentkezés tesztelése és a Microsoft Graph meghívása

Befejezte az alkalmazás létrehozását, és készen áll az alkalmazás működésének tesztelésére.

  1. Indítsa el a Node.js konzolalkalmazást a következő parancs futtatásával a projektmappában:
   npm start
  1. Nyisson meg egy böngészőablakot, és navigáljon a http://localhost:3000 címre. Egy üdvözlőoldalnak kell megjelennie:

Web app welcome page displaying

  1. Válassza a Bejelentkezési hivatkozás lehetőséget. Ekkor megjelenik a Microsoft Entra bejelentkezési képernyője:

Microsoft Entra sign-in screen displaying

  1. Miután megadta a hitelesítő adatait, megjelenik egy hozzájárulási képernyő, amely arra kéri, hogy hagyja jóvá az alkalmazás engedélyeit.

Microsoft Entra consent screen displaying

  1. Ha beleegyezik, vissza kell irányítania az alkalmazás kezdőlapjára.

Web app welcome page after sign-in displaying

  1. Válassza a View ID Token hivatkozást a bejelentkezett felhasználó azonosító jogkivonatának tartalmának megjelenítéséhez.

User ID token screen displaying

  1. Lépjen vissza a kezdőlapra, és válassza a Hozzáférési jogkivonat beszerzése lehetőséget, és hívja meg a Microsoft Graph API-hivatkozást . Ha így tesz, látnia kell a Microsoft Graph /me végpont válaszát a bejelentkezett felhasználó számára.

Graph call screen displaying

  1. Lépjen vissza a kezdőlapra, és válassza a Kijelentkezés hivatkozást. Ekkor megjelenik a Microsoft Entra bejelentkezési képernyője.

Microsoft Entra sign-out screen displaying

Az alkalmazás működése

Ebben az oktatóanyagban egy MSAL Node ConfidentialClientApplication objektumot példányosított egy konfigurációs objektum (msalConfig) átadásával, amely a Microsoft Entra alkalmazásregisztrációból az Azure Portalon beszerzett paramétereket tartalmazza. A létrehozott webalkalmazás az OpenID Csatlakozás protokollal jelentkezik be a felhasználókba, és az OAuth 2.0 engedélyezési kódfolyamatot használja a hozzáférési jogkivonatok beszerzéséhez.

Következő lépések

Ha részletesebben szeretne megismerkedni Node.js > Express webalkalmazás-fejlesztéssel a Microsoft Identitásplatform, tekintse meg többrészes forgatókönyv-sorozatunkat: