Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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 grantpro 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 naredirectUriadresu (zaregistrovanou během registrace aplikace) pomocí .authorization codeauthorization codenyní můžete vyměnit zatokenpomocí 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 grantpro 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 zatoken. 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
tokenpomocí 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 tokense uživateli v odpovědi nikdy nevrací, ale lze k němu přistupovat z uživatelské mezipaměti. Doporučuje se používatacquireTokenSilent()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.
tokense 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í:
- Ukázkový kód WebAPI
- Ukázkový kód webové aplikace