Microsoft kimlik platformu ve OAuth 2.0 örtük izin akışı
Microsoft kimlik platformu, OAuth 2.0 Belirtiminde açıklandığı gibi OAuth 2.0 örtük izin akışını destekler. Örtük vermenin tanımlayıcı özelliği, belirteçlerin (kimlik belirteçleri veya erişim belirteçleri) /token uç noktası yerine doğrudan /authorize uç noktasından döndürülür. Bu genellikle yetkilendirme kodu akışının bir parçası olarak kullanılır ve "karma akış" olarak adlandırılır. Kimlik belirtecini bir yetkilendirme koduyla birlikte /authorize isteğinde alır.
Bu makalede, Microsoft Entra Id'den belirteç istemek için uygulamanızdaki protokole karşı doğrudan programlama açıklanmaktadır. Mümkün olduğunda, belirteçleri almak ve güvenli web API’lerini aramak yerine desteklenen Microsoft Kimlik Doğrulama Kitaplıklarını (MSAL) kullanmanızı öneririz. Ayrıca MSAL kullanan örnek uygulamalara da göz atın.
Kimlik doğrulama kod akışını tercih edin
Tarayıcılardan üçüncü taraf tanımlama bilgilerini kaldırma planlarıyla, örtük verme akışı artık uygun bir kimlik doğrulama yöntemi değildir. Örtük akışın sessiz çoklu oturum açma (SSO) özellikleri üçüncü taraf tanımlama bilgileri olmadan çalışmaz ve yeni bir belirteç almaya çalıştıklarında uygulamaların bozulmasına neden olur. Tüm yeni uygulamaların örtük akış yerine artık tek sayfalı uygulamaları destekleyen yetkilendirme kodu akışını kullanmasını kesinlikle öneririz. Mevcut tek sayfalı uygulamalar da yetkilendirme kodu akışına geçirilmelidir.
OAuth2 örtük izni için uygun senaryolar
Örtük izin, üçüncü taraf tanımlama bilgilerinin olmamasının uygulamanızı etkilemediği oturum açma akışınızın yalnızca ilk, etkileşimli bölümü için güvenilirdir. Bu sınırlama, bunu yalnızca uygulamanızın yetkilendirme uç noktasından bir kodun yanı sıra belirteç istediği karma akışın bir parçası olarak kullanmanız gerektiği anlamına gelir. Karma akışta uygulamanız yenileme belirteci için kullanılabilecek bir kod alır ve böylece uygulamanızın oturum açma oturum açma oturumlarının zaman içinde geçerli kalmasını sağlar.
Protokol diyagramı
Aşağıdaki diyagramda örtük oturum açma akışının tamamının nasıl göründüğü ve izleyen bölümlerde her adım ayrıntılı olarak açıklanmaktadır.
Oturum açma isteğini gönderme
Kullanıcıyı başlangıçta uygulamanızda oturum açmak için bir OpenID Bağlan kimlik doğrulama isteği gönderebilir ve Microsoft kimlik platformu'ndan bir id_token
alabilirsiniz.
Önemli
Kimlik belirtecini ve/veya erişim belirtecini başarıyla istemek için, Microsoft Entra yönetim merkezi - Uygulama kayıtları sayfasındaki uygulama kaydında, Örtük izin ve karma akışlar bölümünde Kimlik belirteçleri ve erişim belirteçleriseçilerek ilgili örtük izin akışı etkinleştirilmelidir. Etkinleştirilmemişse bir unsupported_response
hata döndürülür:
The provided value for the input parameter 'response_type' is not allowed for this client. Expected value is 'code'
// Line breaks for legibility only
https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize?
client_id=00001111-aaaa-2222-bbbb-3333cccc4444
&response_type=id_token
&redirect_uri=http%3A%2F%2Flocalhost%2Fmyapp%2F
&scope=openid
&response_mode=fragment
&state=12345
&nonce=678910
Parametre | Tür | Açıklama |
---|---|---|
tenant |
gerekli | {tenant} İstek yolundaki değer, uygulamada kimlerin oturum açabileceğini denetlemek için kullanılabilir. İzin verilen değerler , organizations , consumers ve kiracı tanımlayıcılarıdırcommon . Daha fazla ayrıntı için bkz . protokolle ilgili temel bilgiler. Kritik olarak, bir kullanıcıyı bir kiracıdan başka bir kiracıya imzaladığınız konuk senaryoları için, bu kullanıcıyı kaynak kiracıda doğru şekilde oturum açmak için kiracı tanımlayıcısını sağlamanız gerekir . |
client_id |
gerekli | Microsoft Entra yönetim merkezi - Uygulama kayıtları sayfasının uygulamanıza atandığı Uygulama (istemci) kimliği. |
response_type |
gerekli | OpenID Bağlan oturum açma için dahil id_token edilmelidir. Ayrıca response_type , içerebilir token . token Burada kullanmak, uygulamanızın yetkilendirme uç noktasına ikinci bir istekte bulunmak zorunda kalmadan yetkilendirme uç noktasından hemen erişim belirteci almasına olanak sağlar. response_type kullanırsanız token parametresi, scope belirteci hangi kaynak için düzenleyebileceğinizi belirten bir kapsam içermelidir (örneğin, user.read Microsoft Graph'ta). Ayrıca yetkilendirme kodu akışında kullanmak üzere bir yetkilendirme kodu sağlama yerine token de içerebilircode . Bu id_token +code yanıt bazen karma akış olarak adlandırılır. |
redirect_uri |
önerilen | Kimlik doğrulama yanıtlarının uygulamanız tarafından gönderilip alınabildiği uygulamanızın yeniden yönlendirme URI'si. Url ile kodlanmış olması dışında portalda kaydettiğiniz yeniden yönlendirme URI'lerinden biriyle tam olarak eşleşmelidir. |
scope |
gerekli | Boşlukla ayrılmış kapsam listesi. OpenID Bağlan ()id_tokens için, onay kullanıcı arabirimindeki "Oturum açın" iznine çevrilen kapsamını openid içermelidir. İsteğe bağlı olarak, ek kullanıcı verilerine email erişim elde etmek için ve profile kapsamlarını da dahil etmek isteyebilirsiniz. Erişim belirteci istenirse, çeşitli kaynaklara onay istemek için bu isteğe başka kapsamlar da ekleyebilirsiniz. |
response_mode |
isteğe bağlı | Sonuçta elde edilen belirteci uygulamanıza geri göndermek için kullanılacak yöntemi belirtir. Varsayılan olarak yalnızca erişim belirtecini sorgular, ancak istek bir id_token içeriyorsa parçalar. |
state |
önerilen | İstekte bulunan ve belirteç yanıtında da döndürülecek bir değer. İstediğiniz herhangi bir içeriğin dizesi olabilir. Rastgele oluşturulan benzersiz bir değer genellikle siteler arası istek sahteciliği saldırılarını önlemek için kullanılır. Durum, kimlik doğrulaması isteği gerçekleşmeden önce kullanıcının uygulamadaki durumuyla ilgili bilgileri (örneğin, üzerinde bulunduğu sayfa veya görünüm) kodlamak için de kullanılır. |
nonce |
gerekli | İstekte bulunan ve uygulama tarafından oluşturulan ve sonuçta elde edilen kimlik belirtecinde talep olarak yer alacak bir değer. Uygulama daha sonra belirteç yeniden yürütme saldırılarını azaltmak için bu değeri doğrulayabilir. Değeri genellikle isteğin kaynağını tanımlamak için kullanılabilecek rastgele, benzersiz bir dizedir. Yalnızca bir id_token istendiğinde gereklidir. |
prompt |
isteğe bağlı | Gerekli kullanıcı etkileşiminin türünü gösterir. Şu anda tek geçerli değerler , , none select_account ve consent değerleridirlogin . prompt=login , kullanıcıyı bu istekte kimlik bilgilerini girmeye zorlar ve çoklu oturum açma işlemini olumsuzlar. prompt=none tam tersidir; kullanıcıya herhangi bir etkileşimli istem sunulmamasını sağlar. İstek SSO aracılığıyla sessizce tamamlanamazsa Microsoft kimlik platformu bir hata döndürür. prompt=select_account kullanıcıyı oturumda anımsanan tüm hesapların görüntülendiği bir hesap seçiciye gönderir. prompt=consent kullanıcı oturum açtığında OAuth onayı iletişim kutusunu tetikler ve kullanıcıdan uygulamaya izin vermesini ister. |
login_hint |
isteğe bağlı | Kullanıcı adını önceden biliyorsanız, kullanıcının oturum açma sayfasının kullanıcı adı ve e-posta adresi alanını önceden doldurmak için bu parametreyi kullanabilirsiniz. Genellikle, uygulamalar önceden bir oturum açmadan isteğe bağlı talebi ayıkladıktan sonra yeniden kimlik doğrulaması sırasında bu parametreyi login_hint kullanır. |
domain_hint |
isteğe bağlı | Dahil edilirse, kullanıcının oturum açma sayfasından geçtiği e-posta tabanlı bulma işlemini atlar ve bu da biraz daha kolay bir kullanıcı deneyimine yol açar. Bu parametre genellikle tek bir kiracıda çalışan İş Kolu uygulamaları için kullanılır. Burada, belirli bir kiracı içinde bir etki alanı adı sağlar ve kullanıcıyı bu kiracının federasyon sağlayıcısına iletir. Bu ipucu, konukların bu uygulamada oturum açmasını engeller ve FIDO gibi bulut kimlik bilgilerinin kullanımını sınırlar. |
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 onay verdiğinden scope
de emin olur. Kullanıcı bu izinlerden hiçbirini onaylamadıysa, kullanıcıdan gerekli izinleri onaylamasını ister. Daha fazla bilgi için bkz . izinler, onay ve çok kiracılı uygulamalar.
Kullanıcı kimlik doğrulaması yapıp onay verdikten sonra, Microsoft kimlik platformu parametresinde response_mode
belirtilen yöntemi kullanarak belirtilen redirect_uri
konumunda uygulamanıza bir yanıt döndürür.
Başarılı yanıt
ve kullanarak response_mode=fragment
response_type=id_token+code
başarılı bir yanıt aşağıdaki gibi görünür (okunabilirlik için satır sonları ile):
GET https://localhost/myapp/#
code=0.AgAAktYV-sfpYESnQynylW_UKZmH-C9y_G1A
&id_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik5HVEZ2ZEstZnl0aEV1Q...
&state=12345
Parametre | Açıklama |
---|---|
code |
dahilse response_type dahil.code Yetkilendirme kodu akışında kullanıma uygun bir yetkilendirme kodudur. |
access_token |
dahilse response_type dahil.token Uygulamanın istediği erişim belirteci. Erişim belirtecinin kodu çözülmeyecek veya başka bir şekilde incelenmemeli, opak bir dize olarak kabul edilmelidir. |
token_type |
dahilse response_type dahil.token Bu her zaman olacaktır Bearer . |
expires_in |
dahilse response_type dahil.token Önbelleğe alma amacıyla belirtecin geçerli olduğu saniye sayısını gösterir. |
scope |
dahilse response_type dahil.token access_token geçerli olacağı kapsamları gösterir. Kullanıcı için geçerli değilse, istenen tüm kapsamları içermeyebilir. Örneğin, kişisel bir hesap kullanarak oturum açarken istenen Microsoft Entra-only kapsamları. |
id_token |
İmzalı JSON Web Belirteci (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ırı için bunlara güvenmemelidir. Kimlik belirteçleri hakkında daha fazla bilgi için bkz id_token reference . . Not: Yalnızca kapsam istendiyse ve response_type dahil id_tokens edildiyse openid sağlanır. |
state |
İstekte bir durum parametresi varsa, yanıtta aynı değer görünmelidir. Uygulama, istek ve yanıttaki durum değerlerinin aynı olduğunu doğrulamalıdır. |
Uyarı
Bu örnekteki belirteçler de dahil olmak üzere sahip olmadığınız API'lerin belirteçlerini kodunuzda doğrulamayı 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 okumak yararlı bir hata ayıklama ve öğrenme aracı olsa da, kodunuzda buna bağımlılıkları almayın veya denetlediğiniz bir API için olmayan belirteçlerle ilgili belirli bilgileri varsaymayın.
Hata yanıtı
Hata yanıtları da uygulamasına redirect_uri
gönderilerek uygulamanın bunları uygun şekilde işleyebilmesini sağlayabilir:
GET https://localhost/myapp/#
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ılabilecek ve hatalara tepki 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. |
Erişim belirteçlerini sessizce alma
Önemli
Örtük akışın bu bölümü, üçüncü taraf tanımlama bilgilerinin varsayılan olarak kaldırılması nedeniyle farklı tarayıcılarda kullanıldığından uygulamanız için çalışma olasılığı düşüktür. Bu, şu anda Gizli'de olmayan Chromium tabanlı tarayıcılarda çalışmaya devam etse de, geliştiricilerin akışın bu bölümünü kullanmayı yeniden düşünmesi gerekir. Üçüncü taraf tanımlama bilgilerini desteklemeyen tarayıcılarda, oturum açma sayfasının oturum tanımlama bilgileri tarayıcı tarafından kaldırıldığından hiçbir kullanıcının oturum açmadığını belirten bir hata alırsınız.
Kullanıcıyı tek sayfalı uygulamanızda oturum açtığınıza göre, Microsoft Graph gibi Microsoft kimlik platformu tarafından güvenliği sağlanan web API'lerini çağırmak için erişim belirteçlerini sessizce alabilirsiniz. response_type kullanarak token
bir belirteç aldıysanız bile, kullanıcıyı yeniden oturum açmaya yönlendirmeden ek kaynaklara belirteç almak için bu yöntemi kullanabilirsiniz.
Normal OpenID Bağlan/OAuth akışında, Microsoft kimlik platformu /token
uç noktasına bir istekte bulunarak bunu yapabilirsiniz. Diğer web API'leri için yeni belirteçler almak için gizli bir iframe'de istekte bulunabilirsiniz:
// Line breaks for legibility only
https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize?
client_id=00001111-aaaa-2222-bbbb-3333cccc4444&response_type=token
&redirect_uri=http%3A%2F%2Flocalhost%2Fmyapp%2F
&scope=https%3A%2F%2Fgraph.microsoft.com%2Fuser.read
&response_mode=fragment
&state=12345
&nonce=678910
&prompt=none
&login_hint=myuser@mycompany.com
URL'deki sorgu parametreleriyle ilgili ayrıntılar için bkz . Oturum açma isteğini gönderme.
İpucu
Aşağıdaki isteği bir tarayıcı sekmesine kopyalamayı ve yapıştırmayı deneyin! (Değerleri kullanıcınız için doğru değerle değiştirmeyi login_hint
unutmayın)
https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=535fb089-9ff3-47b6-9bfb-4f1264799865&response_type=token&redirect_uri=http%3A%2F%2Flocalhost%2Fmyapp%2F&scope=https%3A%2F%2Fgraph.microsoft.com%2Fuser.read&response_mode=fragment&state=12345&nonce=678910&prompt=none&login_hint={your-username}
Bunu bir iframe içinde açmak yerine doğrudan bir tarayıcı çubuğuna girdiğinizden, bunun üçüncü taraf tanımlama bilgisi desteği olmayan tarayıcılarda bile çalışacağını unutmayın.
parametresi sayesinde prompt=none
bu istek başarılı olur veya hemen başarısız olur ve uygulamanıza geri döner. Yanıt, belirtilen konumundaki redirect_uri
uygulamanıza parametresinde response_mode
belirtilen yöntemi kullanılarak gönderilir.
Başarılı yanıt
Kullanarak response_mode=fragment
başarılı bir yanıt şöyle görünür:
GET https://localhost/myapp/#
access_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik5HVEZ2ZEstZnl0aEV1Q...
&state=12345
&token_type=Bearer
&expires_in=3599
&scope=https%3A%2F%2Fgraph.microsoft.com%2Fdirectory.read
Parametre | Açıklama |
---|---|
access_token |
dahilse response_type dahil.token Bu örnekte Microsoft Graph için uygulamanın istediği erişim belirteci. Erişim belirtecinin kodu çözülmeyecek veya başka bir şekilde incelenmemeli, opak bir dize olarak kabul edilmelidir. |
token_type |
Bu her zaman olacaktır Bearer . |
expires_in |
Önbelleğe alma amacıyla belirtecin geçerli olduğu saniye sayısını gösterir. |
scope |
Erişim belirtecinin geçerli olacağı kapsamları gösterir. Kullanıcı için geçerli değilse istenen kapsamların tümünü içermeyebilir (oturum açmak için kişisel bir hesap kullanıldığında yalnızca Microsoft Entra kapsamlarının istenmesi durumunda). |
id_token |
İmzalı JSON Web Belirteci (JWT). dahilse response_type dahil.id_token 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ırı için bunlara güvenmemelidir. id_tokens hakkında daha fazla bilgi için başvuruya id_token bakın. Not: Yalnızca kapsam istendiyse openid sağlanır. |
state |
İstekte bir durum parametresi varsa, yanıtta aynı değer görünmelidir. Uygulama, istek ve yanıttaki durum değerlerinin aynı olduğunu doğrulamalıdır. |
Hata yanıtı
Hata yanıtları da uygulamasına redirect_uri
gönderilerek uygulamanın bunları uygun şekilde işleyebilmesini sağlayabilir. durumunda prompt=none
, beklenen bir hata olacaktır:
GET https://localhost/myapp/#
error=user_authentication_required
&error_description=the+request+could+not+be+completed+silently
Parametre | Açıklama |
---|---|
error |
Oluşan hata türlerini sınıflandırmak için kullanılabilecek ve hatalara tepki 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. |
iframe isteğinde bu hatayı alırsanız, kullanıcının yeni bir belirteç almak için etkileşimli olarak yeniden oturum açması gerekir. Bu durumu uygulamanız için anlamlı olacak şekilde işlemeyi seçebilirsiniz.
Belirteçleri yenileme
Örtük izin, yenileme belirteçleri sağlamaz. Hem kimlik belirteçlerinin hem de erişim belirteçlerinin süresi kısa bir süre sonra dolacak, bu nedenle uygulamanızın bu belirteçleri düzenli aralıklarla yenilemeye hazır olması gerekir. Her iki belirteç türünü de yenilemek için, kimlik platformunun davranışını denetlemek için parametresini kullanarak yukarıdan prompt=none
aynı gizli iframe isteğini gerçekleştirebilirsiniz. Yeni bir kimlik belirteci almak istiyorsanız ve scope=openid
içinde ve parametresini nonce
kullandığınızdan id_token
response_type
emin olun.
Üçüncü taraf tanımlama bilgilerini desteklemeyen tarayıcılarda bu, hiçbir kullanıcının oturum açmadığını belirten bir hataya neden olur.
Oturum kapatma isteği gönderme
OpenID Bağlanend_session_endpoint
, uygulamanızın kullanıcının oturumunu sonlandırmak ve Microsoft kimlik platformu tarafından ayarlanan tanımlama bilgilerini temizlemek için Microsoft kimlik platformu bir istek göndermesine olanak tanır. Bir kullanıcıyı web uygulamasından tamamen kapatmak için uygulamanızın kullanıcıyla kendi oturumunu sonlandırması (genellikle belirteç önbelleğini temizleyerek veya tanımlama bilgilerini bırakarak) ve ardından tarayıcıyı şu konuma yönlendirmelidir:
https://login.microsoftonline.com/{tenant}/oauth2/v2.0/logout?post_logout_redirect_uri=https://localhost/myapp/
Parametre | Tür | Açıklama |
---|---|---|
tenant |
gerekli | {tenant} İstek yolundaki değer, uygulamada kimlerin oturum açabileceğini denetlemek için kullanılabilir. İzin verilen değerler , organizations , consumers ve kiracı tanımlayıcılarıdırcommon . Daha fazla ayrıntı için bkz . protokolle ilgili temel bilgiler. |
post_logout_redirect_uri |
önerilen | Oturumu kapatma tamamlandıktan sonra kullanıcının döndürülmesi gereken URL. Bu değer, uygulama için kaydedilen yeniden yönlendirme URI'lerinden biriyle eşleşmelidir. Dahil değilse, kullanıcıya Microsoft kimlik platformu tarafından genel bir ileti gösterilir. |
Sonraki adımlar
- Kodlamaya başlamak için MSAL JS örneklerinin üzerinden geçin.
- Yetkilendirme kodu akışını örtük vermenin daha yeni ve daha iyi bir alternatifi olarak gözden geçirin.