Megosztás a következőn keresztül:


Hozzáférési jogkivonat beszerzése (Python)

Ez a példa bemutatja, hogyan hívhat meg egy külső Python-szkriptet OAuth2-jogkivonat beszerzéséhez. A hitelesítési meghatalmazott implementálásához érvényes OAuth2 hozzáférési jogkivonatra van szükség.

Előfeltételek

A minta futtatásához:

  • Telepítse a Python 3.10-et vagy újabbat.
  • Implementálja a utils.h/cpp fájlt a projektben.
  • Auth.py hozzá kell adni a projekthez, és ugyanabban a könyvtárban kell lenniük, mint a buildben lévő bináris fájlok.
  • Végezze el a Microsoft Information Protection (MIP) SDK beállítását és konfigurációját. A többi feladat mellett regisztrálod az ügyfélalkalmazást a Microsoft Entra-bérlőfiókban. A Microsoft Entra ID egy alkalmazásazonosítót, más néven ügyfél-azonosítót biztosít, amelyet a jogkivonat-beszerzési logika használ.

Ez a kód nem éles használatra készült. Csak a hitelesítési fogalmak fejlesztéséhez és megértéséhez használható. A mintaprogram platformfüggetlen.

minta::hitelesítés::AcquireToken()

Az egyszerű hitelesítési példában bemutattunk egy egyszerű AcquireToken() függvényt, amely nem vett fel paramétereket, és egy rögzített tokenértéket adott vissza. Ebben a példában túlterheljük a AcquireToken() paramétert a hitelesítési paraméterek elfogadásához, és meghívunk egy külső Python-szkriptet a jogkivonat visszaadásához.

auth.h

Az auth.h fájlban a AcquireToken() függvény túlterhelt, és a túlterhelt függvényhez tartozó frissített paraméterek a következők:

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

Az első három paramétert a felhasználói bemenet vagy az alkalmazásba beírt kemény kód biztosítja. Az utolsó két paramétert az SDK adja meg a hitelesítésszolgáltatónak.

auth.cpp

A auth.cpp hozzáadjuk a túlterhelt függvénydefiníciót, majd meghatározzuk a Python-szkript meghívásához szükséges kódot. A függvény elfogadja az összes megadott paramétert, és átadja őket a Python-szkriptnek. A szkript végrehajtódik, és visszaadja a token-t sztring formátumban.

#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-szkript

Ez a szkript közvetlenül a Pythonhoz készült Microsoft Authentication Library (MSAL) segítségével szerzi be a hitelesítési jogkivonatokat. Ez a kód csak a mintaalkalmazások által használt hitelesítési jogkivonatok beszerzésére szolgál, és nem éles környezetben való használatra szolgál. A szkript csak olyan bérlők ellen működik, amelyek támogatják az egyszerű régi felhasználónév/jelszó hitelesítést. Az MFA-t vagy a tanúsítványalapú hitelesítést ez a szkript nem támogatja.

Megjegyzés:

A minta futtatása előtt telepítenie kell a Pythonhoz készült MSAL-t az alábbi parancsok egyikének futtatásával:

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 frissítése

Végül frissítse a AcquireOAuth2Token függvényt AuthDelegateImpl a túlterhelt AcquireToken függvény meghívásához. Az erőforrás és a szolgáltató URL-címeit az olvasással challenge.GetResource() és challenge.GetAuthority() szerzik meg. A OAuth2Challenge motor hozzáadásakor a rendszer átadja a hitelesítési meghatalmazottnak. Ezt a munkát az SDK végzi, és nem igényel további munkát a fejlesztő részéről.

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

A hozzáadáskor az engine SDK meghívja a "AcquireOAuth2Token függvényt, átadja a feladatot, végrehajtja a Python-szkriptet, jogkivonatot kap, majd bemutatja a jogkivonatot a szolgáltatásnak.