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
:
Di terminal Anda, ubah direktori ke folder aplikasi node daemon Anda, seperti
cd ciam-call-api-node-daemon
, lalu jalankannpm init -y
. Perintah ini membuat file package.json default untuk proyek Node.js Anda. Perintah ini membuat filepackage.json
default untuk proyek Node.js Anda.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 adalahcontoso.onmicrosoft.com
, gunakancontoso
. 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/.default
dengan .
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 danapiConfig
.tokenRequest
berisi cakupan yang Anda minta token aksesnya. Cakupannya terlihat sepertiapi://Enter_the_Web_Api_Application_Id_Here/.default
. ObjekapiConfig
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:
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.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
Gunakan sertifikat klien alih-alih rahasia untuk autentikasi di aplikasi rahasia Node.js Anda.