Bagikan melalui


Tutorial: Memanggil API web dari aplikasi daemon Node.js Anda

Tutorial ini adalah bagian akhir dari seri yang menunjukkan cara menyiapkan aplikasi klien daemon Node.js Anda menggunakan alur pemberian kredensial klien Open Authorization (OAuth) 2.0, lalu mengonfigurasinya untuk memperoleh token akses untuk memanggil API web. di Bagian 1 dari seri ini, Anda mendaftarkan API web dan aplikasi daemon di pusat admin Microsoft Entra dan memberikan izin. Langkah terakhir ini menunjukkan cara membuat aplikasi Node.js menggunakan Microsoft Authentication Library (MSAL) untuk Node guna menyederhanakan penambahan otorisasi ke aplikasi Anda.

Dalam tutorial ini;

  • Buat aplikasi Node.js di Visual Studio Code, lalu instal dependensi.
  • Aktifkan aplikasi Node.js untuk memperoleh token akses untuk memanggil API web.

Prasyarat

  • Tutorial: Siapkan penyewa eksternal Anda untuk mengotorisasi aplikasi daemon Node.js.
  • API web yang dilindungi yang berjalan dan siap menerima permintaan. Jika Anda belum membuatnya, lihat tutorial membuat API web yang dilindungi. Pastikan API web ini menggunakan detail pendaftaran aplikasi yang Anda buat dalam tutorial menyiapkan penyewa. Pastikan API web Anda mengekspos titik akhir berikut melalui HTTPS:
    • GET /api/todolist untuk mendapatkan semua todos.
    • POST /api/todolist untuk menambahkan TODO.
  • Node.js.
  • Meskipun setiap lingkungan pengembangan terintegrasi (IDE) yang mendukung aplikasi React dapat digunakan, tutorial ini menggunakan Visual Studio Code.
  • Detail pendaftaran untuk aplikasi daemon Node.js dan API web yang Anda buat dalam tutorial menyiapkan penyewa.

Membuat proyek daemon Node.js

Buat folder untuk menghosting aplikasi daemon Node.js Anda, seperti ciam-call-api-node-daemon:

  1. Di terminal Anda, ubah direktori ke folder aplikasi node daemon Anda, seperti cd ciam-call-api-node-daemon, lalu jalankan npm init -y. Perintah ini membuat file package.json default untuk proyek Node.js Anda. Perintah ini membuat file package.json default untuk proyek Node.js Anda.

  2. Buat folder dan file tambahan untuk mencapai struktur proyek berikut:

        ciam-call-api-node-daemon/
        ├── auth.js
        └── authConfig.js
        └── fetch.js
        └── index.js 
        └── package.json
    

Instal dependensi aplikasi

Di terminal Anda, instal axios, yargs dan @azure/msal-node paket dengan menjalankan perintah berikut:

npm install axios yargs @azure/msal-node   

Membuat objek konfigurasi MSAL

Di editor kode Anda, buka file authConfig.js , lalu tambahkan kode berikut:

require('dotenv').config();

/**
 * 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 || 'Enter_the_Application_Id_Here', // 'Application (client) ID' of app registration in Azure portal - this value is a GUID
        authority: process.env.AUTHORITY || 'https://Enter_the_Tenant_Subdomain_Here.ciamlogin.com/', // Replace "Enter_the_Tenant_Subdomain_Here" with your tenant subdomain
        clientSecret: process.env.CLIENT_SECRET || 'Enter_the_Client_Secret_Here', // Client secret generated from the app 
    },
    system: {
        loggerOptions: {
            loggerCallback(loglevel, message, containsPii) {
                console.log(message);
            },
            piiLoggingEnabled: false,
            logLevel: 'Info',
        },
    },
};    
const protectedResources = {
    apiToDoList: {
        endpoint: process.env.API_ENDPOINT || 'https://localhost:44351/api/todolist',
        scopes: [process.env.SCOPES || 'api://Enter_the_Web_Api_Application_Id_Here'],
    },
};

module.exports = {
    msalConfig,
    protectedResources,
};

Objek msalConfig berisi sekumpulan opsi konfigurasi yang Anda gunakan untuk menyesuaikan perilaku alur otorisasi Anda.

Dalam file authConfig.js Anda, ganti:

  • Enter_the_Application_Id_Here dengan ID Aplikasi (klien) dari aplikasi daemon klien yang Anda daftarkan sebelumnya.

  • Enter_the_Tenant_Subdomain_Here dan ganti dengan subdomain Direktori (penyewa). Misalnya, jika domain utama penyewa Anda adalah contoso.onmicrosoft.com, gunakan contoso. Jika Anda tidak memiliki nama penyewa, pelajari cara membaca detail penyewa Anda.

  • Enter_the_Client_Secret_Here dengan nilai rahasia aplikasi daemon klien yang Anda salin sebelumnya.

  • Enter_the_Web_Api_Application_Id_Here dengan ID Aplikasi (klien) aplikasi API web yang Anda salin sebelumnya.

Perhatikan bahwa scopes properti dalam protectedResources variabel adalah pengidentifikasi sumber daya (URI ID aplikasi) dari API web yang Anda daftarkan sebelumnya. URI cakupan lengkap terlihat mirip api://Enter_the_Web_Api_Application_Id_Here/.defaultdengan .

Memperoleh token akses

Di editor kode Anda, buka file auth.js , lalu tambahkan kode berikut:

const msal = require('@azure/msal-node');
const { msalConfig, protectedResources } = require('./authConfig');
/**
 * With client credentials flows permissions need to be granted in the portal by a tenant administrator.
 * The scope is always in the format '<resource-appId-uri>/.default'. For more, visit:
 * https://docs.microsoft.com/azure/active-directory/develop/v2-oauth2-client-creds-grant-flow
 */
const tokenRequest = {
    scopes: [`${protectedResources.apiToDoList.scopes}/.default`],
};

const apiConfig = {
    uri: protectedResources.apiToDoList.endpoint,
};

/**
 * Initialize a confidential client application. For more info, visit:
 * https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-node/docs/initialize-confidential-client-application.md
 */
const cca = new msal.ConfidentialClientApplication(msalConfig);
/**
 * Acquires token with client credentials.
 * @param {object} tokenRequest
 */
async function getToken(tokenRequest) {
    return await cca.acquireTokenByClientCredential(tokenRequest);
}

module.exports = {
    apiConfig: apiConfig,
    tokenRequest: tokenRequest,
    getToken: getToken,
};

Dalam kode:

  • Siapkan tokenRequest objek dan apiConfig . tokenRequest berisi cakupan yang Anda minta token aksesnya. Cakupannya terlihat seperti api://Enter_the_Web_Api_Application_Id_Here/.default. Objek apiConfig berisi titik akhir ke API web Anda. Pelajari selengkapnya tentang alur kredensial klien OAuth 2.0.

  • Anda membuat instans klien rahasia dengan meneruskan msalConfig objek ke konstruktor kelas ConfidentialClientApplication .

    const cca = new msal.ConfidentialClientApplication(msalConfig);
    
  • Anda kemudian menggunakan fungsi acquireTokenByClientCredential untuk memperoleh token akses. Anda menerapkan logika ini dalam getToken fungsi :

    cca.acquireTokenByClientCredential(tokenRequest);
    

Setelah memperoleh token akses, Anda dapat melanjutkan untuk memanggil API.

Panggil API

Di editor kode Anda, buka file fetch.js , lalu tambahkan kode berikut:

const axios = require('axios');

/**
 * Calls the endpoint with authorization bearer token.
 * @param {string} endpoint
 * @param {string} accessToken 
 */
async function callApi(endpoint, accessToken) {

    const options = {
        headers: {
            Authorization: `Bearer ${accessToken}`
        }
    };

    console.log('request made to web API at: ' + new Date().toString());

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

module.exports = {
    callApi: callApi
};

Dalam kode ini, Anda melakukan panggilan ke API web, dengan meneruskan token akses sebagai token pembawa di header permintaan Authorization :

 Authorization: `Bearer ${accessToken}`

Anda menggunakan token akses yang Anda peroleh sebelumnya di Memperoleh token akses.

Setelah API web menerima permintaan, API tersebut mengevaluasinya kemudian menentukan bahwa itu adalah permintaan aplikasi. Jika token akses valid, API web mengembalikan data yang diminta. Jika tidak, API mengembalikan 401 Unauthorized kesalahan HTTP.

Menyelesaikan aplikasi daemon Anda

Di editor kode Anda, buka file index.js , lalu tambahkan kode berikut:

#!/usr/bin/env node

// read in env settings

require('dotenv').config();

const yargs = require('yargs');
const fetch = require('./fetch');
const auth = require('./auth');

const options = yargs
    .usage('Usage: --op <operation_name>')
    .option('op', { alias: 'operation', describe: 'operation name', type: 'string', demandOption: true })
    .argv;

async function main() {
    console.log(`You have selected: ${options.op}`);

    switch (yargs.argv['op']) {
        case 'getToDos':
            try {
                const authResponse = await auth.getToken(auth.tokenRequest);
                const todos = await fetch.callApi(auth.apiConfig.uri, authResponse.accessToken);                
            } catch (error) {
                console.log(error);
            }

            break;
        default:
            console.log('Select an operation first');
            break;
    }
};

main();

Kode ini adalah titik masuk ke aplikasi Anda. Anda menggunakan pustaka penguraian argumen baris perintah JavaScript yargs untuk aplikasi Node.js untuk mengambil token akses secara interaktif, lalu memanggil API. Anda menggunakan fungsi dan callApi yang getToken Anda tentukan sebelumnya:

const authResponse = await auth.getToken(auth.tokenRequest);
const todos = await fetch.callApi(auth.apiConfig.uri, authResponse.accessToken);                

Jalankan dan uji aplikasi daemon dan API

Pada titik ini, Anda siap untuk menguji aplikasi daemon klien dan API web Anda:

  1. Gunakan langkah-langkah yang Anda pelajari dalam Mengamankan tutorial API web ASP.NET untuk memulai API web Anda. API web Anda sekarang siap untuk melayani permintaan klien. Jika Anda tidak menjalankan API web di port 44351 seperti yang ditentukan dalam file authConfig.js , pastikan Anda memperbarui file authConfig.js untuk menggunakan nomor port API web yang benar.

  2. Di terminal, pastikan Anda berada di folder proyek yang berisi daemon Node.js aplikasi seperti ciam-call-api-node-daemon, lalu jalankan perintah berikut:

    node . --op getToDos
    

Jika aplikasi daemon dan API web Anda berhasil dijalankan, Anda harus menemukan data yang dikembalikan oleh variabel titik todos akhir API web, mirip dengan array JSON berikut, di jendela konsol Anda:

{
    id: 1,
    owner: '3e8....-db63-43a2-a767-5d7db...',
    description: 'Pick up grocery'
},
{
    id: 2,
    owner: 'c3cc....-c4ec-4531-a197-cb919ed.....',
    description: 'Finish invoice report'
},
{
    id: 3,
    owner: 'a35e....-3b8a-4632-8c4f-ffb840d.....',
    description: 'Water plants'
}

Langkah selanjutnya