Microsoft kimlik platformu ve OAuth 2,0 yetkilendirme kodu akışı

OAuth 2,0 yetkilendirme kodu verme, Web API 'Leri gibi korumalı kaynaklara erişim kazanmak için bir cihaza yüklenen uygulamalarda kullanılabilir. OAuth 2,0 ve açık kimlik Bağlan (oıdc) Microsoft kimlik platformu uygulamasını kullanarak, mobil ve masaüstü uygulamalarınıza oturum açma ve apı erişimi de ekleyebilirsiniz.

Bu makalede, herhangi bir dili kullanarak uygulamanızdaki protokolde doğrudan programlanın nasıl yapılacağı açıklanır. Mümkün olduğunda, belirteçleri edinmek ve güvenli Web API 'lerini çağırmakIçin desteklenen Microsoft kimlik doğrulama KITAPLıKLARıNı (msal) kullanmanızı öneririz. Ayrıca , msal kullanan örnek uygulamalaragöz atın.

OAuth 2,0 yetkilendirme kodu akışı, oauth 2,0 belirtiminin 4,1 bölümündeaçıklanmaktadır. OıDC ile, tek sayfalı uygulamalar, Web uygulamalarıve yerel olarak yüklenen uygulamalardahil olmak üzere uygulama türlerinin çoğunda kimlik doğrulama ve yetkilendirme gerçekleştirmek için kullanılır. flow, uygulamaların, Microsoft kimlik platformu tarafından güvenliği sağlanmış kaynaklara erişmek için kullanılabilecek access_tokens güvenli bir şekilde almasına olanak sağlar, ayrıca, ek access_tokens almak için belirteçleri ve oturum açmış kullanıcı için kimlik belirteçlerini yenileyin.

İpucu

Bu isteği Postman 'da çalıştırmayı deneyin
Bu isteği ve daha fazlasını Postman 'da yürütmeyi deneyin; belirteçleri ve kimlikleri değiştirmeyi unutmayın!

Protokol diyagramı

Yüksek düzeyde, bir uygulamanın tüm kimlik doğrulama akışı şuna benzer bir bit:

OAuth kimlik doğrulama kodu Flow

Tek sayfalı uygulamalar için yeniden yönlendirme URI kurulumu gerekli

Tek sayfalı uygulamalar için yetkilendirme kodu akışı, bazı ek kurulum gerektirir. Yeniden yönlendirme URI 'nizi CORS için etkin olarak işaretlemek üzere tek sayfalı uygulamanızı oluşturmaya yönelik yönergeleri izleyin. CORS 'yi etkinleştirmek üzere var olan bir yeniden yönlendirme URI 'sini güncelleştirmek için, bildirim düzenleyicisini açın ve type yeniden YÖNLENDIRME URI 'nizin alanını spa bölümünde olarak ayarlayın replyUrlsWithType . Ayrıca, kimlik doğrulama sekmesinin "Web" bölümünde yeniden yönlendirme URI 'sine tıklayıp, yetkilendirme kodu akışını kullanarak geçirmek istediğiniz URI 'Leri seçebilirsiniz.

spaYeniden yönlendirme türü, örtük akışla geriye dönük olarak uyumludur. Belirteçleri almak için örtük akışı kullanan uygulamalar, spa yeniden YÖNLENDIRME URI 'sine sorun olmadan geçebilir ve dolaylı akışı kullanmaya devam edebilir.

Yetkilendirme kodu akışını kullanmaya çalışırsanız ve şu hatayı görebilirsiniz:

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.

Ardından, uygulama kaydınızı ziyaret edin ve uygulamanız için yeniden yönlendirme URI 'sini yazın spa .

Uygulamalar spa , yerel uygulamalar veya istemci kimlik bilgileri akışları gıbı Spa olmayan akışlarla yeniden yönlendirme URI 'sini kullanamaz. Güvenlik ve en iyi uygulamaları sağlamak için, bir spa üst bilgi olmadan yeniden yönlendirme URI 'si kullan seçeneğini kullanmayı denerseniz Microsoft Identity platformu bir hata döndürür Origin . Benzer şekilde, Microsoft Identity platformu, Origin parolaların tarayıcıdan kullanılmadığından emin olmak için, bir üst bilgi varlığı içindeki istemci kimlik bilgilerinin (OBO akışında, istemci kimlik bilgileri akışında ve Auth Code Flow) kullanılmasını da engeller.

Yetkilendirme kodu iste

Yetkilendirme kodu akışı, kullanıcıyı uç noktaya yönlendiren istemciyle başlar /authorize . Bu istekte istemci,, openid offline_access ve https://graph.microsoft.com/mail.read izinlerini kullanıcıdan ister. Bazı izinler yönetici kısıtlanıyor, örneğin kullanarak bir kuruluşun dizinine veri yazma Directory.ReadWrite.All . Uygulamanız bir kuruluş kullanıcısının bu izinlerinden birine erişim isterse, kullanıcı uygulamanızın izinlerini kabul etmek için yetkilendirilmediğini bildiren bir hata iletisi alır. Yönetici kısıtlı kapsamlara erişim istemek için, bunları doğrudan bir genel yöneticiden istemeniz gerekir. Daha fazla bilgi için Yönetici kısıtlı izinleriokuyun.

// 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

İpucu

Bu isteği yürütmek için aşağıdaki bağlantıya tıklayın! Oturum açtıktan sonra, tarayıcınız http://localhost/myapp/ Adres çubuğunda bir ile yeniden yönlendirilmelidir code . https://login.microsoftonline.com/common/oauth2/v2.0/authorize...

Parametre Gerekli/isteğe bağlı Description
tenant gerekli {tenant}İsteğin yolundaki değeri, uygulamada kimlerin oturum açmasını denetlemek için kullanılabilir. İzin verilen değerler, common , organizations consumers ve kiracı tanımlayıcılarıdır. Daha fazla ayrıntı için bkz. protokol temelleri. Kritik olarak, bir kullanıcıyı bir kiracıdan başka bir kiracıya imzalayabileceğiniz Konuk senaryolarında, kiracı tanıtıcısını kaynak kiracısında doğru şekilde imzalamak için sağlamalısınız.
client_id gerekli Azure Portal – uygulama kayıtları deneyiminin uygulamanıza atandığı uygulama (istemci) kimliği .
response_type gerekli code, Yetkilendirme kodu akışı için içermelidir. id_token token Karma Flowda dahil olabilir.
redirect_uri gerekli Uygulamanızın, kimlik doğrulama yanıtlarının sizin uygulamanız tarafından gönderilebileceği ve alınabileceği redirect_uri. Portalın, URL kodlamalı olması dışında, portalda kaydettiğiniz redirect_uris biriyle tam olarak eşleşmesi gerekir. Yerel & Mobile Apps için önerilen değerlerden birini https://login.microsoftonline.com/common/oauth2/nativeclient (katıştırılmış tarayıcıları kullanan uygulamalar için) veya http://localhost (sistem tarayıcılarını kullanan uygulamalar için) kullanmanız gerekir.
scope gerekli Kullanıcının onay vermesini istediğiniz kapsamların , boşlukla ayrılmış bir listesi. /authorizeİsteğin bacağı, bu birden fazla kaynağı kapsayabilir ve uygulamanızın çağırmak istediğiniz birden çok Web API 'si için onay almasını sağlar.
response_mode Önerilen Elde edilen belirteci uygulamanıza geri göndermek için kullanılması gereken yöntemi belirtir. Aşağıdakilerden biri olabilir:

- query
- fragment
- form_post

query kodu, yeniden yönlendirme URI 'niz üzerinde bir sorgu dizesi parametresi olarak sağlar. Örtük akışı kullanarak bir KIMLIK belirteci isteğinde bulunduğsanız, query OpenID belirtimindebelirtilen şekilde kullanamazsınız. Yalnızca kod isteğinde bulunduğsanız, query fragment veya kullanabilirsiniz form_post . form_post yeniden yönlendirme URI 'nize kod içeren bir GÖNDERI yürütür.
state Önerilen İsteğin belirteç yanıtında de döndürülecek bir değer. Bu, istediğiniz herhangi bir içerik dizesi olabilir. Rastgele oluşturulan benzersiz bir değer genellikle siteler arası istek sahteciliği saldırılarını önlemekiçin kullanılır. Bu değer Ayrıca, kullanıcının uygulamadaki durumuyla ilgili bilgileri, kimlik doğrulama isteği gerçekleştirilmeden önce (örneğin, bulunan sayfa veya Görünüm) kodlayabilir.
prompt isteğe bağlı Gerekli kullanıcı etkileşiminin türünü gösterir. Şu anda yalnızca geçerli değerler,, ve ' dir login none consent select_account .

- prompt=login , kullanıcıyı bu istek üzerine kimlik bilgilerini girmeye zorlar ve çoklu oturum açma 'yı yok eder.
- prompt=none Bunun tersi, kullanıcının herhangi bir etkileşimli istem ile sunulmayacağını garanti eder. istek, tek oturum açma yoluyla sessizce tamamlanamayacak Microsoft kimlik platformu bir interaction_required hata döndürür.
- prompt=consent Kullanıcı oturum açtıktan sonra OAuth onay iletişim kutusunu tetikler, böylece kullanıcıdan uygulamaya izin vermesini istenir.
- prompt=select_account , oturum veya herhangi bir anımsanan hesap ya da başka bir hesap kullanmayı tamamen seçmek için bir seçenek veya herhangi bir hatırlanan hesap seçim deneyimi sunan çoklu oturum açmayı kesintiye uğratacaktır.
login_hint İsteğe Bağlı Bu parametreyi, kullanıcının Kullanıcı adı ve e-posta adresi alanını daha önce biliyorsanız, Kullanıcı için oturum açma sayfasının Kullanıcı adı ve e-posta adresi alanını önceden doldurmanız için kullanabilirsiniz. Uygulamalar genellikle login_hint daha önceki bir oturum açma işleminden daha önce isteğe bağlı talebi ayıkladıktan sonra, yeniden kimlik doğrulama sırasında bu parametreyi kullanır.
domain_hint isteğe bağlı Dahil edilmesi durumunda, kullanıcının oturum açma sayfasında yer aldığı e-posta tabanlı bulma işlemini atlar; Örneğin, bunları federe kimlik sağlayıcısına gönderebilirsiniz. Genellikle uygulamalar, tid önceki bir oturum açma işleminden çıkartarak bu parametreyi yeniden kimlik doğrulama sırasında kullanacaktır.
code_challenge Önerilen/gerekli kod Exchange (pkce) için kanıt anahtarı aracılığıyla yetkilendirme kodu yetkisini güvenli hale getirmek için kullanılır. Dahil ise gereklidir code_challenge_method . Daha fazla bilgi için bkz. Pkce RFC. bu, tüm uygulama türleri için hem genel hem de gizli istemciler için önerilir ve yetkilendirme kodu akışını kullanan tek sayfalı uygulamalariçin Microsoft kimlik platformu gereklidir.
code_challenge_method Önerilen/gerekli Parametresi için öğesini kodlamak için kullanılan yöntem code_verifier code_challenge . Bu olmalıdır S256 , ancak plain BIR nedenden dolayı istemcinin SHA256 destekleyememelidir.

Dışlanmazsa, varsa code_challenge düz metin olarak kabul edilir code_challenge . Microsoft kimlik platformu hem hem de plain destekler S256 . Daha fazla bilgi için bkz. Pkce RFC. Bu , yetkilendirme kodu akışını kullanan tek sayfalı uygulamalariçin gereklidir.

Bu noktada, kullanıcıdan kimlik bilgilerini girmesi ve kimlik doğrulamasını tamamlaması istenir. Microsoft kimlik platformu, kullanıcının sorgu parametresinde belirtilen izinlere de sahip olduğundan emin olur scope . Kullanıcı bu izinlerden herhangi birine onay vermediyseniz, kullanıcıdan gerekli izinleri onaylaması istenir. İzinlerin, izin ve çok kiracılı uygulamaların ayrıntıları burada verilmiştir.

kullanıcı kimlik doğrulamasından ve onay vertikten sonra, Microsoft kimlik platformu redirect_uri parametresinde belirtilen yöntemi kullanarak, belirtilen şekilde uygulamanıza bir yanıt döndürür response_mode .

Başarılı yanıt

Kullanarak başarılı bir yanıt response_mode=query şöyle görünür:

GET http://localhost?
code=AwABAAAAvPM1KaPlrEqdFSBzjqfTGBCmLdgfSTLEMPGYuNHSUYBrq...
&state=12345
Parametre Açıklama
code Uygulamanın authorization_code istenen uygulamanın son istek. Uygulama, hedef kaynak için erişim belirteci isteği için yetkilendirme kodunu kullanabilir. Authorization_codes kısa sürelidir, genellikle 10 dakika sonra süresi dolar.
state İstekte bir durum parametresi varsa yanıtta aynı değerin görünmesi gerekir. Uygulama, istek ve yanıtta yer alan durum değerlerinin aynı olduğunu doğrulamalı.

Ayrıca, bir kimlik belirteci isteğinde bulunduysanız ve uygulama kaydında örtülü izni etkinleştirdiyseniz de bir kimlik belirteci alırsınız. Bu bazen "karma akış"olarak adlandırılır ve bu durum, ASP.NET.

Hata yanıtı

Uygulamanın bunları uygun şekilde işlemesi redirect_uri için hata yanıtları da uygulamasına gönderebilirsiniz:

GET http://localhost?
error=access_denied
&error_description=the+user+canceled+the+authentication
Parametre Açıklama
error Oluşan hata türlerini sınıflandırmak için kullanılmaktadır ve hatalara tepki olarak kullanılmaktadır.
error_description Bir geliştiricinin kimlik doğrulama hatasının kök nedenini tanımlamasını yardımcı olacak belirli bir hata iletisi.

Yetkilendirme uç noktası hataları için hata kodları

Aşağıdaki tabloda, hata yanıtının parametresinde döndürülen error çeşitli hata kodları açık almaktadır.

Hata Kodu Description İstemci Eylemi
invalid_request Gerekli parametrenin eksik olması gibi protokol hatası. İsteği düzeltin ve yeniden kuyruza at. Bu genellikle ilk test sırasında yakalanan bir geliştirme hatasıdır.
unauthorized_client İstemci uygulamasının yetkilendirme kodu isteğine izin verilmez. Bu hata genellikle istemci uygulaması Azure AD'ye kayıtlı değilse veya kullanıcının Azure AD kiracısına eklenmezken oluşur. Uygulama, kullanıcıdan uygulamayı yükleme ve Azure AD'ye ekleme yönergesini istenebilir.
access_denied Kaynak sahibi onayı reddetti İstemci uygulaması, kullanıcı onay vermedikçe devam etmek için kullanıcıya bildirebilir.
unsupported_response_type Yetkilendirme sunucusu istekte yanıt türünü desteklemez. İsteği düzeltin ve yeniden kuyruza at. Bu genellikle ilk test sırasında yakalanan bir geliştirme hatasıdır. Karma akışta görülür,istemci uygulama kaydında kimlik belirteci örtülü onay ayarını etkinleştirmeniz gerektiğini işaret eder.
server_error Sunucu beklenmeyen bir hatayla karşılaştı. İsteği yeniden deneyin. Bu hatalar geçici koşullardan neden olabilir. İstemci uygulaması, kullanıcıya yanıtını geçici bir hataya geciktirmiş olduğunu açıklayabilir.
temporarily_unavailable Sunucu geçici olarak isteği işlemek için fazla meşgul. İsteği yeniden deneyin. İstemci uygulaması, kullanıcıya geçici bir koşul nedeniyle yanıtın gecikmiş olduğunu açıklayabilir.
invalid_resource Hedef kaynak mevcut değil, Azure AD kaynağı bulamıyor veya doğru yapılandırılmamış. Bu hata, varsa kaynağın kiracıda yapılandırılmamış olduğunu gösterir. Uygulama, kullanıcıdan uygulamayı yükleme ve Azure AD'ye ekleme yönergesini istenebilir.
login_required Çok fazla kullanıcı bulunamıyor veya hiç kullanıcı bulunamadı İstemci sessiz kimlik doğrulaması ( ) prompt=none isteği yaptı ancak tek bir kullanıcı bulunamadı. Bu, oturumda etkin olan birden çok kullanıcı olduğu veya hiç kullanıcı olmadığını ifade ediyor olabilir. Bu, seçilen kiracıyı dikkate alır (örneğin, etkin iki Azure AD hesabı ve bir Microsoft hesabı varsa ve seçilirse sessiz kimlik consumers doğrulaması çalışır).
interaction_required İstek için kullanıcı etkileşimi gerekir. Ek bir kimlik doğrulama adımı veya onay gereklidir. İsteği olmadan yeniden prompt=none deneyin.

Kimlik belirteci de isteği (karma akış)

Yetkilendirme kodunu kullanmadan önce kullanıcının kim olduğunu öğrenmek için, uygulamaların yetkilendirme kodunu talep eden bir kimlik belirteci de talep etmek yaygın bir durumdur. Bu karma akış olarak adlandırılan bu akış, örtülü izni yetkilendirme kod akışıyla karıştırabilir. Karma akış, özellikle de kod geri ödemesini engellemeden bir kullanıcıya sayfa işlemek isteyen web uygulamaları için yaygın olarak ASP.NET. Hem tek sayfalı uygulamalar hem de geleneksel web uygulamaları, bu modelde daha az gecikme süresinden yararlanabilir.

Karma akış, daha önce açıklanan yetkilendirme kod akışıyla aynıdır, ancak üç eklemeyle aynıdır. Bunların hepsi kimlik belirteci isteğinde mevcuttur: yeni kapsamlar, yeni response_type ve yeni bir nonce sorgu parametresi.

// 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
Güncelleştirilmiş Parametre Gerekli/isteğe bağlı Açıklama
response_type Gerekli id_tokeneklemesi, sunucuya uygulamanın uç noktadan gelen yanıtta bir kimlik belirteci almak olacağını /authorize belirtir.
scope Gerekli Kimlik belirteçleri için , ve isteğe bağlı olarak ve kimlik belirteci openid kapsamlarını içerecek şekilde profile güncelleştirilmiş olması email gerekir.
nonce Gerekli İstekte bulunan ve uygulama tarafından oluşturulan ve sonuçta elde edilen değere talep olarak id_token değer. Uygulama daha sonra belirteç yeniden yürütme saldırılarını azaltmak için bu değeri doğrular. Değer genellikle isteğin kaynağını tanımlamak için kullanılan rastgele, benzersiz bir dizedir.
response_mode Önerilen Elde edilen belirteci uygulamanıza geri göndermek için kullanılacak yöntemi belirtir. Yalnızca yetkilendirme kodu için varsayılan olarak kullanılır, ancak istek bir query kimlik fragment response_type id_token. Ancak, özellikle yeniden yönlendirme form_post URI'si olarak http://localhost kullanırken uygulamaların kullanılması önerilir.

Yanıt modu olarak kullanımı, tarayıcılar parçayı web sunucusuna geçemeyeceği için kodu yeniden yönlendirmeden okumakta olan fragment web uygulamaları için soruna neden olur. Bu gibi durumlarda uygulamaların tüm verilerin form_post sunucuya gönderildiğini sağlamak için yanıt modunu kullanmaları gerekir.

Başarılı yanıt

kullanarak başarılı bir yanıt response_mode=fragment şöyle olacaktır:

GET https://login.microsoftonline.com/common/oauth2/nativeclient#
code=AwABAAAAvPM1KaPlrEqdFSBzjqfTGBCmLdgfSTLEMPGYuNHSUYBrq...
&id_token=eYj...
&state=12345
Parametre Açıklama
code Uygulamanın istenen yetkilendirme kodu. Uygulama, hedef kaynak için erişim belirteci isteği için yetkilendirme kodunu kullanabilir. Yetkilendirme kodları kısa sürelidir, genellikle yaklaşık 10 dakika sonra süresi dolar.
id_token Kullanıcı için, örtülü onay yoluyla verilen bir kimlik belirteci. Aynı c_hash istekte karma değeri olan özel code bir talep içerir.
state İstekte bir durum parametresi varsa yanıtta aynı değerin görünmesi gerekir. Uygulama, istek ve yanıtta yer alan durum değerlerinin aynı olduğunu doğrulamalı.

Erişim belirteci için kod kullanma

Tüm gizli istemciler istemci gizli dizilerini (Microsoft kimlik platformu tarafından oluşturulan simetrik paylaşılan gizli diziler) ve sertifika kimlik bilgilerini (geliştiricitarafından yüklenen asimetrik anahtarlar) kullanma seçeneğine sahip olur. En iyi güvenlik için sertifika kimlik bilgilerinin kullanılması önerilir. Genel istemciler (yerel uygulamalar ve tek sayfalı uygulamalar) yetkilendirme kodu kullanılırken gizli dizileri veya sertifikaları kullanmaması gerekir. Yeniden yönlendirme URL'lerinin uygulama türünü doğru şekilde göstermesini ve benzersiz olmasını her zaman garanti edin.

Client_secret ile erişim belirteci client_secret

Artık bir kaynak authorization_code ve kullanıcı tarafından izin verilmiş olduğunuza göre, istenen kaynağa bir için code access_token kullanabilirsiniz. Bunu yapmak için uç POST noktasına bir istek /token gönderebilirsiniz:

// 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.
Parametre Gerekli/isteğe bağlı Description
tenant gerekli {tenant}İstek yolundaki değer, uygulamada kimlerin oturum açmasını kontrol etmek için kullanılabilir. İzin verilen değerler common , , ve kiracı organizations consumers tanımlayıcılarıdır. Daha fazla ayrıntı için protokol temel bilgilerine bakın.
client_id gerekli Uygulamanıza atanan uygulama Azure portal Uygulama kayıtları Uygulama (istemci) kimliği.
scope isteğe bağlı Kapsamların boşlukla ayrılmış listesi. Kapsamların hepsi OIDC kapsamları ( , , ) ile birlikte tek bir profile openid kaynaktan email olmalı. Kapsamların daha ayrıntılı bir açıklaması için izinler, onay ve kapsamlar'a bakın. Bu, uygulamaların belirteç kullanımı sırasında belirteci almak istediğiniz kaynağı bildirsine izin vermek için tasarlanmış bir Microsoft yetkilendirme kodu akışı uzantısıdır.
code gerekli Akışın authorization_code ilk adımda elde edilen veri akışı.
redirect_uri gerekli İlkeyi redirect_uri için kullanılan aynı değer authorization_code.
grant_type gerekli Yetkilendirme kodu authorization_code akışı için olması gerekir.
code_verifier Önerilen Bu code_verifier elde etmek için kullanılan authorization_code. Yetkilendirme kodu izin isteğinde PKCE kullanılıyorsa gereklidir. Daha fazla bilgi için bkz. PKCE RFC.
client_secret gizli web uygulamaları için gereklidir Uygulama kayıt portalında, uygulamanıza özel olarak oluşturduğunuz uygulama gizlidir. Yerel uygulamada veya tek sayfalı uygulamada uygulama gizli client_secrets cihazlara veya web sayfalarına güvenilir bir şekilde depolanmaz. Sunucu tarafında güvenli bir şekilde depolanabilme özelliğine sahip web uygulamaları client_secret web API'leri için gereklidir. Burada tartışılan tüm parametrelerde olduğu gibi, istemci gizli adı gönderilmeden önce URL ile kodlanmış olmalıdır. Bu, genellikle SDK tarafından gerçekleştirilen bir adımdır. URI kodlaması hakkında daha fazla bilgi için bkz. URI Genel Söz Dizimi belirtimi. Kimlik bilgilerini Yetkilendirme üst bilgisinde sağlamak yerine için Temel kimlik doğrulama düzeni, RFC 6749 başına da de destekleni.

Sertifika kimlik bilgileriyle erişim belirteci isteği

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
Parametre Gerekli/isteğe bağlı Description
tenant gerekli {tenant}İstek yolundaki değer, uygulamada kimlerin oturum açmasını kontrol etmek için kullanılabilir. İzin verilen değerler common , , ve kiracı organizations consumers tanımlayıcılarıdır. Daha fazla ayrıntı için protokol temel bilgilerine bakın.
client_id gerekli Uygulamanıza atanan uygulama Azure portal Uygulama kayıtları Uygulama (istemci) kimliği.
scope isteğe bağlı Kapsamların boşlukla ayrılmış listesi. Kapsamların hepsi OIDC kapsamları ( , , ) ile birlikte tek bir profile openid kaynaktan email olmalı. Kapsamların daha ayrıntılı bir açıklaması için izinler, onay ve kapsamlar'a bakın. Bu, uygulamaların belirteç kullanımı sırasında belirteci almak istediğiniz kaynağı bildirsine izin vermek için tasarlanmış bir Microsoft yetkilendirme kodu akışı uzantısıdır.
code gerekli Akışın authorization_code ilk adımda elde edilen veri akışı.
redirect_uri gerekli İlkeyi redirect_uri için kullanılan aynı değer authorization_code.
grant_type gerekli Yetkilendirme kodu authorization_code akışı için olması gerekir.
code_verifier Önerilen Bu code_verifier elde etmek için kullanılan authorization_code. Yetkilendirme kodu izin isteğinde PKCE kullanılıyorsa gereklidir. Daha fazla bilgi için bkz. PKCE RFC.
client_assertion_type gizli web uygulamaları için gereklidir Bir sertifika kimlik bilgisi kullanmak urn:ietf:params:oauth:client-assertion-type:jwt-bearer için değeri olarak ayar gerekir.
client_assertion gizli web uygulamaları için gereklidir Uygulamanıza kimlik bilgileri olarak kaydolan sertifikayı oluşturmanız ve imzalamanız gereken bir onay (JSON web belirteci). Sertifikanızı kaydetmeyi ve onaylama biçimini öğrenmek için sertifika kimlik bilgileri hakkında bilgi okuyun.

Parametrenin iki parametreyle değiştirilmesi dışında, paylaşılan gizli bilgiyle yapılan istekte parametrelerin aynı olduğunu fark client_secret vardır: ve client_assertion_type client_assertion .

Başarılı yanıt

Başarılı bir belirteç yanıtı şuna benzer olacaktır:

{
    "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...",
}
Parametre Açıklama
access_token İstenen erişim belirteci. Uygulama, web API'si gibi güvenli kaynakta kimlik doğrulaması yapmak için bu belirteci kullanabilir.
token_type Belirteç türü değerini gösterir. Azure AD'nin desteklediği tek tür Taşıyıcı'dır
expires_in Erişim belirtecin ne kadar süre geçerli olduğu (saniye olarak).
scope Uygulamanın geçerli access_token kapsamlar. İsteğe bağlı - Bu standart değildir ve belirteci atlanırsa, akışın ilk okunda istenen kapsamlar için olur.
refresh_token OAuth 2.0 yenileme belirteci. Uygulama, geçerli erişim belirtecinin süresi dolsa da ek erişim belirteçleri almak için bu belirteci kullanabilir. Refresh_tokens uzun sürelidir ve kaynaklara erişimi uzun süreler boyunca korumak için kullanılabilir. Erişim belirteci yenileme hakkında daha fazla ayrıntı için aşağıdaki bölüme bakın.
Not: Yalnızca kapsam offline_access isteği varsa sağlanır.
id_token Bir JSON Web Token (JWT). Uygulama, oturum açan kullanıcı hakkında bilgi isteğinde olmak için bu belirteci segmentlerinin kodunu çözebilirsiniz. Uygulama, değerleri önbelleğe alıp bunları görüntüler ve gizli istemciler bunu yetkilendirme için kullanabilir. Daha fazla bilgi id_tokens bkz. id_token reference .
Not: Yalnızca kapsam openid isteği varsa sağlanır.

Hata yanıtı

Hata yanıtları şuna benzer:

{
  "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"
}
Parametre Açıklama
error Oluşan hata türlerini sınıflandırmak için kullanılmaktadır ve hatalara tepki olarak kullanılmaktadır.
error_description Bir geliştiricinin kimlik doğrulama hatasının kök nedenini tanımlamasını yardımcı olacak belirli bir hata iletisi.
error_codes Tanılamada yardımcı olmak için STS'ye özgü hata kodlarının listesi.
timestamp Hatanın meydana geldiği saat.
trace_id İstek için tanılamada yardımcı olacak benzersiz bir tanımlayıcı.
correlation_id İstek için bileşenler genelinde tanılamaya yardımcı olan benzersiz bir tanımlayıcı.

Belirteç uç noktası hataları için hata kodları

Hata Kodu Description İstemci Eylemi
invalid_request Gerekli parametrenin eksik olması gibi protokol hatası. İsteği veya uygulama kaydını düzeltin ve isteği yeniden at
invalid_grant Yetkilendirme kodu veya PKCE kod doğrulayıcısı geçersiz veya süresi doldu. Uç nokta için yeni bir /authorize istek deneyin ve code_verifier doğrulayın.
unauthorized_client Kimliği doğrulanmış istemci bu yetkilendirme izin türünü kullanma yetkisine sahip değil. Bu durum genellikle istemci uygulaması Azure AD'ye kayıtlı değilse veya kullanıcının Azure AD kiracısına eklenmezken oluşur. Uygulama, kullanıcıdan uygulamayı yükleme ve Azure AD'ye ekleme yönergesini istenebilir.
invalid_client İstemci kimlik doğrulaması başarısız oldu. İstemci kimlik bilgileri geçerli değil. Düzeltmek için uygulama yöneticisi kimlik bilgilerini günceller.
unsupported_grant_type Yetkilendirme sunucusu yetkilendirme onay türünü desteklemez. İstekte izin türünü değiştirme. Bu tür bir hata yalnızca geliştirme sırasında oluşmalı ve ilk test sırasında algılanır.
invalid_resource Hedef kaynak mevcut olduğundan, Azure AD tarafından bulunamaysa da doğru yapılandırılmamış olduğundan geçersizdir. Bu, varsa kaynağın kiracıda yapılandırılmamış olduğunu gösterir. Uygulama kullanıcıya uygulamayı yükleme ve Azure AD 'ye ekleme yönergesini isteyebilir.
interaction_required Standart olmayan, OıDC belirtimi yalnızca Endpoint üzerinde bunu çağırır /authorize . İstek, Kullanıcı etkileşimi gerektirir. Örneğin, ek bir kimlik doğrulama adımı gereklidir. /authorizeAynı kapsamlarla isteği yeniden deneyin.
temporarily_unavailable Sunucu, isteği işlemek için geçici olarak çok meşgul. İsteği küçük bir gecikmeden sonra yeniden deneyin. İstemci uygulaması, geçici bir durum nedeniyle yanıtı geciktirildiği kullanıcıya açıklanmayabilir.
consent_required İstek için Kullanıcı izni gerekiyor. Bu hata standart değildir, çünkü genellikle /authorize her OıDC belirtimleri için uç noktada döndürülür. scopeKod satın alma akışında, istemci uygulamanın istek için izni olmayan bir parametre kullanıldığında döndürülür. İstemcinin /authorize onay tetiklenmesi için kullanıcıyı doğru kapsam ile uç noktaya geri gönderebilmesi gerekir.
invalid_scope Uygulama tarafından istenen kapsam geçersiz. Kimlik doğrulama isteğindeki kapsam parametresinin değerini geçerli bir değere güncelleştirin.

Not

Tek sayfalı uygulamalar invalid_request , yalnızca ' tek sayfalı uygulamanın ' istemci türü için, çıkış noktaları arası belirteç kullanımına izin verildiğini belirten bir hata alabilir. Bu, belirteci istemek için kullanılan yeniden yönlendirme URI 'sinin spa yeniden yönlendirme URI 'si olarak işaretlenmediğini belirtir. Bu akışın nasıl etkinleştirileceği hakkında uygulama kayıt adımlarını gözden geçirin.

Erişim belirtecini kullanma

Artık başarıyla edindiniz access_token , bu API 'yi üstbilgiye dahil ederek Web API 'lerine yönelik isteklerde kullanabilirsiniz Authorization :

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

Erişim belirtecini Yenile

Access_tokens kısa ömürlü ve kaynaklara erişmeye devam etmek için süreleri dolduktan sonra yenilemeniz gerekir. Bunu, uç noktasına başka bir istek göndererek yapabilirsiniz POST /token refresh_token code . Yenileme belirteçleri, istemcinizin zaten onay aldığı tüm izinler için geçerlidir. bu nedenle, için bir istekte verilen yenileme belirteci scope=mail.read için yeni bir erişim belirteci istemek üzere kullanılabilir scope=api://contoso.com/api/UseResource .

Web uygulamaları ve yerel uygulamalar için yenileme belirteçleri, belirtilen ömürleri içermez. Genellikle, yenileme belirteçlerinin yaşam süreleri nispeten uzundur. Ancak, bazı durumlarda belirteçleri yenileme süre sonu, iptal etme veya istenen eylem için yeterli ayrıcalıklara sahip değil. Uygulamanızın belirteç verme uç noktası tarafından döndürülen hataları beklemesi ve işlemesi gerekir. Ancak tek sayfalı uygulamalar, 24 saatlik bir yaşam süresine sahip bir belirteç alır ve her gün yeni bir kimlik doğrulaması gerektirir. Bu, 3. taraf tanımlama bilgileri etkinleştirildiğinde bir IFRAME içinde sessizce yapılabilir, ancak Safari gibi 3. taraf tanımlama bilgileri olmadan tarayıcılarda bir üst düzey çerçevede (tam sayfa gezintisi veya açılan pencere penceresi) yapılması gerekir.

Yeni erişim belirteçleri elde etmek için kullanıldığında yenileme belirteçleri iptal edilmese de, eski yenileme belirtecini atmayı bekliyorcaksınız. OAuth 2,0 belirtimi şöyle diyor: "yetkilendirme sunucusu yeni bir yenileme belirteci verebilir, bu durumda istemcinin eski yenileme belirtecini atılması ve yeni yenileme belirteci Ile değiştirmeniz gerekir. Yetkilendirme sunucusu, istemciye yeni bir yenileme belirteci gönderdikten sonra eski yenileme belirtecini iptal edebılır. "

Önemli

Olarak kaydedilmiş bir yeniden yönlendirme URI 'sine gönderilen yenileme belirteçleri için spa yenileme belirtecinin süresi 24 saat sonra dolacak. İlk yenileme belirteci kullanılarak elde edilen ek yenileme belirteçleri, bu süre sonu zamanından sonra, her 24 saatte bir yeni yenileme belirteci almak için bir etkileşimli kimlik doğrulaması kullanarak yetkilendirme kodu akışını yeniden çalıştırmaya hazırlanmalıdır. Kullanıcılar, kimlik bilgilerini girmek zorunda kalmaz ve genellikle bir UX görmeyecektir, ancak uygulamanızın yeniden yüklenmesi, ancak tarayıcının oturum açma oturumunu görmek için üst düzey çerçevede oturum açma sayfasını ziyaret etmelidir. Bunun nedeni, tarayıcılarda üçüncü taraf tanımlama bilgilerini engelleyen gizlilik özellikleridir.


// 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
Parametre Tür Description
tenant gerekli {tenant}İsteğin yolundaki değeri, uygulamada kimlerin oturum açmasını denetlemek için kullanılabilir. İzin verilen değerler, common , organizations consumers ve kiracı tanımlayıcılarıdır. Daha fazla ayrıntı için bkz. protokol temelleri.
client_id gerekli Azure Portal – uygulama kayıtları deneyiminin uygulamanıza atandığı uygulama (istemci) kimliği .
grant_type gerekli refresh_tokenYetkilendirme kodu akışının bu bacağı için olmalıdır.
scope isteğe bağlı Kapsamların boşlukla ayrılmış listesi. Bu Bata istenen kapsamlar, özgün authorization_code isteği balarında istenen kapsamların bir alt kümesiyle eşit olmalıdır. bu istekte belirtilen kapsamlar birden çok kaynak sunucusuna yayıldıysanız, Microsoft kimlik platformu ilk kapsamda belirtilen kaynak için bir belirteç döndürür. Kapsamların daha ayrıntılı bir açıklaması için izinler, onay ve kapsamlar' a bakın.
refresh_token gerekli Akışın ikinci Bada elde ettiğiniz refresh_token.
client_secret Web uygulamaları için gerekli Uygulamanız için uygulama kayıt portalında oluşturduğunuz uygulama gizli anahtarı. Client_secrets, cihazlarda güvenilir bir şekilde depolanamadığı için yerel bir uygulamada kullanılmamalıdır. Client_secret sunucu tarafında güvenli bir şekilde depolayabilme özelliğine sahip Web uygulamaları ve Web API 'Leri için gereklidir. Bu parolanın URL kodlamalı olması gerekir. Daha fazla bilgi için bkz. URI genel sözdizimi belirtimi.

Başarılı yanıt

Başarılı bir belirteç yanıtı şöyle görünür:

{
    "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...",
}
Parametre Açıklama
access_token İstenen erişim belirteci. Uygulama, bir Web API 'SI gibi güvenli kaynak üzerinde kimlik doğrulaması yapmak için bu belirteci kullanabilir.
token_type Belirteç türü değerini gösterir. Azure AD 'nin desteklediği tek tür taşıyıcı
expires_in Erişim belirtecinin geçerli olduğu süre (saniye cinsinden).
scope Access_token için geçerli olan kapsamlar.
refresh_token Yeni bir OAuth 2,0 yenileme belirteci. Yenileme belirteçlerinizin mümkün olduğunca geçerli kalmasını sağlamak için eski yenileme belirtecini bu yeni alınan yenileme belirteciyle değiştirmelisiniz.
Note: Yalnızca offline_access kapsam isteniyorsa sağlandı.
id_token İşaretsiz bir JSON Web Token (JWT). Uygulama, oturum açan kullanıcı hakkında bilgi istemek için bu belirtecin segmentlerinin kodunu çözebilir. Uygulama değerleri önbelleğe alabilir ve görüntüleyebilir, ancak herhangi bir yetkilendirme veya güvenlik sınırları için bu değere dayanmamalıdır. İd_tokens hakkında daha fazla bilgi için bkz id_token reference ..
Note: Yalnızca openid kapsam isteniyorsa sağlandı.

Uyarı

Kodunuzda bu örnekteki belirteçler de dahil olmak üzere sahip olmadığınız API 'leri doğrulamaya veya okumayı denemeyin. Microsoft hizmetleri belirteçleri, JWT olarak doğrulanmayacak özel bir biçim kullanabilir ve tüketici (Microsoft hesabı) kullanıcıları için de şifrelenebilir. Belirteçleri okurken faydalı bir hata ayıklama ve öğrenme aracı olsa da, kodunuzda bu şekilde bağımlılıklar kullanmayın veya kontrol ettiğiniz bir API için olmayan belirteçlerin özelliklerini varsayın.

Hata yanıtı

{
  "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"
}
Parametre Açıklama
error Oluşan hata türlerini sınıflandırmak için kullanılabilen ve hatalara yanıt vermek için kullanılabilen bir hata kodu dizesi.
error_description Bir geliştiricinin kimlik doğrulama hatasının kök nedenini belirlemesine yardımcı olabilecek belirli bir hata iletisi.
error_codes Tanılamada yardımcı olabilecek STS 'ye özgü hata kodlarının bir listesi.
timestamp Hatanın oluştuğu zaman.
trace_id Tanılamada yardımcı olabilecek istek için benzersiz bir tanımlayıcı.
correlation_id İsteğe ait, bileşenler genelinde tanılamada yardımcı olabilecek benzersiz bir tanımlayıcı.

Hata kodlarının ve önerilen istemci eyleminin açıklaması için bkz. belirteç uç noktası hataları Için hata kodları.