Aracılığıyla paylaş


Öğ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

Node.js daemon projesini oluşturma

Node.js daemon uygulamanızı barındırmak için aşağıdaki gibi ciam-call-api-node-daemonbir klasör oluşturun:

  1. Terminalinizde dizini Node daemon uygulama klasörünüzle değiştirin( gibi cd ciam-call-api-node-daemon) ve komutunu çalıştırın npm 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ılan package.json bir dosya oluşturur.

  2. 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 ise contoso.onmicrosoft.comkullanın contoso. 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/.defaultbenzer.

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 ve apiConfig nesnesini hazırlayın. , tokenRequest erişim belirteci istediğiniz kapsamı içerir. Kapsam gibi api://Enter_the_Web_Api_Application_Id_Here/.defaultgö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:

  1. 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.

  2. Terminalinizde, gibi ciam-call-api-node-daemondaemon 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.