Aracılığıyla paylaş


Erişim belirteci alma (Python)

Bu örnekte, OAuth2 belirtecini almak için dış Python betiğini çağırma işlemi gösterilmektedir. Kimlik doğrulama temsilcisinin uygulanması için geçerli bir OAuth2 erişim belirteci gereklidir.

Önkoşullar

Örneği çalıştırmak için:

  • Python 3.10 veya üzerini yükleyin.
  • Projenizde utils.h/cpp uygulayın.
  • Auth.py projenize eklenmelidir ve derlemedeki ikili dosyalar ile aynı dizinde bulunmalıdır.
  • Microsoft Information Protection (MIP) SDK kurulumunu ve yapılandırmasını tamamlayın. Diğer görevler arasında, istemci uygulamanızı Microsoft Entra kiracınıza kaydedersiniz. Microsoft Entra Id, belirteç alma mantığınızda kullanılan istemci kimliği olarak da bilinen bir uygulama kimliği sağlar.

Bu kod üretim kullanımına yönelik değildir. Yalnızca geliştirme ve kimlik doğrulama kavramlarını anlamak için kullanılabilir. Örnek platformlar arasıdır.

örnek::auth::AcquireToken()

Basit kimlik doğrulama örneğinde parametre almamış ve sabit kodlanmış bir belirteç değeri döndüren basit AcquireToken() bir işlev gösterdik. Bu örnekte kimlik doğrulama parametrelerini kabul etmek için AcquireToken() öğesini aşırı yükleyeceğiz ve belirteci döndürmek için bir dış Python betiği çağıracağız.

auth.h

auth.h AcquireToken() dosyasında aşırı yüklenmiştir ve aşırı yüklenmiş işlev ile 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.
    }
}

İlk üç parametre kullanıcı girişi tarafından sağlanır veya uygulamanıza sabit kodlanmıştır. Son iki parametre SDK tarafından kimlik doğrulama temsilcisine sağlanır.

auth.cpp

auth.cpp aşırı yüklenmiş işlev tanımını ekleyip Python betiğini çağırmak için gereken kodu tanımlayacağız. işlevi, sağlanan tüm parametreleri kabul eder ve python betiğine geçirir. Betik yürütülü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 Betiği

Bu betik, kimlik doğrulama belirteçlerini doğrudan Python için Microsoft Authentication Library (MSAL) aracılığıyla alır. Bu kod yalnızca örnek uygulamalar tarafından kullanılmak üzere kimlik doğrulama belirteçleri alma aracı olarak dahil edilir ve üretimde kullanılmak üzere tasarlanmamıştır. Betik yalnızca düz eski kullanıcı adı/parola kimlik doğrulamasını destekleyen kiracılarda çalışır. Bu betik aracılığıyla MFA veya sertifika tabanlı kimlik doğrulaması desteklenmez.

Not

Bu örneği çalıştırmadan önce aşağıdaki komutlardan birini çalıştırarak Python için MSAL'yi yüklemeniz gerekir:

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üncelleştirme

Son olarak, aşırı yüklenmiş işlevi çağırmak için içindeki AuthDelegateImpl işlevini güncelleştirin.AcquireOAuth2TokenAcquireToken Kaynak ve yetkili URL'leri ve challenge.GetAuthority()okunarak challenge.GetResource() elde edilir. OAuth2Challenge, altyapı eklendiğinde kimlik doğrulama temsilcisine geçirilir. Bu iş SDK tarafından gerçekleştirilir ve geliştirici tarafında ek bir çalışma gerektirmez.

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;
}

engine eklendiğinde, SDK 'AcquireOAuth2Token işlevini çağırır, sınamayı geçirir, Python betiğini yürütür, bir belirteç alır ve ardından belirteci hizmete sunar.