Megosztás a következőn keresztül:


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 bejelentkezteti a felhasználókat, és hozzáférési tokeneket szerez a Microsoft Graph meghívásához. A buildelt webalkalmazás a Node Microsoft Authentication Libraryt (MSAL) használja.

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 Alkalmazás regisztrálása a Microsoft identitásplatformon lépéseit az alkalmazás regisztrálásához.

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
  • Platformtípus: 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öz használatával hozzon létre egy alkalmazásvázzat.

  1. Először telepítse a 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, dotenv csomagot a környezeti paraméterek olvasásához a fejlesztés során, és axios a Microsoft Graph API felé irányuló hálózati hívások indításához. 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 adja hozzá 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ő esetében írja be a https://login.microsoftonline.com/ karaktert, beleértve a végén lévő perjelet is.
    • Az nemzeti felhők (például Kína) esetében a Nemzeti felhőkrészében találhat megfelelő értékeket.
  • Enter_the_Tenant_Info_here a következő paraméterek egyikének kell lennie:
    • Ha az alkalmazás támogatja fiókokat ebben a szervezeti címtárban, cserélje le ezt az értéket a bérlőazonosítóra vagy bérlőnévre. Például contoso.microsoft.com.
    • Ha az alkalmazás támogatja a -fiókokat bármely szervezeti címtárban, cserélje le ezt az értéket organizations.
    • Ha az alkalmazás támogatja fiókokat bármely szervezeti címtárban és személyes Microsoft-fiókban, cserélje le ezt az értéket common.
    • Ha csak személyes Microsoft-fiókok támogatását szeretné korlátozni, cserélje le ezt az értéket consumers.
  • Enter_the_Application_Id_Here: Az Ön által regisztrált alkalmazás alkalmazás (ügyfél) azonosítója.
  • Enter_the_Client_secret: Cserélje le ezt az értéket a korábban létrehozott titkos ügyfélkódra. Új kulcs létrehozásához használja 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. Használjon tanúsítvány hitelesítő adatokat a bizalmas ügyfélalkalmazások titkos ügyfélkódjai helyett, különösen azokban az alkalmazásokban, amelyeket éles környezetben kíván üzembe helyezni.

  • 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áshoz adja meg a 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 kulcsot. Válasszon ki egy véletlenszerű karaktersorozatot a kódsor lecseréléséhez, például az ügyfél titkos kulcsá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 tokenek beszerzéséhez

  1. Hozzon létre egy hitelesítésinevű új mappát, és vegyen fel egy AuthProvider.js nevű új fájlt. Ez tartalmazza az AuthProvider osztályt, amely az MSAL-csomópont használatával 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 fájlt id.hbs a felhasználó azonosító jogkivonatá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 fájlt profile.hbs néven 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>

Routerek regisztrálása és az á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 nyomon követéséhez az express-session csomag használatával. 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. Látnia kellene egy üdvözlőoldalt.

A webalkalmazás üdvözlőlapjának megjelenítése

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

Microsoft Entra bejelentkezési képernyője

  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 hozzájárulási képernyője

  1. Ha beleegyezik, az alkalmazás kezdőlapjára lesz átirányítva.

webalkalmazás üdvözlőoldala a bejelentkezés után

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

felhasználói azonosító token képernyője

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

Grafikonhívás képernyője

  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 bejelentkezési képernyője

Az alkalmazás működése

Ebben az oktatóanyagban egy MSAL Node ConfidentialClientApplication objektumot példányosított a konfigurációs objektum (msalConfig) átadásával, amely a Microsoft Entra alkalmazásregisztrációjából az Azure Portálon beszerzett paramétereket tartalmazza. A létrehozott webalkalmazás az OpenID Connect protokollt használja a felhasználók bejelentkezéséhez, valamint az OAuth 2.0 engedélyezési kódfolyamat 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ásplatformján, tekintse meg többrészes forgatókönyv-sorozatunkat: