Microsoft identity platform a tok autorizačního kódu OAuth 2.0

Udělení autorizačního kódu OAuth 2.0 je možné použít v aplikacích nainstalovaných na zařízení k získání přístupu k chráněným prostředkům, jako jsou webová rozhraní API. Pomocí Microsoft identity platform OAuth 2.0 a Open ID Připojení (OIDC) můžete do mobilních a desktopových aplikací přidat přihlášení a přístup přes rozhraní API.

Tento článek popisuje, jak programovat přímo pomocí protokolu v aplikaci pomocí libovolného jazyka. Pokud je to možné, doporučujeme k získání tokenů a volání zabezpečených webových rozhraní API použít podporované knihovny msal (Microsoft Authentication Libraries). Podívejte se také na ukázkové aplikace, které používají MSAL.

Tok autorizačního kódu OAuth 2.0 je popsaný v části 4.1 specifikace OAuth 2.0. S OIDC se používá k ověřování a autorizaci ve většině typů aplikací, včetně jedno stránek, webových aplikací a nativně nainstalovaných aplikací. Tok umožňuje aplikacím bezpečně získat access_tokens, které je možné použít pro přístup k prostředkům zabezpečeným službou Microsoft identity platform, a také aktualizovat tokeny pro získání dalších tokenů access_tokens a tokenů ID pro přihlášeného uživatele.

Tip

Zkuste tento požadavek v postmanu spuštěný.
Zkuste tento požadavek a další informace odeslat v Postmanu – nezapomeňte nahradit tokeny a ID.

Diagram protokolu

Na vysoké úrovni celý tok ověřování pro aplikaci vypadá trochu takhle:

Ověřovací kód OAuth Flow

Nastavení identifikátoru URI přesměrování vyžadované pro jedno stránkované aplikace

Tok autorizačního kódu pro jedno stránkovací aplikace vyžaduje další nastavení. Pokud chcete správně označit identifikátor URI přesměrování jako povolený pro CORS, postupujte podle pokynů pro vytvoření jedno stránkové aplikace. Pokud chcete aktualizovat existující identifikátor URI přesměrování pro povolení CORS, otevřete editor manifestu a v části nastavte pole pro identifikátor URI přesměrování type spa na replyUrlsWithType . Můžete také kliknout na identifikátor URI přesměrování v části Web na kartě Ověřování a vybrat identifikátory URI, na které chcete migrovat pomocí toku autorizačního kódu.

Typ spa přesměrování je zpětně kompatibilní s implicitním tokem. Aplikace, které k získání tokenů aktuálně používají implicitní tok, mohou přejít na typ identifikátoru URI přesměrování bez problémů a spa pokračovat v používání implicitního toku.

Pokud se pokusíte použít tok autorizačního kódu a zobrazí se tato chyba:

access to XMLHttpRequest at 'https://login.microsoftonline.com/common/v2.0/oauth2/token' from origin 'yourApp.com' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

Pak přejděte do registrace aplikace a aktualizujte identifikátor URI přesměrování, aby aplikace napište spa .

Aplikace nemohou identifikátor URI pro přesměrování používat s toky mimo spa, například nativní aplikace spa nebo toky přihlašovacích údajů klienta. V zájmu zajištění zabezpečení a osvědčených postupů vrátí platforma Microsoft Identity platform chybu, pokud se pokusíte použít identifikátor spa URI přesměrování bez Origin hlavičky. Podobně microsoft Identity Platform také brání použití přihlašovacích údajů klienta (v toku OBO, toku přihlašovacích údajů klienta a toku ověřovacího kódu) v přítomnosti hlavičky, aby se zajistilo, že se tajné kódy v prohlížeči nebudou Origin používat.

Žádost o autorizační kód

Tok autorizačního kódu začíná tím, že klient nasměruje uživatele do koncového /authorize bodu. V tomto požadavku si klient vyžádá od uživatele openid offline_access oprávnění , a https://graph.microsoft.com/mail.read . Některá oprávnění jsou omezená správcem, například zápis dat do adresáře organizace pomocí Directory.ReadWrite.All . Pokud vaše aplikace požádá o přístup k jednomu z těchto oprávnění od uživatele organizace, uživateli se zobrazí chybová zpráva s oznámením, že nemá oprávnění udělit souhlas s oprávněními vaší aplikace. Pokud chcete požádat o přístup k oborům omezeným na správce, měli byste si je vyžádat přímo od globálního správce. Další informace najdete v informacích o oprávněních omezených správcem.

// Line breaks for legibility only

https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize?
client_id=6731de76-14a6-49ae-97bc-6eba6914391e
&response_type=code
&redirect_uri=http%3A%2F%2Flocalhost%2Fmyapp%2F
&response_mode=query
&scope=https%3A%2F%2Fgraph.microsoft.com%2Fmail.read%20api%3A%2F%2F
&state=12345
&code_challenge=YTFjNjI1OWYzMzA3MTI4ZDY2Njg5M2RkNmVjNDE5YmEyZGRhOGYyM2IzNjdmZWFhMTQ1ODg3NDcxY2Nl
&code_challenge_method=S256

Tip

Kliknutím na následující odkaz tento požadavek proveďte! Po přihlášení by měl být prohlížeč přesměrován na adresu s v http://localhost/myapp/ code adresního řádku. https://login.microsoftonline.com/common/oauth2/v2.0/authorize...

Parametr Povinné/volitelné Description
tenant vyžadováno Hodnotu v cestě požadavku můžete použít k řízení toho, kdo {tenant} se může přihlásit k aplikaci. Povolené hodnoty jsou common organizations , , a consumers identifikátory tenanta. Další podrobnosti najdete v tématu Základy protokolů. V případě scénářů hosta, kdy podepíšete uživatele z jednoho tenanta do jiného tenanta, je důležité zadat identifikátor tenanta, abyste ho správně zaregistrovali do tenanta prostředků.
client_id vyžadováno ID aplikace (klienta), které Azure Portal – Registrace aplikací prostředí přiřazené k vaší aplikaci.
response_type vyžadováno Musí obsahovat code pro tok autorizačního kódu. Může také id_token zahrnovat nebo token , pokud používáte hybridní tok.
redirect_uri vyžadováno Název redirect_uri, kam může aplikace odeslat a získat ověřovací odpovědi. Musí přesně odpovídat jedné z možností redirect_uris jste zaregistrovali na portálu, s tím rozdílem, že musí být zakódovaná pomocí adresy URL. U nativních & mobilních aplikací byste měli použít jednu z doporučených hodnot (pro aplikace používající vložené prohlížeče) nebo (pro aplikace, které používají https://login.microsoftonline.com/common/oauth2/nativeclient http://localhost systémové prohlížeče).
scope vyžadováno Seznam oborů oddělených mezerami, se kterou má uživatel souhlasit. V první části požadavku to může pokrývat více prostředků, což vaší aplikaci umožní získat souhlas s více webovými rozhraními API, /authorize která chcete volat.
response_mode Doporučené Určuje metodu, která se má použít k odeslání výsledného tokenu zpět do vaší aplikace. Může to být jedna z následujících možností:

- query
- fragment
- form_post

query poskytuje kód jako parametr řetězce dotazu pro váš identifikátor URI přesměrování. Pokud požadujete token ID pomocí implicitního toku, nemůžete použít , jak je uvedeno ve query specifikací OpenID. Pokud požadujete jenom kód, můžete použít query , fragment nebo form_post . form_post spustí metodu POST obsahující kód na váš identifikátor URI přesměrování.
state Doporučené Hodnota zahrnutá v požadavku, která bude vrácena také v odpovědi tokenu. Může to být řetězec libovolného obsahu, který chcete. Náhodně vygenerovaná jedinečná hodnota se obvykle používá k tomu, aby se zabránilo útokům na padělání požadavků napříč weby. Hodnota může také kódovat informace o stavu uživatele v aplikaci před tím, než došlo k žádosti o ověření, jako je například stránka nebo zobrazení, na které byl uživatel.
prompt optional Určuje typ interakce uživatele, který je vyžadován. Jediné platné hodnoty jsou v tuto chvíli login , none , a consent select_account .

- prompt=login vynutí zadání přihlašovacích údajů uživatele k této žádosti a negace jednotného přihlašování.
- prompt=none je naopak – zajistí, že se uživateli vůbec nebude prezentovat žádná interaktivní výzva. Pokud požadavek nelze dokončit bezobslužně prostřednictvím jednotného přihlašování, Microsoft identity platform vrátí interaction_required chybu.
- prompt=consent po přihlášení uživatele aktivuje dialogové okno souhlasu OAuth s žádostí uživatele o udělení oprávnění k aplikaci.
- prompt=select_account přeruší jednotné přihlašování a poskytne prostředí pro výběr účtu se seznamem všech účtů buď v relaci, nebo v zapamatování účtu, nebo možnost volby použití úplně jiného účtu.
login_hint Volitelné Tento parametr můžete použít k předběžnému vyplnění pole uživatelského jména a e-mailové adresy přihlašovací stránky uživatele, pokud uživatelské jméno znáte předem. Aplikace tento parametr často používají při opětovném ověření po extrakci volitelné deklarace login_hint identity z dřívějšího přihlášení.
domain_hint optional Pokud je zahrnutý, přeskočí proces zjišťování na základě e-mailu, který uživatel prochází na přihlašovací stránce, což vede k trochu jednoduššímu uživatelskému prostředí – například k jejich odeslání do svého federovaného zprostředkovatele identity. Aplikace tento parametr často používají při opětovném ověření extrahováním z tid předchozího přihlášení.
code_challenge doporučeno / povinné Slouží k zabezpečení autorizačních kódů prostřednictvím ověřovacího klíče pro Exchange (PKCE). Vyžaduje se, code_challenge_method pokud je zahrnutý. Další informace najdete v dokumentu PKCE RFC. To se teď doporučuje pro všechny typy aplikací – veřejné i důvěrné klienty – a vyžaduje je Microsoft identity platform pro jedno stránkovací aplikace pomocí toku autorizačního kódu.
code_challenge_method doporučeno / povinné Metoda použitá ke kódování code_verifier pro code_challenge parametr . Mělo by to být , ale specifikace umožňuje použití , pokud z nějakého důvodu klient S256 nepodporuje plain SHA256.

Pokud je vyloučeno, code_challenge předpokládá se, že je zahrnut jako prostý code_challenge text. Rozhraní Microsoft identity platform podporuje plain i S256 . Další informace najdete v dokumentu PKCE RFC. To se vyžaduje pro jedno stránkovací aplikace pomocí toku autorizačního kódu.

V tomto okamžiku se uživateli zobrazí dotaz, jestli má zadat svoje přihlašovací údaje a dokončit ověření. Následující Microsoft identity platform také zajistí, že uživatel souhlasí s oprávněními uvedená v scope parametru dotazu. Pokud uživatel s žádným z těchto oprávnění nevysoudí souhlas, požádá ho o souhlas s požadovanými oprávněními. Podrobnosti o oprávněních, souhlasu a aplikacích s více tenanty najdete tady.

Jakmile se uživatel ověří a udělí souhlas, Microsoft identity platform vrátí vaší aplikaci odpověď na vyznačené adrese pomocí metody zadané redirect_uri v response_mode parametru .

Úspěšná odpověď

Úspěšná odpověď s response_mode=query použitím příkazu vypadá asi takhle:

GET http://localhost?
code=AwABAAAAvPM1KaPlrEqdFSBzjqfTGBCmLdgfSTLEMPGYuNHSUYBrq...
&state=12345
Parametr Popis
code Název authorization_code, o který aplikace požádala. Aplikace může autorizační kód použít k vyžádání přístupového tokenu pro cílový prostředek. Authorization_codes krátkodobé, jejich platnost obvykle vyprší přibližně po 10 minutách.
state Pokud je v požadavku zahrnut parametr stavu, měla by se v odpovědi objevit stejná hodnota. Aplikace by měla ověřit, že hodnoty stavu v požadavku a odpovědi jsou identické.

Token ID můžete získat také v případě, že si ho vyžádáte a při registraci aplikace máte implicitní udělení povolené. To se někdy označuje jako "hybridní tok"a používá se v architekturách, jako je ASP.NET.

Chybová odpověď

Chybové odpovědi je také možné odeslat do redirect_uri , aby je aplikace dokáže odpovídajícím způsobem zpracovat:

GET http://localhost?
error=access_denied
&error_description=the+user+canceled+the+authentication
Parametr Popis
error Řetězec kódu chyby, který lze použít ke klasifikaci typů chyb, ke kterým dochází, a lze ho použít k reakci na chyby.
error_description Konkrétní chybová zpráva, která může vývojáři pomoct identifikovat hlavní příčinu chyby ověřování.

Kódy chyb pro chyby koncového bodu autorizace

Následující tabulka popisuje různé kódy chyb, které lze vrátit v error parametru chybové odpovědi.

Kód chyby Description Akce klienta
invalid_request Chyba protokolu, například chybějící požadovaný parametr. Opravte a znovu odešlete požadavek. Jedná se o chybu vývoje, která se obvykle zachytila během počátečního testování.
unauthorized_client Klientská aplikace nemá oprávnění žádat o autorizační kód. K této chybě obvykle dochází v případě, že klientská aplikace není zaregistrovaná v Azure AD nebo není přidaná do tenanta Azure AD uživatele. Aplikace může uživatele vyzvat k instalaci aplikace a k jeho přidání do Azure AD.
access_denied Vlastník prostředku odmítl souhlas Klientská aplikace může uživatele upozornit, že nemůže pokračovat, dokud uživatel nevysoudí souhlas.
unsupported_response_type Autorizační server v požadavku nepodporuje typ odpovědi. Opravte a znovu odešlete požadavek. Jedná se o chybu vývoje, která se obvykle zachytila během počátečního testování. Když se zobrazí v hybridním toku, signalizuje, že je nutné povolit nastavení implicitního udělení tokenu ID pro registraci klientské aplikace.
server_error Na serveru došlo k neočekávané chybě. Zkuste požadavek zopakovat. Tyto chyby mohou být důsledkem dočasných podmínek. Klientská aplikace může uživateli vysvětlit, že jeho odpověď je zpožděna na dočasnou chybu.
temporarily_unavailable Server je dočasně příliš zaneprázdněný na zpracování požadavku. Zkuste požadavek zopakovat. Klientská aplikace může uživateli vysvětlit, že jeho odpověď je zpožděná kvůli dočasné podměně.
invalid_resource Cílový prostředek je neplatný, protože neexistuje, Azure AD ho nemůže najít nebo není správně nakonfigurovaný. Tato chyba značí, že prostředek, pokud existuje, není v tenantovi nakonfigurovaný. Aplikace může uživatele vyzvat k instalaci aplikace a k jeho přidání do Azure AD.
login_required Zjistilo se příliš mnoho nebo žádných uživatelů Klient požadoval bezobslužné ověřování ( prompt=none ), ale jeden uživatel nebyl nalezen. To může znamenat, že v relaci je aktivních více uživatelů nebo žádní uživatelé. To bere v úvahu zvoleného tenanta (například pokud jsou aktivní dva účty Azure AD a jeden účet Microsoft a je zvolen, bude bezobslužné consumers ověřování fungovat).
interaction_required Požadavek vyžaduje interakci uživatele. Vyžaduje se další krok ověřování nebo souhlas. Zkuste požadavek zopakovat bez prompt=none .

Vyžádání tokenu ID (hybridní tok)

Pokud chcete zjistit, kdo je uživatel před uplatněním autorizačního kódu, je běžné, že aplikace při žádosti o autorizační kód také žádají o token ID. To se nazývá hybridní tok, protože směšuje implicitní udělení s tokem autorizačního kódu. Hybridní tok se běžně používá ve webových aplikacích, které chtějí uživateli vykreslit stránku bez blokování při uplatnění kódu, zejména ASP.NET. Jedno stránkové aplikace i tradiční webové aplikace těží z nižší latence v tomto modelu.

Hybridní tok je stejný jako tok autorizačního kódu popsaný výše, ale se třemi doplňky, které jsou potřeba k vyžádání tokenu ID: nové obory, nový response_type a nový parametr nonce dotazu.

// Line breaks for legibility only

https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize?
client_id=6731de76-14a6-49ae-97bc-6eba6914391e
&response_type=code%20id_token
&redirect_uri=http%3A%2F%2Flocalhost%2Fmyapp%2F
&response_mode=fragment
&scope=openid%20offline_access%20https%3A%2F%2Fgraph.microsoft.com%2Fuser.read
&state=12345
&nonce=abcde
&code_challenge=YTFjNjI1OWYzMzA3MTI4ZDY2Njg5M2RkNmVjNDE5YmEyZGRhOGYyM2IzNjdmZWFhMTQ1ODg3NDcxY2Nl
&code_challenge_method=S256
Aktualizovaný parametr Povinné/volitelné Popis
response_type Povinné Přidání id_token parametru na server indikuje, že aplikace v odpovědi z koncového bodu by chtěla token /authorize ID.
scope Vyžadováno Pro tokeny ID je nutné aktualizovat, aby zahrnovaly rozsahy tokenů ID – a openid volitelně profile i email .
nonce Vyžadováno Hodnota zahrnutá v požadavku vygenerovaná aplikací, která bude zahrnutá ve výsledném id_token jako deklarace identity. Aplikace pak může tuto hodnotu ověřit, aby se zmírněly útoky při opětovném přehrání tokenu. Hodnota je obvykle náhodný jedinečný řetězec, který lze použít k identifikaci původu požadavku.
response_mode Doporučeno Určuje metodu, která se má použít k odeslání výsledného tokenu zpět do vaší aplikace. Výchozí hodnota query je pouze pro autorizační kód, ale pokud fragment požadavek obsahuje id_token response_type . Aplikace se ale doporučuje používat form_post , zejména při použití jako http://localhost identifikátoru URI přesměrování.

Použití jako režimu odpovědi způsobí problémy webovým aplikacím, které čtou kód z přesměrování, protože prohlížeče fragment webovému serveru fragment předá. V takových situacích by aplikace měly používat režim odpovědi, aby se zajistilo, že se všechna data budou form_post na server odesílat.

Úspěšná odpověď

Úspěšná odpověď s response_mode=fragment použitím příkazu vypadá asi takhle:

GET https://login.microsoftonline.com/common/oauth2/nativeclient#
code=AwABAAAAvPM1KaPlrEqdFSBzjqfTGBCmLdgfSTLEMPGYuNHSUYBrq...
&id_token=eYj...
&state=12345
Parametr Popis
code Autorizační kód, který aplikace požaduje. Aplikace může autorizační kód použít k vyžádání přístupového tokenu pro cílový prostředek. Autorizační kódy jsou krátkodobé a jejich platnost obvykle vyprší přibližně po 10 minutách.
id_token Token ID pro uživatele vystavený prostřednictvím implicitního udělení. Obsahuje speciální c_hash deklaraci identity, která je hodnotou hash code ve stejném požadavku.
state Pokud je v požadavku zahrnut parametr stavu, měla by se v odpovědi objevit stejná hodnota. Aplikace by měla ověřit, že hodnoty stavu v požadavku a odpovědi jsou identické.

Uplatnění kódu pro přístupový token

Všichni důvěrní klienti mají možnost používat tajné kódy klienta (symetrické sdílené tajné kódy generované službou Microsoft identity platform) a přihlašovací údaje certifikátu (asymetrické klíče nahrané vývojářem). Pro zajištění nejlepšího zabezpečení doporučujeme použít přihlašovací údaje certifikátu. Veřejní klienti (nativní aplikace a jedno stránkovací aplikace) nesmí při uplatnění autorizačního kódu používat tajné kódy ani certifikáty – vždy se ujistěte, že identifikátory URI přesměrování správně označují typ aplikace a jsou jedinečné.

Vyžádání přístupového tokenu pomocí client_secret

Teď, když jste získali authorization_code a uživateli jste udělili oprávnění, můžete uplatnit na požadovaný code access_token prostředek. To proveďte odesláním POST požadavku do koncového /token bodu:

// Line breaks for legibility only

POST /{tenant}/oauth2/v2.0/token HTTP/1.1
Host: https://login.microsoftonline.com
Content-Type: application/x-www-form-urlencoded

client_id=6731de76-14a6-49ae-97bc-6eba6914391e
&scope=https%3A%2F%2Fgraph.microsoft.com%2Fmail.read
&code=OAAABAAAAiL9Kn2Z27UubvWFPbm0gLWQJVzCTE9UkP3pSx1aXxUjq3n8b2JRLk4OxVXr...
&redirect_uri=http%3A%2F%2Flocalhost%2Fmyapp%2F
&grant_type=authorization_code
&code_verifier=ThisIsntRandomButItNeedsToBe43CharactersLong 
&client_secret=JqQX2PNo9bpM0uEihUPzyrh    // NOTE: Only required for web apps. This secret needs to be URL-Encoded.
Parametr Povinné/volitelné Description
tenant vyžadováno Hodnotu v cestě požadavku můžete použít k řízení toho, kdo {tenant} se může přihlásit k aplikaci. Povolené hodnoty jsou common organizations , , a consumers identifikátory tenanta. Další podrobnosti najdete v tématu Základy protokolů.
client_id vyžadováno ID aplikace (klienta), které Azure Portal – Registrace aplikací přiřazené vaší aplikaci.
scope optional Seznam oborů oddělených mezerami. Všechny obory musí pocovat z jednoho prostředku spolu s obory OIDC ( profile openid , , email ). Podrobnější vysvětlení oborů najdete v tématu oprávnění, souhlas a obory. Jedná se o rozšíření toku autorizačního kódu od Microsoftu, které má aplikacím umožnit deklarovat prostředek, pro který chtějí token během uplatnění tokenu.
code vyžadováno Název authorization_code, který jste získali v první části toku.
redirect_uri vyžadováno Stejná redirect_uri, která se použila k získání authorization_code.
grant_type vyžadováno Musí být authorization_code pro tok autorizačního kódu.
code_verifier Doporučené Stejný code_verifier, který byl použit k získání authorization_code. Vyžaduje se, pokud se v žádosti o udělení autorizačního kódu použila PKCE. Další informace najdete v dokumentu PKCE RFC.
client_secret vyžadované pro důvěrné webové aplikace Tajný kód aplikace, který jste vytvořili na portálu pro registraci aplikace pro vaši aplikaci. Tajný kód aplikace byste neměli používat v nativní nebo jedno stránkovací aplikaci, protože client_secrets nelze spolehlivě ukládat na zařízeních nebo webových stránkách. Vyžaduje se pro webové aplikace a webová rozhraní API, která mají možnost bezpečně ukládat client_secret na straně serveru. Stejně jako všechny zde popsané parametry musí být tajný kód klienta před odesláním zakódovaný do adresy URL, a to krok, který obvykle provádí sada SDK. Další informace o kódování URI najdete ve specifikaci obecné syntaxe URI. Podporuje se také vzorec základního ověřování místo zadání přihlašovacích údajů v autorizační hlavičce podle RFC 6749.

Vyžádání přístupového tokenu pomocí přihlašovacích údajů certifikátu

POST /{tenant}/oauth2/v2.0/token HTTP/1.1               // Line breaks for clarity
Host: login.microsoftonline.com
Content-Type: application/x-www-form-urlencoded

client_id=6731de76-14a6-49ae-97bc-6eba6914391e
&scope=https%3A%2F%2Fgraph.microsoft.com%2Fmail.read
&code=OAAABAAAAiL9Kn2Z27UubvWFPbm0gLWQJVzCTE9UkP3pSx1aXxUjq3n8b2JRLk4OxVXr...
&redirect_uri=http%3A%2F%2Flocalhost%2Fmyapp%2F
&grant_type=authorization_code
&code_verifier=ThisIsntRandomButItNeedsToBe43CharactersLong
&client_assertion_type=urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer
&client_assertion=eyJhbGciOiJSUzI1NiIsIng1dCI6Imd4OHRHeXN5amNScUtqRlBuZDdSRnd2d1pJMCJ9.eyJ{a lot of characters here}M8U3bSUKKJDEg
Parametr Povinné/volitelné Description
tenant vyžadováno Hodnotu v cestě požadavku můžete použít k řízení toho, kdo {tenant} se může přihlásit k aplikaci. Povolené hodnoty jsou common organizations , , a consumers identifikátory tenanta. Další podrobnosti najdete v tématu Základy protokolů.
client_id vyžadováno ID aplikace (klienta), které Azure Portal – Registrace aplikací přiřazené vaší aplikaci.
scope optional Seznam oborů oddělených mezerami. Všechny obory musí pocovat z jednoho prostředku spolu s obory OIDC ( profile openid , , email ). Podrobnější vysvětlení oborů najdete v tématu oprávnění, souhlas a obory. Jedná se o rozšíření toku autorizačního kódu od Microsoftu, které má aplikacím umožnit deklarovat prostředek, pro který chtějí token během uplatnění tokenu.
code vyžadováno Název authorization_code, který jste získali v první části toku.
redirect_uri vyžadováno Stejná redirect_uri, která se použila k získání authorization_code.
grant_type vyžadováno Musí být authorization_code pro tok autorizačního kódu.
code_verifier Doporučené Stejný code_verifier, který byl použit k získání authorization_code. Vyžaduje se, pokud se v žádosti o udělení autorizačního kódu použila PKCE. Další informace najdete v dokumentu PKCE RFC.
client_assertion_type vyžadované pro důvěrné webové aplikace Aby bylo možné použít přihlašovací údaje certifikátu, musí urn:ietf:params:oauth:client-assertion-type:jwt-bearer být hodnota nastavená na .
client_assertion vyžadované pro důvěrné webové aplikace Kontrolní výraz (webový token JSON), který potřebujete vytvořit a podepsat pomocí certifikátu, který jste zaregistrovali jako přihlašovací údaje pro vaši aplikaci. Přečtěte si o přihlašovacích údajůch k certifikátu, kde se dozvíte, jak certifikát zaregistrovat a jaký je formát kontrolního výrazu.

Všimněte si, že parametry jsou stejné jako v případě požadavku sdíleným tajným kódem s tím rozdílem, že parametr je nahrazen dvěma client_secret parametry: a a client_assertion_type client_assertion .

Úspěšná odpověď

Úspěšná odpověď tokenu bude vypadat asi takhle:

{
    "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik5HVEZ2ZEstZnl0aEV1Q...",
    "token_type": "Bearer",
    "expires_in": 3599,
    "scope": "https%3A%2F%2Fgraph.microsoft.com%2Fmail.read",
    "refresh_token": "AwABAAAAvPM1KaPlrEqdFSBzjqfTGAMxZGUTdM0t4B4...",
    "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIn0.eyJhdWQiOiIyZDRkMTFhMi1mODE0LTQ2YTctOD...",
}
Parametr Popis
access_token Požadovaný přístupový token. Aplikace může tento token použít k ověření u zabezpečeného prostředku, jako je webové rozhraní API.
token_type Označuje hodnotu typu tokenu. Jediný typ, který Azure AD podporuje, je Bearer.
expires_in Jak dlouho je přístupový token platný (v sekundách).
scope Obory, pro access_token jsou platné. Volitelné – jedná se o nestandardní typ, a pokud token vyhodíte, bude pro obory požadované v počáteční části toku.
refresh_token Obnovovací token OAuth 2.0. Aplikace může tento token použít k získání dalších přístupových tokenů po vypršení platnosti aktuálního přístupového tokenu. Refresh_tokens dlouhodobé a lze je použít k zachování přístupu k prostředkům po delší dobu. Další podrobnosti o aktualizaci přístupového tokenu najdete v části níže.
Poznámka: K dispozici pouze v offline_access případě, že byl požadován obor.
id_token A JSON Web Token (JWT). Aplikace může dekódovat segmenty tohoto tokenu a požádat o informace o přihlášeném uživateli. Aplikace může hodnoty ukládat do mezipaměti a zobrazovat je a důvěrní klienti je mohou použít k autorizaci. Další informace o id_tokens najdete v tématu id_token reference .
Poznámka: K dispozici pouze v openid případě, že byl požadován obor.

Chybová odpověď

Odpovědi na chyby budou vypadat asi takhle:

{
  "error": "invalid_scope",
  "error_description": "AADSTS70011: The provided value for the input parameter 'scope' is not valid. The scope https://foo.microsoft.com/mail.read is not valid.\r\nTrace ID: 255d1aef-8c98-452f-ac51-23d051240864\r\nCorrelation ID: fb3d2015-bc17-4bb9-bb85-30c5cf1aaaa7\r\nTimestamp: 2016-01-09 02:02:12Z",
  "error_codes": [
    70011
  ],
  "timestamp": "2016-01-09 02:02:12Z",
  "trace_id": "255d1aef-8c98-452f-ac51-23d051240864",
  "correlation_id": "fb3d2015-bc17-4bb9-bb85-30c5cf1aaaa7"
}
Parametr Popis
error Řetězec kódu chyby, který lze použít ke klasifikaci typů chyb, ke kterým dochází, a lze ho použít k reakci na chyby.
error_description Konkrétní chybová zpráva, která může vývojáři pomoct identifikovat hlavní příčinu chyby ověřování.
error_codes Seznam kódů chyb specifických pro služby STS, které vám můžou pomoct s diagnostikou.
timestamp Čas, kdy k chybě došlo.
trace_id Jedinečný identifikátor požadavku, který může pomoct s diagnostikou.
correlation_id Jedinečný identifikátor požadavku, který může pomoct s diagnostikou napříč komponentami.

Kódy chyb koncového bodu tokenu

Kód chyby Description Akce klienta
invalid_request Chyba protokolu, například chybějící požadovaný parametr. Oprava žádosti nebo registrace aplikace a opětovné odešlete žádost
invalid_grant Autorizační kód nebo ověřovatel kódu PKCE jsou neplatné nebo vypršela jeho platnost. Zkuste pro koncový bod vytvořit nový požadavek a /authorize ověřte, že code_verifier je správný.
unauthorized_client Ověřený klient nemá oprávnění používat tento typ udělení autorizace. K tomu obvykle dochází v případě, že klientská aplikace není zaregistrovaná v Azure AD nebo není přidaná do tenanta Azure AD uživatele. Aplikace může uživatele vyzvat k instalaci aplikace a k jeho přidání do Azure AD.
invalid_client Ověření klienta se nezdařilo. Přihlašovací údaje klienta nejsou platné. Správce aplikace aktualizuje přihlašovací údaje.
unsupported_grant_type Autorizační server nepodporuje typ udělení autorizace. V žádosti změňte typ udělení. K tomuto typu chyby by mělo dojít pouze během vývoje a mělo by se zjistit během počátečního testování.
invalid_resource Cílový prostředek je neplatný, protože neexistuje, Azure AD ho nemůže najít nebo není správně nakonfigurovaný. To znamená, že pokud tento prostředek existuje, není v tenantovi nakonfigurovaný. Aplikace může uživatele vyzvat k instalaci aplikace a jejímu přidání do Azure AD.
interaction_required Nestandardní, protože specifikace OIDC volá pouze pro tento /authorize koncový bod. Požadavek vyžaduje zásah uživatele. Například je vyžadován další krok ověřování. Opakujte /authorize požadavek se stejnými obory.
temporarily_unavailable Server je dočasně zaneprázdněný pro zpracování žádosti. Opakujte požadavek po krátké prodlevě. Klientská aplikace může vysvětlit uživateli, že jeho odpověď je zpožděna z důvodu dočasné podmínky.
consent_required Požadavek vyžaduje souhlas uživatele. Tato chyba je nestandardní, protože se obvykle vrací jenom pro /authorize specifikace Endpoint na OIDC Specification. Vrátí se, když se scope v toku pro uplatnění kódu použil parametr, ke kterému klientská aplikace nemá oprávnění pro vyžádání. Klient by měl poslat uživateli zpátky do /authorize koncového bodu se správným oborem, aby mohl aktivovat souhlas.
invalid_scope Rozsah požadovaný aplikací je neplatný. Aktualizujte hodnotu parametru scope v požadavku na ověření na platnou hodnotu.

Poznámka

U jednostránkovéch aplikací se může zobrazit invalid_request Chyba s oznámením, že je povolená možnost uplatnění tokenu mezi zdroji jenom pro typ klienta s jednou stránkou. To znamená, že identifikátor URI přesměrování použitý k vyžádání tokenu nebyl označen jako spa identifikátor URI přesměrování. Projděte si Postup registrace aplikace , jak povolit tento tok.

Použití přístupového tokenu

Teď, když jste úspěšně získali access_token , můžete token v žádosti do webových rozhraní API použít tak, že ho zahrnete do Authorization hlavičky:

GET /v1.0/me/messages
Host: https://graph.microsoft.com
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik5HVEZ2ZEstZnl0aEV1Q...

Aktualizace přístupového tokenu

Access_tokens jsou krátkodobé a po vypršení jejich platnosti je musíte aktualizovat, aby bylo možné pokračovat v přístupu k prostředkům. Můžete to udělat tak, že odešlete další POST požadavek na /token koncový bod a tentokrát zadáte refresh_token místo code . Aktualizační tokeny jsou platné pro všechna oprávnění, která klient již obdržel souhlas. proto je scope=mail.read možné pro vyžádání nového přístupového tokenu použít obnovovací token vydaný na žádost pro scope=api://contoso.com/api/UseResource .

Aktualizace tokenů pro webové aplikace a nativní aplikace nemají zadané doby života. Obvykle jsou životnosti aktualizačních tokenů poměrně dlouhé. V některých případech ale platnost tokenů aktualizace vyprší, odvolají se nebo nemají dostatečná oprávnění pro požadovanou akci. Vaše aplikace musí očekávat a zpracovat chyby vrácené koncovým bodem vystavení tokenu správně. Jednostránkové aplikace ale získají token se 24 hodinovou životností, který vyžaduje nové ověřování každý den. To se dá udělat v tichém režimu v elementu IFRAME, pokud jsou povolené soubory cookie třetích stran, ale je potřeba je udělat v prohlížečích bez souborů cookie třetích stran, jako je Safari.

I když se tokeny aktualizace neodvolává při použití k získání nových přístupových tokenů, očekává se, že se starý obnovovací token zruší. Specifikace OAuth 2,0 říká: "AUTORIZAČNÍ Server může vydat nový obnovovací token. v takovém případě musí klient zrušit starý obnovovací token a nahradit ho novým obnovovacím tokenem. Po vydání nového obnovovacího tokenu klientovi může autorizační Server odvolat starý obnovovací token. "

Důležité

Pro aktualizační tokeny odeslané na identifikátor URI přesměrování, který se zaregistruje jako spa , platnost tokenu obnovení vyprší za 24 hodin. Další obnovovací tokeny získané pomocí počátečního obnovovacího tokenu budou přenášet po uplynutí této doby, takže aplikace musí být připravené k opětovnému spuštění toku autorizačního kódu pomocí interaktivního ověřování pro získání nového obnovovacího tokenu každých 24 hodin. Uživatelé nemusejí zadávat své přihlašovací údaje, obvykle se nezobrazuje žádné uživatelské rozhraní, stačí znovu načíst aplikaci – ale prohlížeč musí navštívit přihlašovací stránku v horním limitu, aby se zobrazila relace přihlášení. To je způsobeno funkcemi ochrany osobních údajů v prohlížečích, které blokují soubory cookie třetích stran.


// Line breaks for legibility only

POST /{tenant}/oauth2/v2.0/token HTTP/1.1
Host: https://login.microsoftonline.com
Content-Type: application/x-www-form-urlencoded

client_id=535fb089-9ff3-47b6-9bfb-4f1264799865
&scope=https%3A%2F%2Fgraph.microsoft.com%2Fmail.read
&refresh_token=OAAABAAAAiL9Kn2Z27UubvWFPbm0gLWQJVzCTE9UkP3pSx1aXxUjq...
&grant_type=refresh_token
&client_secret=sampleCredentia1s    // NOTE: Only required for web apps. This secret needs to be URL-Encoded
Parametr Typ Description
tenant vyžadováno {tenant}Hodnotu v cestě k požadavku lze použít k řízení, kdo se může přihlásit k aplikaci. Povolené hodnoty jsou common organizations consumers identifikátory klientů,, a. Další podrobnosti najdete v tématu základy protokolu.
client_id vyžadováno ID aplikace (klienta) , které Azure Portal – registrace aplikací prostředí přiřazené k vaší aplikaci.
grant_type vyžadováno Musí být refresh_token pro tuto nožku toku autorizačního kódu.
scope optional Mezerou oddělený seznam oborů. Rozsahy požadované v této nožkě musí být stejné jako podmnožina oborů požadovaných v původní nožkě authorization_code žádosti. pokud obory zadané v tomto požadavku vyplní více prostředků serveru, pak Microsoft identity platform vrátí token pro prostředek zadaný v prvním oboru. Podrobnější vysvětlení oborů najdete v tématu oprávnění, souhlas a obory.
refresh_token vyžadováno Refresh_token, kterou jste získali v druhé nožkě toku.
client_secret vyžadováno pro webové aplikace Tajný klíč aplikace, který jste vytvořili na portálu pro registraci aplikací pro vaši aplikaci. Neměl by se používat v nativní aplikaci, protože client_secrets nemůže být spolehlivě uložená na zařízeních. Vyžaduje se pro webové aplikace a webová rozhraní API, které mají možnost bezpečně ukládat client_secret na straně serveru. Tento tajný klíč musí být kódovaný pomocí adresy URL. Další informace naleznete v tématu Obecná specifikace syntaxe identifikátoru URI.

Úspěšná odpověď

Úspěšná odpověď tokenu bude vypadat takto:

{
    "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik5HVEZ2ZEstZnl0aEV1Q...",
    "token_type": "Bearer",
    "expires_in": 3599,
    "scope": "https%3A%2F%2Fgraph.microsoft.com%2Fmail.read",
    "refresh_token": "AwABAAAAvPM1KaPlrEqdFSBzjqfTGAMxZGUTdM0t4B4...",
    "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIn0.eyJhdWQiOiIyZDRkMTFhMi1mODE0LTQ2YTctOD...",
}
Parametr Popis
access_token Požadovaný přístupový token Aplikace může tento token použít k ověření zabezpečeného prostředku, jako je například webové rozhraní API.
token_type Určuje hodnotu typu tokenu. Jediný typ, který podporuje Azure AD, je nosič.
expires_in Jak dlouho je přístupový token platný (v sekundách).
scope Rozsahy, pro které je access_token platný.
refresh_token Nový token pro obnovení OAuth 2,0. Starý obnovovací token byste měli nahradit tímto nově získaným aktualizačním tokenem, abyste zajistili, že obnovovací tokeny zůstanou platné i tak dlouho.
Poznámka: Zadáno pouze v případě offline_access , že byl požadován obor.
id_token Nepodepsaný JSON Web Token (JWT). Aplikace může dekódovat segmenty tohoto tokenu a vyžádat si informace o uživateli, který se přihlásil. Aplikace může hodnoty ukládat do mezipaměti a zobrazovat je, ale nemělo by je spoléhat na jakékoli autorizace nebo hranice zabezpečení. Další informace o id_tokens najdete v tématu id_token reference .
Poznámka: Zadáno pouze v případě openid , že byl požadován obor.

Upozornění

Nepokoušejte se ve svém kódu ověřovat ani číst tokeny pro žádné rozhraní API, které vlastníte, včetně tokenů v tomto příkladu. Tokeny pro služby Microsoft mohou používat speciální formát, který se neověřuje jako JWT a může být také šifrován pro uživatele příjemce (účet Microsoft). Čtení tokenů je užitečný nástroj pro ladění a učení, ale nezá závislostí na tomto tokenu v kódu ani předpokládejte konkrétní informace o tokenech, které nejsou pro rozhraní API, které řídíte.

Chybová odezva

{
  "error": "invalid_scope",
  "error_description": "AADSTS70011: The provided value for the input parameter 'scope' is not valid. The scope https://foo.microsoft.com/mail.read is not valid.\r\nTrace ID: 255d1aef-8c98-452f-ac51-23d051240864\r\nCorrelation ID: fb3d2015-bc17-4bb9-bb85-30c5cf1aaaa7\r\nTimestamp: 2016-01-09 02:02:12Z",
  "error_codes": [
    70011
  ],
  "timestamp": "2016-01-09 02:02:12Z",
  "trace_id": "255d1aef-8c98-452f-ac51-23d051240864",
  "correlation_id": "fb3d2015-bc17-4bb9-bb85-30c5cf1aaaa7"
}
Parametr Popis
error Řetězec kódu chyby, který lze použít ke klasifikaci typů chyb, ke kterým dojde, a lze jej použít k reakci na chyby.
error_description Konkrétní chybová zpráva, která může vývojářům pomáhat najít hlavní příčinu chyby ověřování.
error_codes Seznam chybových kódů specifických pro službu STS, které mohou být užitečné při diagnostice.
timestamp Čas, kdy došlo k chybě.
trace_id Jedinečný identifikátor pro požadavek, který může pomáhat při diagnostice.
correlation_id Jedinečný identifikátor pro požadavek, který může pomáhat při diagnostice napříč komponentami.

Popis chybových kódů a doporučené akce klienta najdete v tématu kódy chyb pro chyby koncového bodu tokenu.