Získání tokenů v uzlu MSAL

Vzhledem k tomu, že MSAL Node podporuje různé typy udělení autorizačního kódu, jsou pro každý typ udělení a odpovídající požadavek k dispozici různá veřejná rozhraní API. Tento článek vás provede různými veřejnými rozhraními API dostupnými pro každý tok a odpovídajícím typem požadavku. Důrazně doporučujeme implementovat tok autorizačního kódu pro vaši aplikaci.

Tok autorizačního kódu

Veřejná rozhraní API

  • getAuthCodeUrl(): Toto API je prvním krokem authorization code grant pro MSAL Node. Požadavek je typu AuthorizationUrlRequest. Aplikace je odeslána adresa URL, kterou lze použít k vygenerování authorization code. Tuto adresu URL je možné otevřít v prohlížeči podle výběru, kde uživatel může zadat své přihlašovací údaje a přesměruje se zpět na redirectUri adresu (zaregistrovanou během registrace aplikace) pomocí .authorization code authorization code nyní můžete vyměnit za token pomocí následujícího kroku. Upozorňujeme, že pokud se pro veřejnou klientskou aplikaci používá tok autorizačního kódu, doporučuje se PKCE.

  • acquireTokenByCode(): Toto API je druhou fází authorization code grant pro MSAL Node. Zde vytvořený požadavek by měl být typu AuthorizationCodeRequest. Aplikace předá authorization code, kterou obdržela v rámci výše uvedeného kroku, a vyměňuje ji za token. Není to tak, že pokud se tok autorizačního kódu provádí pro veřejnou klientskou aplikaci, doporučuje se pkCE .


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

Tok kódu zařízení

Veřejná rozhraní API

  • acquireTokenByDeviceCode():Toto rozhraní API umožňuje aplikaci získat token s udělením kódu zařízení. Požadavek je typu DeviceCodeRequest. Toto API získá od autority token pomocí toku kódu zařízení OAuth 2.0. Tento tok je určený pro zařízení, která nemají přístup k prohlížeči nebo mají vstupní omezení. Autorizační server vydá objekt DeviceCode s ověřovacím kódem, kódem koncového uživatele a identifikátorem URI ověření koncového uživatele. Objekt DeviceCode je předán prostřednictvím callbacku a koncový uživatel by měl být vyzván, aby pomocí jiného zařízení přešel na ověřovací URI k zadání přihlašovacích údajů. Vzhledem k tomu, že klient nemůže přijímat příchozí požadavky, dotazuje se autorizační server opakovaně, dokud koncový uživatel nedokončí vstup přihlašovacích údajů.
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));
});

Obnovení toku tokenu

Veřejná rozhraní API

  • acquireTokenByRefreshToken: Toto rozhraní API získá token výměnou obnovovacího tokenu poskytnutého pro novou sadu tokenů. Požadavek je typu RefreshTokenRequest. refresh token se uživateli v odpovědi nikdy nevrací, ale lze k němu přistupovat z uživatelské mezipaměti. Doporučuje se používat acquireTokenSilent() pro neinteraktivní scénáře. Při použití acquireTokenSilent(), MSAL zpracuje ukládání do mezipaměti a aktualizace tokenů automaticky.
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));
});

Tichý tok

Veřejná rozhraní API

  • acquireTokenSilent: Toto rozhraní API získá token bezobslužně, v případě, že je mezipaměť poskytována uživatelem nebo když je mezipaměť vytvořena před tímto voláním s jakýmkoli jiným interaktivním tokem (např: tok autorizačního kódu). Požadavek je typu SilentFlowRequest. token se získá tiše, když uživatel určí účet, pro který je token vyžádán.
/**
 * 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);
});

Tok přihlašovacích údajů klienta

Veřejná rozhraní API

  • acquireTokenByClientCredential: Toto rozhraní API získá token pomocí přihlašovacích údajů důvěrné klientské aplikace k ověření (místo zosobnění uživatele) při volání jiné webové služby. V tomto scénáři je klient obvykle webovou službou střední vrstvy, službou démona nebo back-endovou webovou aplikací. Pro vyšší úroveň zajištění umožňuje platforma Microsoft Identity Platform také volající službě používat certifikát (místo sdíleného tajného klíče) jako přihlašovací údaje. Požadavek je typu ClientCredentialRequest.

Bezpečné používání tajných kódů

Tajné kódy by nikdy neměly být pevně zakódované. Balíček dotenv npm lze použít k ukládání tajných kódů do souboru .env (umístěného v kořenovém adresáři projektu), který by měl být součástí souboru .gitignore, aby se zabránilo náhodnému nahrání tajných kódů.

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

Za tok

  • acquireTokenOnBehalfOf: Toto rozhraní API implementuje metodu On Behalf Of Flow, která se používá při vyvolání služby nebo webového rozhraní API, které pak potřebuje volat jinou službu nebo webové rozhraní API, které používá jakýkoli jiný tok ověřování (kód zařízení, uživatelské jméno a heslo atd.). Přístupový token získá webové rozhraní API zpočátku (některý z toků webového rozhraní API) a webové rozhraní API pak může tento token vyměnit za jiný token prostřednictvím OBO. Požadavek je typu OnBehalfOfRequest.

Podívejte se na ukázku toku On Behalf Of, kde najdete pokyny k použití: