Öğretici: Node.js daemon uygulamanızdan web API'si çağırma
Bu öğretici, Açık Yetkilendirme (OAuth) 2.0 istemci kimlik bilgileri verme akışını kullanarak Node.js daemon istemci uygulamanızı hazırlamayı ve ardından web API'sini çağırmak için erişim belirteci almak üzere yapılandırmayı gösteren serinin son bölümüdür. Bu serinin 1. bölümünde, Microsoft Entra yönetim merkezine bir web API'sini ve daemon uygulamasını kaydettiniz ve izinler verdiniz. Bu son adım, uygulamanıza yetkilendirme eklemeyi basitleştirmek amacıyla Node için Microsoft Kimlik Doğrulama Kitaplığı'nı (MSAL) kullanarak bir Node.js uygulaması oluşturmayı gösterir.
Bu öğreticide;
- Visual Studio Code'da bir Node.js uygulaması oluşturun ve bağımlılıkları yükleyin.
- Web API'sini çağırmak için erişim belirteci almak için Node.js uygulamasını etkinleştirin.
Önkoşullar
- Öğretici: Bir Node.js daemon uygulamasını yetkilendirmek için dış kiracınızı hazırlayın.
- Çalışan ve istekleri kabul etmeye hazır korumalı bir web API'si. Henüz oluşturmadıysanız korumalı web API'sini oluşturma öğreticisine bakın. Bu web API'sinin kiracı hazırlama öğreticisinde oluşturduğunuz uygulama kayıt ayrıntılarını kullandığından emin olun. Web API'nizin HTTPS aracılığıyla aşağıdaki uç noktaları kullanıma sunun:
GET /api/todolist
tüm yapılacakları almak için.POST /api/todolist
bir TODO eklemek için.
- Node.js.
- React uygulamalarını destekleyen tüm tümleşik geliştirme ortamları (IDE) kullanılabilse de, bu öğreticide Visual Studio Code kullanılmaktadır.
- Kiracı hazırlama öğreticisinde oluşturduğunuz Node.js daemon uygulaması ve web API'sinin kayıt ayrıntıları.
Node.js daemon projesini oluşturma
Node.js daemon uygulamanızı barındırmak için aşağıdaki gibi ciam-call-api-node-daemon
bir klasör oluşturun:
Terminalinizde dizini Node daemon uygulama klasörünüzle değiştirin( gibi
cd ciam-call-api-node-daemon
) ve komutunu çalıştırınnpm init -y
. Bu komut, Node.js projeniz için varsayılan package.json dosyasını oluşturur. Bu komut, Node.js projeniz için varsayılanpackage.json
bir dosya oluşturur.Aşağıdaki proje yapısını elde etmek için ek klasörler ve dosyalar oluşturun:
ciam-call-api-node-daemon/ ├── auth.js └── authConfig.js └── fetch.js └── index.js └── package.json
Uygulama bağımlılıklarını yükleme
Terminalinizde, aşağıdaki komutu çalıştırarak ve yargs
@azure/msal-node
paketlerini yükleyinaxios
:
npm install axios yargs @azure/msal-node
MSAL yapılandırma nesnesi oluşturma
Kod düzenleyicinizde authConfig.js dosyasını açın ve aşağıdaki kodu ekleyin:
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,
};
nesnesi, msalConfig
yetkilendirme akışınızın davranışını özelleştirmek için kullandığınız bir dizi yapılandırma seçeneği içerir.
authConfig.js dosyanızda şunu değiştirin:
Enter_the_Application_Id_Here
daha önce kaydettiğiniz istemci daemon uygulamasının Uygulama (istemci) kimliğiyle.Enter_the_Tenant_Subdomain_Here
ve bunu Dizin (kiracı) alt etki alanıyla değiştirin. Örneğin, kiracı birincil etki alanınız isecontoso.onmicrosoft.com
kullanıncontoso
. Kiracı adınız yoksa kiracınızın ayrıntılarını nasıl okuyacağınızı öğrenin.Enter_the_Client_Secret_Here
daha önce kopyaladığınız istemci daemon uygulama gizli anahtarı değeriyle.Enter_the_Web_Api_Application_Id_Here
daha önce kopyaladığınız web API'si uygulamasının Uygulama (istemci) kimliğiyle.
değişkenindeki özelliğinin scopes
protectedResources
daha önce kaydettiğiniz web API'sinin kaynak tanımlayıcısı (uygulama kimliği URI'si) olduğuna dikkat edin. Kapsam URI'sinin tamamına api://Enter_the_Web_Api_Application_Id_Here/.default
benzer.
Erişim belirteci alma
Kod düzenleyicinizde auth.js dosyasını açın ve aşağıdaki kodu ekleyin:
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,
};
Kodda:
tokenRequest
veapiConfig
nesnesini hazırlayın. ,tokenRequest
erişim belirteci istediğiniz kapsamı içerir. Kapsam gibiapi://Enter_the_Web_Api_Application_Id_Here/.default
görünür.apiConfig
nesnesi web API'nizin uç noktasını içerir. OAuth 2.0 istemci kimlik bilgileri akışı hakkında daha fazla bilgi edinin.Nesnesini ConfidentialClientApplication sınıfının oluşturucusna geçirerek
msalConfig
gizli bir istemci örneği oluşturursunuz.const cca = new msal.ConfidentialClientApplication(msalConfig);
Ardından erişim belirteci almak için acquireTokenByClientCredential işlevini kullanırsınız. Bu mantığı işlevinde
getToken
uygularsınız:cca.acquireTokenByClientCredential(tokenRequest);
Erişim belirteci aldıktan sonra BIR API çağırmaya devam edebilirsiniz.
API çağırma
Kod düzenleyicinizde fetch.js dosyasını açın ve aşağıdaki kodu ekleyin:
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
};
Bu kodda, erişim belirtecini istek Authorization
üst bilgisinde taşıyıcı belirteç olarak geçirerek web API'sine bir çağrı yaparsınız:
Authorization: `Bearer ${accessToken}`
Erişim belirteci alma bölümünde daha önce edindiğiniz erişim belirtecini kullanırsınız.
Web API'si isteği aldıktan sonra bunu değerlendirir ve bunun bir uygulama isteği olduğunu belirler. Erişim belirteci geçerliyse, web API'si istenen verileri döndürür. Aksi takdirde, API bir 401 Unauthorized
HTTP hatası döndürür.
Daemon uygulamanızı sonlandırın
Kod düzenleyicinizde index.js dosyasını açın ve aşağıdaki kodu ekleyin:
#!/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();
Bu kod, uygulamanızın giriş noktasıdır. Node.js uygulamaları için yargs JavaScript komut satırı bağımsız değişken ayrıştırma kitaplığını kullanarak etkileşimli olarak bir erişim belirteci getirir ve ardından API'yi çağırırsınız. Daha önce tanımladığınız ve callApi
işlevlerini kullanırsınızgetToken
:
const authResponse = await auth.getToken(auth.tokenRequest);
const todos = await fetch.callApi(auth.apiConfig.uri, authResponse.accessToken);
Daemon uygulamasını ve API'sini çalıştırma ve test edin
Bu noktada istemci daemon uygulamanızı ve web API'nizi test etmeye hazırsınız:
Web API'nizi başlatmak için ASP.NET web API'sinin güvenliğini sağlama öğreticisinde öğrendiğiniz adımları kullanın. Web API'niz artık istemci isteklerine hizmet etmeye hazırdır. web API'nizi authConfig.js dosyasında belirtildiği gibi bağlantı noktasında
44351
çalıştırmıyorsanız, authConfig.js dosyasını doğru web API'sinin bağlantı noktası numarasını kullanacak şekilde güncelleştirdiğinizden emin olun.Terminalinizde, gibi
ciam-call-api-node-daemon
daemon Node.js uygulamanızı içeren proje klasöründe olduğunuzdan emin olun ve aşağıdaki komutu çalıştırın:node . --op getToDos
Daemon uygulamanız ve web API'niz başarıyla çalıştırılırsa, konsol pencerenizde aşağıdaki JSON dizisine benzer şekilde web API uç noktası todos
değişkeni tarafından döndürülen verileri bulmanız gerekir:
{
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'
}
Sonraki adım
Node.js gizli uygulamanızda kimlik doğrulaması için gizli dizi yerine istemci sertifikası kullanın.