Bagikan melalui


Memperoleh token akses di aplikasi web Node.js Anda

Berlaku untuk: Lingkaran putih dengan simbol X abu-abu. Penyewa Tenaga Kerja Lingkaran hijau dengan simbol tanda centang putih. Penyewa eksternal (pelajari lebih lanjut)

Dalam artikel ini, Anda memperbarui kode, untuk mengaktifkan aplikasi web Anda untuk memperoleh token akses. Anda menggunakan Microsoft Authentication Library (MSAL) untuk node untuk menyederhanakan penambahan autentikasi dan otorisasi ke aplikasi web simpul Anda. Artikel ini adalah bagian ketiga dari seri panduan empat bagian.

Prasyarat

Memperbarui objek konfigurasi MSAL

Di editor kode Anda, buka file authConfig.js, lalu perbarui kode dengan menambahkan objek protectedResources:

    //..   
    const toDoListReadScope = process.env.TODOLIST_READ || 'api://Enter_the_Web_Api_Application_Id_Here/ToDoList.Read';
    const toDoListReadWriteScope = process.env.TODOLIST_READWRITE || 'api://Enter_the_Web_Api_Application_Id_Here/ToDoList.ReadWrite';
    
    const protectedResources = {
        toDoListAPI: {
            endpoint: 'https://localhost:44351/api/todolist',
            scopes: {
                read: [toDoListReadScope],
                write: [toDoListReadWriteScope],
            },
        },
    };    
    module.exports = {
        //..
        protectedResources,
        //..
    };

Dalam file authConfig.js Anda, ganti Enter_the_Web_Api_Application_Id_Here dengan ID Klien dari aplikasi API web yang Anda daftarkan di tenant pelanggan Anda.

Variabel todolistReadScope dan todolistReadWriteScope menyimpan URL cakupan penuh API web yang Anda tetapkan di penyewa eksternal Anda. Pastikan Anda mengekspor objek protectedResources.

Memperoleh token akses

Di editor kode Anda, buka file autentikasi/AuthProvider.js, lalu perbarui metode getToken di kelas AuthProvider:

    const axios = require('axios');
    class AuthProvider {
    //...
        getToken(scopes) {
            return  async function (req, res, next) {
                const msalInstance = authProvider.getMsalInstance(authProvider.config.msalConfig);
                try {
                    msalInstance.getTokenCache().deserialize(req.session.tokenCache);
    
                    const silentRequest = {
                        account: req.session.account,
                        scopes: scopes,
                    };
    
                    const tokenResponse = await msalInstance.acquireTokenSilent(silentRequest);
    
                    req.session.tokenCache = msalInstance.getTokenCache().serialize();
                    req.session.accessToken = tokenResponse.accessToken;
                    next();
                } catch (error) {
                    if (error instanceof msal.InteractionRequiredAuthError) {
                        req.session.csrfToken = authProvider.cryptoProvider.createNewGuid();
    
                        const state = authProvider.cryptoProvider.base64Encode(
                            JSON.stringify({
                                redirectTo: 'http://localhost:3000/todos',
                                csrfToken: req.session.csrfToken,
                            })
                        );
                        
                        const authCodeUrlRequestParams = {
                            state: state,
                            scopes: scopes,
                        };
    
                        const authCodeRequestParams = {
                            state: state,
                            scopes: scopes,
                        };
    
                        authProvider.redirectToAuthCodeUrl(
                            req,
                            res,
                            next,
                            authCodeUrlRequestParams,
                            authCodeRequestParams,
                            msalInstance
                        );
                    }
    
                    next(error);
                }
            };
        }
    //...
    }
  • Pertama, fungsi mencoba memperoleh token akses secara diam-diam (tanpa meminta kredensial kepada pengguna):

    const silentRequest = {
        account: req.session.account,
        scopes: scopes,
    };
    
    const tokenResponse = await msalInstance.acquireTokenSilent(silentRequest);
    
  • Jika Anda berhasil memperoleh token secara diam-diam, simpan dalam sesi. Anda mengambil token dari sesi saat memanggil API.

    req.session.accessToken = tokenResponse.accessToken;
    
  • Jika Anda gagal memperoleh token tanpa interaksi pengguna (seperti dengan pengecualian InteractionRequiredAuthError), minta ulang token akses baru.

Nota

Setelah aplikasi klien Anda menerima token akses, aplikasi tersebut harus memperlakukannya sebagai string buram. Token akses ditujukan untuk API, bukan untuk aplikasi klien. Oleh karena itu, aplikasi klien tidak boleh mencoba membaca atau memproses token akses. Sebaliknya, aplikasi ini harus menyertakan token akses as-is dalam header Otorisasi permintaan mereka ke API. API bertanggung jawab untuk menginterpretasikan token akses dan menggunakannya untuk mengautentikasi dan mengotorisasi permintaan aplikasi klien.

Langkah berikutnya