MSAL Node’da belirteç alma

MSAL Node çeşitli yetkilendirme kodu hibelerini desteklediğinden, her bir hibe ve buna karşılık gelen istek için farklı genel API'ler desteklenir. Bu makale, her akış için kullanılabilen farklı genel API'ler ve ilgili istek türü hakkında size yol gösterir. Uygulamanız için yetkilendirme kodu akışını uygulamanız kesinlikle önerilir.

Yetkilendirme Kodu Akışı

Genel API'ler

  • getAuthCodeUrl(): Bu API, MSAL Node için authorization code grant ilk adımıdır. İstek AuthorizationUrlRequest türündedir. Uygulamaya, bir authorization code oluşturmak için kullanılabilecek bir URL gönderilir. Bu URL, kullanıcının kimlik bilgilerini girebileceği seçtiği bir tarayıcıda açılabilir ve ardından, bir authorization code ile, uygulama kaydı sırasında kaydedilen redirectUri öğesine geri yönlendirilir. authorization code, artık aşağıdaki adımla token karşılığında kullanılabilir. Ortak istemci uygulaması için yetkilendirme kodu akışı kullanılıyorsa, PKCE'nin önerildiğini unutmayın.

  • acquireTokenByCode(): Bu API, MSAL Node için authorization code grant ikinci adımıdır. Burada yapılan istek AuthorizationCodeRequest türünde olmalıdır. Uygulama, yukarıdaki adımın bir parçası olarak alınan authorization code öğesini iletti ve bunun karşılığında bir token aldı. Ortak istemci uygulaması için yetkilendirme kodu akışı kullanılıyorsa, PKCE önerildiğini unutmayın.


    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);
    });

Cihaz Kodu Akışı

Genel API'ler

  • acquireTokenByDeviceCode(): Bu API, uygulamanın Cihaz Kodu izniyle belirteç almasını sağlar. İstek , DeviceCodeRequest türündedir. Bu API, OAuth 2.0 cihaz kodu akışını kullanarak yetkilendirme sunucusundan bir token edinir. Bu akış, tarayıcı erişimi olmayan veya giriş kısıtlamaları olan cihazlar için tasarlanmıştır. Yetkilendirme sunucusu doğrulama kodu, son kullanıcı kodu ve son kullanıcı doğrulama URI'siyle bir DeviceCode nesnesi gönderir. DeviceCode nesnesi bir geri çağırma yoluyla sağlanır ve son kullanıcıya kimlik bilgilerini giriş için doğrulama URI'sine gitmek için başka bir cihaz kullanması talimatı verilmelidir. İstemci gelen istekleri alamadığından, son kullanıcı kimlik bilgilerinin girişini tamamlayana kadar yetkilendirme sunucusunu tekrar tekrar yoklar.
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));
});

Belirteç Akışını Yenile

Genel API'ler

  • acquireTokenByRefreshToken: Bu API, yeni bir belirteç kümesi için sağlanan yenileme belirtecini değiştirerek bir belirteç alır. İstek RefreshTokenRequest türündedir. refresh token bir yanıtta kullanıcıya hiçbir zaman döndürülemez, ancak kullanıcı önbelleğinden erişilebilir. Etkileşimli olmayan senaryolar için kullanmanız acquireTokenSilent() önerilir. acquireTokenSilent() kullanılırken, MSAL belirteçlerin önbelleğe alınmasını ve yenilenmesini otomatik olarak işler.
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));
});

Sessiz Akış

Genel API'ler

  • acquireTokenSilent: Bu API, önbellek kullanıcı tarafından sağlanırsa veya bu çağrıdan önce başka bir etkileşimli akışla (örneğin, yetkilendirme kodu akışı) önbellek oluşturulduğunda sessizce bir belirteç alır. İstek , SilentFlowRequest türündedir. token, kullanıcı belirtecin istendiği hesabı belirttiğinde sessizce edinilir.
/**
 * 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);
});

İstemci Kimlik Bilgileri Akışı

Genel API'ler

  • acquireTokenByClientCredential: Bu API, başka bir web hizmetini çağırırken kimlik doğrulaması yapmak için gizli istemci uygulamasının kimlik bilgilerini kullanarak bir belirteç alır (kullanıcının kimliğine bürünmek yerine). Bu senaryoda istemci genellikle bir orta katman web hizmeti, bir daemon hizmeti veya arka uç web uygulamasıdır. Daha yüksek bir güvence düzeyi için Microsoft kimlik platformu, çağrı hizmetinin kimlik bilgisi olarak bir sertifika (paylaşılan gizli dizi yerine) kullanmasına da izin verir. İstek ClientCredentialRequest türündedir.

Gizli anahtarları güvenli kullanma

Gizli bilgiler asla doğrudan koda gömülmemelidir. Dotenv npm paketi, gizli dizilerin yanlışlıkla karşıya yüklenmesini önlemek için .gitignore dosyasına eklenmesi gereken bir .env dosyasında (projenin kök dizininde bulunur) gizli dizileri depolamak için kullanılabilir.

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));
});

Flow adına

  • acquireTokenOnBehalfOf: Bu API, bir uygulama bir hizmet/web API'sini çağırdığında ve bu hizmet/web API de ardından başka bir kimlik doğrulama akışı (cihaz kodu, kullanıcı adı/parola vb.) kullanan başka bir hizmet/web API'sini çağırmak zorunda olduğunda kullanılan On-Behalf-Of akışını uygular. Erişim belirteci başlangıçta web API'si tarafından alınır (web API akışlarından herhangi biri tarafından) ve web API'si bu belirteci OBO aracılığıyla başka bir belirteçle değiştirebilir. İstek OnBehalfOfRequest türündedir

Kullanım yönergeleri için lütfen On Behalf Of akış örneğine bakın: