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.
Diagram protokolu
Na vysoké úrovni celý tok ověřování pro aplikaci vypadá trochu takhle:
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_postquery 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.
