Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu örnekte, OAuth 2.0 belirtecini almak için dış Python betiğini çağırma işlemi gösterilmektedir. Kimlik doğrulama temsilcisi uygulaması geçerli bir OAuth 2.0 erişim belirteci gerektirir.
Önkoşullar
Örneği çalıştırmak için:
- Python 3.10 veya üzerini yükleyin.
- Projenizde utils.h/cpp uygulayın.
-
auth.pyöğesini derleme sırasında, ikili dosyalarla aynı dizine projenize ekleyin. - tam Microsoft Information Protection (MIP) SDK kurulumu ve yapılandırması. Diğer görevler arasında, istemci uygulamanızı Microsoft Entra kiracınıza kaydedersiniz. Microsoft Entra ID, belirteç alma mantığınız için istemci kimliği olarak da bilinen bir uygulama kimliği sağlar.
Bu kod üretim kullanımına yönelik değildir. Bunu yalnızca geliştirme ve kimlik doğrulama kavramlarını anlamak için kullanın. Örnek, platformlar arasıdır.
örnek::auth::AcquireToken()
Basit kimlik doğrulama örneği, parametre içermeyen ve sabit kodlanmış bir belirteç değeri döndüren basit AcquireToken() bir işlevi gösterir. Bu örnek, kimlik doğrulama parametrelerini kabul etmek ve belirteci döndüren harici bir Python betiğini çağırmak için AcquireToken() öğesini aşırı yükler.
auth.h
auth.h dosyasında AcquireToken() aşırı yüklenmiştir. Aşırı yüklenmiş işlev ve güncelleştirilmiş parametreler aşağıdaki gibidir:
//auth.h
#include <string>
namespace sample {
namespace auth {
std::string AcquireToken(
const std::string& userName, //A string value containing the user's UPN.
const std::string& password, //The user's password in plaintext
const std::string& clientId, //The Azure AD client ID (also known as Application ID) of your application.
const std::string& resource, //The resource URL for which an OAuth2 token is required. Provided by challenge object.
const std::string& authority); //The authentication authority endpoint. Provided by challenge object.
}
}
Kullanıcı girişi veya uygulamanız ilk üç parametreyi sağlar. SDK, kimlik doğrulama temsilcisine son iki parametreyi sağlar.
auth.cpp
auth.cpp dosyası aşırı yüklenmiş işlev tanımını ekler ve ardından Python betiğini çağıran kodu tanımlar. İşlev, sağlanan tüm parametreleri kabul eder ve bunları Python betiğine geçirir. Betik çalışır ve belirteci dize biçiminde döndürür.
#include "auth.h"
#include "utils.h"
#include <fstream>
#include <functional>
#include <memory>
#include <string>
using std::string;
using std::runtime_error;
namespace sample {
namespace auth {
//This function implements token acquisition in the application by calling an external Python script.
//The Python script requires username, password, clientId, resource, and authority.
//Username, Password, and ClientId are provided by the user/developer
//Resource and Authority are provided as part of the OAuth2Challenge object that is passed in by the SDK to the AuthDelegate.
string AcquireToken(
const string& userName,
const string& password,
const string& clientId,
const string& resource,
const string& authority) {
string cmd = "python";
if (sample::FileExists("auth.py"))
cmd += " auth.py -u ";
else
throw runtime_error("Unable to find auth script.");
cmd += userName;
cmd += " -p ";
cmd += password;
cmd += " -a ";
cmd += authority;
cmd += " -r ";
cmd += resource;
cmd += " -c ";
// Replace <application-id> with the Application ID provided during your Azure AD application registration.
cmd += (!clientId.empty() ? clientId : "<application-id>");
string result = sample::Execute(cmd.c_str());
if (result.empty())
throw runtime_error("Failed to acquire token. Ensure Python is installed correctly.");
return result;
}
}
}
Python kodu
Bu betik, Python için Microsoft Authentication Library (MSAL) kullanarak kimlik doğrulama belirteçlerini doğrudan alır. Bu kod yalnızca örnek uygulamalar tarafından kullanılmak üzere kimlik doğrulama belirteçleri almak üzere dahil edilir ve üretimde kullanılmak üzere tasarlanmamıştır. Betik yalnızca kullanıcı adı/parola kimlik doğrulamasını destekleyen kiracılarda çalışır. Betik, çok faktörlü kimlik doğrulamasını (MFA) veya sertifika tabanlı kimlik doğrulamasını desteklemez.
Note
Bu örneği çalıştırmadan önce aşağıdaki komutlardan birini çalıştırarak Python için MSAL'yi yükleyin:
pip install msal
pip3 install msal
import getopt
import sys
import json
import re
from msal import PublicClientApplication
def printUsage():
print('auth.py -u <username> -p <password> -a <authority> -r <resource> -c <clientId>')
def main(argv):
try:
options, args = getopt.getopt(argv, 'hu:p:a:r:c:')
except getopt.GetoptError:
printUsage()
sys.exit(-1)
username = ''
password = ''
authority = ''
resource = ''
clientId = ''
for option, arg in options:
if option == '-h':
printUsage()
sys.exit()
elif option == '-u':
username = arg
elif option == '-p':
password = arg
elif option == '-a':
authority = arg
elif option == '-r':
resource = arg
elif option == '-c':
clientId = arg
if username == '' or password == '' or authority == '' or resource == '' or clientId == '':
printUsage()
sys.exit(-1)
# ONLY FOR DEMO PURPOSES AND MSAL FOR PYTHON
# This shouldn't be required when using proper auth flows in production.
if authority.find('common') > 1:
authority = authority.split('/common')[0] + "/organizations"
app = PublicClientApplication(client_id=clientId, authority=authority)
result = None
if resource.endswith('/'):
resource += ".default"
else:
resource += "/.default"
# *DO NOT* use username/password authentication in production system.
# Instead, consider auth code flow and using a browser to fetch the token.
result = app.acquire_token_by_username_password(username=username, password=password, scopes=[resource])
print(result['access_token'])
if __name__ == '__main__':
main(sys.argv[1:])
AcquireOAuth2Token Güncellemesi
Son olarak, AcquireOAuth2Token içindeki AuthDelegateImpl işlevini, aşırı yüklenmiş AcquireToken işlevini çağıracak şekilde güncelleyin. Kaynak ve yetkilendirme URL'lerini elde etmek için challenge.GetAuthority() ve challenge.GetResource() öğelerini okuyun. SDK, motoru eklediğinde OAuth2Challenge öğesini kimlik doğrulama temsilcisine geçirir. Bu SDK davranışı için geliştirici tarafından ek çalışma yapılması gerekmez.
bool AuthDelegateImpl::AcquireOAuth2Token(
const mip::Identity& /*identity*/,
const OAuth2Challenge& challenge,
OAuth2Token& token) {
//call our AcquireToken function, passing in username, password, clientId, and getting the resource/authority from the OAuth2Challenge object
string accessToken = sample::auth::AcquireToken(mUserName, mPassword, mClientId, challenge.GetResource(), challenge.GetAuthority());
token.SetAccessToken(accessToken);
return true;
}
SDK, engine öğesini eklediğinde AcquireOAuth2Token işlevini çağırır. İşlev sınamayı geçirir, Python betiğini çalıştırır, bir belirteç alır ve belirteci hizmete sunar.