Memperoleh token di MSAL Node

Karena MSAL Node mendukung berbagai pemberian kode otorisasi, ada dukungan untuk API publik yang berbeda per hibah dan permintaan yang sesuai. Artikel ini akan memandu Anda memahami berbagai API publik yang tersedia untuk setiap alur dan tipe permintaan yang sesuai. Sangat disarankan agar Anda menerapkan alur kode otorisasi untuk aplikasi Anda.

Alur Kode Otorisasi

API Publik

  • getAuthCodeUrl(): API ini adalah langkah pertama dari authorization code grant untuk MSAL Node. Permintaannya adalah jenis AuthorizationUrlRequest. Aplikasi dikirimi URL yang dapat digunakan untuk menghasilkan authorization code. URL ini dapat dibuka di browser pilihan, di mana pengguna dapat memasukkan kredensial mereka, dan akan dialihkan kembali ke redirectUri (terdaftar selama pendaftaran aplikasi) dengan authorization code. authorization code sekarang dapat ditukarkan dengan token melalui langkah berikut. Perhatikan bahwa jika alur kode otorisasi sedang dilakukan untuk aplikasi klien publik, PKCE disarankan.

  • acquireTokenByCode(): API ini adalah leg kedua dari authorization code grant untuk MSAL Node. Permintaan yang dibuat di sini harus berjenis AuthorizationCodeRequest. Aplikasi meneruskan authorization code yang diterima sebagai bagian dari langkah di atas dan menukarkannya dengan token. Bukan berarti jika alur kode otorisasi sedang dilakukan untuk aplikasi klien publik, PKCE disarankan.


    const authCodeUrlParameters = {
        scopes: ["sample_scope"],
        redirectUri: "your_redirect_uri",
    };

    // get url to sign user in and consent to scopes needed for application
    cca.getAuthCodeUrl(authCodeUrlParameters).then((response) => {
        console.log(response);
    }).catch((error) => console.log(JSON.stringify(error)));

    const tokenRequest = {
        code: "authorization_code",
        redirectUri: "your_redirect_uri",
        scopes: ["sample_scope"],
    };

    // acquire a token by exchanging the code
    cca.acquireTokenByCode(tokenRequest).then((response) => {
        console.log("\nResponse: \n:", response);
    }).catch((error) => {
        console.log(error);
    });

Alur Kode Perangkat

API Publik

  • acquireTokenByDeviceCode(): API ini memungkinkan aplikasi memperoleh token dengan pemberian Kode Perangkat. Permintaannya adalah jenis DeviceCodeRequest. API ini memperoleh sebuah token dari otoritas melalui alur kode perangkat OAuth 2.0. Alur ini dirancang untuk perangkat yang tidak memiliki akses ke browser atau memiliki batasan input. Server otorisasi mengeluarkan objek DeviceCode dengan kode verifikasi, kode pengguna akhir, dan URI verifikasi pengguna akhir. Objek DeviceCode disediakan melalui panggilan balik, dan pengguna akhir harus diinstruksikan untuk menggunakan perangkat lain untuk menavigasi ke URI verifikasi untuk memasukkan kredensial. Karena klien tidak dapat menerima permintaan masuk, klien melakukan polling pada server otorisasi berulang kali hingga pengguna akhir menyelesaikan input kredensial.
const msalConfig = {
    auth: {
        clientId: "your_client_id_here",
        authority: "your_authority_here",
    }
};

const pca = new msal.PublicClientApplication(msalConfig);

const deviceCodeRequest = {
    deviceCodeCallback: (response) => (console.log(response.message)),
    scopes: ["user.read"],
};

pca.acquireTokenByDeviceCode(deviceCodeRequest).then((response) => {
    console.log(JSON.stringify(response));
}).catch((error) => {
    console.log(JSON.stringify(error));
});

Alur Refresh Token

API Publik

  • acquireTokenByRefreshToken: API ini memperoleh token dengan bertukar token refresh yang disediakan untuk sekumpulan token baru. Permintaan berjenis RefreshTokenRequest. refresh token tidak pernah dikembalikan kepada pengguna sebagai respons, tetapi dapat diakses dari cache pengguna. Disarankan agar Anda menggunakan acquireTokenSilent() untuk skenario non-interaktif. Saat menggunakan acquireTokenSilent(), MSAL akan menangani penyimpanan cache dan penyegaran token secara otomatis.
const config = {
    auth: {
        clientId: "your_client_id_here",
        authority: "your_authority_here",
    }
};

const pca = new msal.PublicClientApplication(config);

const refreshTokenRequest = {
    refreshToken: "",
    scopes: ["user.read"],
};

pca.acquireTokenByRefreshToken(refreshTokenRequest).then((response) => {
    console.log(JSON.stringify(response));
}).catch((error) => {
    console.log(JSON.stringify(error));
});

Aliran Senyap

API Publik

  • acquireTokenSilent: API ini memperoleh token secara diam-diam, jika cache disediakan oleh pengguna, atau ketika cache dibuat dengan mendahului panggilan ini dengan alur interaktif lainnya (misalnya: alur kode otorisasi). Permintaannya adalah jenis SilentFlowRequest. token diperoleh tanpa interaksi saat pengguna menentukan akun tempat token diminta.
/**
 * Cache Plugin configuration
 */
const cachePath = "path_to_your_cache_file/msal_cache.json"; // Replace this string with the path to your valid cache file.

const readFromStorage = () => {
    return fs.readFile(cachePath, "utf-8");
};

const writeToStorage = (getMergedState) => {
    return readFromStorage().then(oldFile =>{
        const mergedState = getMergedState(oldFile);
        return fs.writeFile(cachePath, mergedState);
    })
};

const cachePlugin = {
    readFromStorage,
    writeToStorage
};

/**
 * Public Client Application Configuration
 */
const publicClientConfig = {
    auth: {
        clientId: "your_client_id_here",
        authority: "your_authority_here",
        redirectUri: "your_redirectUri_here",
    },
    cache: {
        cachePlugin
    },
};

/** Request Configuration */

const scopes = ["your_scopes"];

const authCodeUrlParameters = {
    scopes: scopes,
    redirectUri: "your_redirectUri_here",
};

const pca = new msal.PublicClientApplication(publicClientConfig);
const msalCacheManager = pca.getCacheManager();
let accounts;

pca.getAuthCodeUrl(authCodeUrlParameters)
    .then((response) => {
        console.log(response);
    }).catch((error) => console.log(JSON.stringify(error)));

const tokenRequest = {
    code: req.query.code,
    redirectUri: "http://localhost:3000/redirect",
    scopes: scopes,
};

pca.acquireTokenByCode(tokenRequest).then((response) => {
    console.log("\nResponse: \n:", response);
    return msalCacheManager.writeToPersistence();
}).catch((error) => {
    console.log(error);
});

// get Accounts
accounts = msalCacheManager.getAllAccounts();

// Build silent request
const silentRequest = {
    account: accounts[0], // You would filter accounts to get the account you want to get tokens for
    scopes: scopes,
};

// Acquire Token Silently to be used in MS Graph call
pca.acquireTokenSilent(silentRequest).then((response) => {
    console.log("\nSuccessful silent token acquisition:\nResponse: \n:", response);
    return msalCacheManager.writeToPersistence();
}).catch((error) => {
        console.log(error);
});

Alur Kredensial Klien

API Publik

  • acquireTokenByClientCredential: API ini memperoleh token menggunakan kredensial aplikasi klien rahasia untuk mengautentikasi (alih-alih meniru pengguna) saat memanggil layanan web lain. Dalam skenario ini, klien biasanya adalah layanan web tingkat menengah, layanan daemon, atau aplikasi web back-end. Untuk tingkat jaminan yang lebih tinggi, platform identitas Microsoft juga memungkinkan layanan yang melakukan panggilan untuk menggunakan sertifikat (bukan rahasia bersama) sebagai kredensial. Permintaan ini bertipe ClientCredentialRequest.

Menggunakan rahasia dengan aman

Rahasia tidak boleh dikodekan secara permanen. Paket npm dotenv dapat digunakan untuk menyimpan rahasia dalam file .env (terletak di direktori akar proyek) yang harus disertakan dalam .gitignore untuk mencegah unggahan rahasia yang tidak disengaja.

import "dotenv/config"; // process.env now has the values defined in a .env file

const config = {
    auth: {
        clientId: "your_client_id_here",
        authority: "your_authority_here",
        clientSecret: process.env.clientSecret
    }
};

// Create msal application object
const cca = new msal.ConfidentialClientApplication(config);

// With client credentials flows permissions need to be granted in the portal by a tenant administrator.
// The scope is always in the format "<resource>/.default"
const clientCredentialRequest = {
    scopes: ["https://graph.microsoft.com/.default"], // replace with your resource
};

cca.acquireTokenByClientCredential(clientCredentialRequest).then((response) => {
    console.log("Response: ", response);
}).catch((error) => {
    console.log(JSON.stringify(error));
});

Atas Nama Flow

  • acquireTokenOnBehalfOf: API ini mengimplementasikan On Behalf Of Flow, yang digunakan saat aplikasi memanggil API layanan/web, yang pada gilirannya perlu memanggil API layanan/web lain yang menggunakan alur autentikasi lain (kode perangkat, nama pengguna/kata sandi, dll). Token akses diperoleh oleh API web awalnya (oleh salah satu alur API web), dan API web kemudian dapat menukar token ini dengan token lain melalui OBO. Permintaan ini bertipe OnBehalfOfRequest

Silakan lihat alur contoh On Behalf Of untuk petunjuk penggunaan: