Kurz: Volání webového rozhraní API z aplikace démon Node.js
Tento kurz je poslední částí série, která ukazuje, jak připravit klientskou aplikaci démona Node.js pomocí toku udělení přihlašovacích údajů klienta OAuth 2.0 (Open Authorization) 2.0 a pak ho nakonfigurovat tak, aby získal přístupový token pro volání webového rozhraní API. v části 1 této série jste zaregistrovali webové rozhraní API a aplikaci démona v Centru pro správu Microsoft Entra a udělili oprávnění. Tento poslední krok ukazuje, jak vytvořit Node.js aplikaci pomocí knihovny Microsoft Authentication Library (MSAL) pro Node , aby se zjednodušilo přidávání autorizace do vaší aplikace.
V tomto kurzu;
- Vytvořte Node.js aplikaci v editoru Visual Studio Code a pak nainstalujte závislosti.
- Povolte aplikaci Node.js získání přístupového tokenu pro volání webového rozhraní API.
Požadavky
- Kurz: Příprava externího tenanta na autorizaci aplikace démona Node.js
- Chráněné webové rozhraní API, které je spuštěné a připravené přijímat požadavky. Pokud jste ho nevytvořili, podívejte se na kurz vytvoření chráněného webového rozhraní API. Ujistěte se, že toto webové rozhraní API používá podrobnosti o registraci aplikace, které jste vytvořili v kurzu přípravy tenanta. Ujistěte se, že webové rozhraní API zveřejňuje následující koncové body prostřednictvím protokolu HTTPS:
GET /api/todolist
dostat všechny todosy.POST /api/todolist
a přidejte todo.
- Node.js.
- I když je možné použít jakékoli integrované vývojové prostředí (IDE), které podporuje aplikace React, tento kurz používá Visual Studio Code.
- Podrobnosti registrace pro aplikaci Node.js démon a webové rozhraní API, které jste vytvořili v kurzu přípravy tenanta.
Vytvoření projektu démona Node.js
Vytvořte složku pro hostování aplikace démona Node.js, například ciam-call-api-node-daemon
:
V terminálu změňte adresář do složky aplikace démon Node, například
cd ciam-call-api-node-daemon
, a pak spusťtenpm init -y
. Tímto příkazem vytvoříte pro svůj projekt Node.js výchozí soubor package.json. Tento příkaz vytvoří výchozípackage.json
soubor pro váš projekt Node.js.Vytvořte další složky a soubory, abyste dosáhli následující struktury projektu:
ciam-call-api-node-daemon/ ├── auth.js └── authConfig.js └── fetch.js └── index.js └── package.json
Instalace závislostí aplikací
V terminálu nainstalujte axios
yargs
a @azure/msal-node
balíčky spuštěním následujícího příkazu:
npm install axios yargs @azure/msal-node
Vytvoření objektu konfigurace MSAL
V editoru kódu otevřete soubor authConfig.js a přidejte následující kód:
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,
};
Objekt msalConfig
obsahuje sadu možností konfigurace, které používáte k přizpůsobení chování toku autorizace.
V souboru authConfig.js nahraďte:
Enter_the_Application_Id_Here
s ID aplikace (klienta) aplikace démon klienta, kterou jste zaregistrovali dříve.Enter_the_Tenant_Subdomain_Here
a nahraďte ji subdoménou adresáře (tenanta). Pokud je například primární doména vašeho tenantacontoso.onmicrosoft.com
, použijtecontoso
. Pokud nemáte název tenanta, přečtěte si, jak si přečíst podrobnosti o tenantovi.Enter_the_Client_Secret_Here
s hodnotou tajného kódu aplikace démon klienta, kterou jste zkopírovali dříve.Enter_the_Web_Api_Application_Id_Here
s ID aplikace (klienta) webové aplikace API, kterou jste si zkopírovali dříve.
Všimněte si, že scopes
vlastnost v protectedResources
proměnné je identifikátor prostředku (identifikátor URI ID aplikace) webového rozhraní API , které jste zaregistrovali dříve. Úplný identifikátor URI oboru vypadá podobně jako api://Enter_the_Web_Api_Application_Id_Here/.default
.
Získání přístupového tokenu
V editoru kódu otevřete soubor auth.js a přidejte následující kód:
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,
};
V kódu:
Připravte objekt
tokenRequest
aapiConfig
objekt. ObsahujetokenRequest
obor, pro který požadujete přístupový token. Obor vypadá nějak taktoapi://Enter_the_Web_Api_Application_Id_Here/.default
. ObjektapiConfig
obsahuje koncový bod pro webové rozhraní API. Přečtěte si další informace o toku přihlašovacích údajů klienta OAuth 2.0.Vytvoříte důvěrnou instanci klienta předáním
msalConfig
objektu do konstruktoru třídy ConfidentialClientApplication .const cca = new msal.ConfidentialClientApplication(msalConfig);
Pak použijete funkci acquireTokenByClientCredential k získání přístupového tokenu. Tuto logiku
getToken
implementujete do funkce:cca.acquireTokenByClientCredential(tokenRequest);
Po získání přístupového tokenu můžete pokračovat voláním rozhraní API.
Volání rozhraní API
V editoru kódu otevřete soubor fetch.js a přidejte následující kód:
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
};
V tomto kódu provedete volání webového rozhraní API předáním přístupového tokenu jako nosný token v hlavičce požadavku Authorization
:
Authorization: `Bearer ${accessToken}`
Použijete přístupový token, který jste získali dříve v části Získání přístupového tokenu.
Jakmile webové rozhraní API obdrží požadavek, vyhodnotí ho a pak určí, že se jedná o požadavek aplikace. Pokud je přístupový token platný, webové rozhraní API vrátí požadovaná data. V opačném případě rozhraní API vrátí 401 Unauthorized
chybu HTTP.
Dokončení aplikace démona
V editoru kódu otevřete soubor index.js a přidejte následující kód:
#!/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();
Tento kód je vstupním bodem aplikace. Knihovnu pro analýzu argumentů příkazového řádku JavaScriptu použijete pro Node.js aplikací k interaktivnímu načtení přístupového tokenu a následnému volání rozhraní API. Použijete dříve getToken
callApi
definované funkce:
const authResponse = await auth.getToken(auth.tokenRequest);
const todos = await fetch.callApi(auth.apiConfig.uri, authResponse.accessToken);
Spuštění a testování aplikace démona a rozhraní API
V tuto chvíli jste připraveni otestovat klientskou aplikaci démona a webové rozhraní API:
Pomocí kroků, které jste se naučili v kurzu k zabezpečení ASP.NET webového rozhraní API, spusťte webové rozhraní API. Vaše webové rozhraní API je teď připravené k obsluhě požadavků klientů. Pokud webové rozhraní API nespusíte na portu
44351
, jak je uvedeno v souboru authConfig.js , nezapomeňte aktualizovat soubor authConfig.js tak, aby používal správné číslo portu webového rozhraní API.V terminálu se ujistěte, že jste ve složce projektu, která obsahuje proces démon, Node.js aplikaci, například
ciam-call-api-node-daemon
, a spusťte následující příkaz:node . --op getToDos
Pokud se vaše aplikace démona a webové rozhraní API úspěšně spustí, měli byste v okně konzoly najít data vrácená proměnnou koncového bodu todos
webového rozhraní API, podobně jako v následujícím poli JSON:
{
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'
}
Další krok
Pro ověřování v Node.js důvěrné aplikaci používejte klientský certifikát místo tajného klíče.