Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Contoh ini menunjukkan cara memanggil skrip Python eksternal untuk mendapatkan token OAuth 2.0. Implementasi delegasi autentikasi memerlukan token akses OAuth 2.0 yang valid.
Prasyarat
Untuk menjalankan sampel:
- Instal Python 3.10 atau yang lebih baru.
- Terapkan utils.h/cpp dalam proyek Anda.
- Tambahkan
auth.pyke proyek Anda, di direktori yang sama dengan file biner saat build. - Selesaikan penyiapan dan konfigurasi SDK Microsoft Information Protection (MIP). Di antara tugas lain, Anda mendaftarkan aplikasi klien di penyewa Microsoft Entra Anda. Microsoft Entra ID menyediakan ID aplikasi, juga dikenal sebagai ID klien, untuk logika akuisisi token Anda.
Kode ini tidak ditujukan untuk penggunaan produksi. Gunakan hanya untuk pengembangan dan untuk memahami konsep autentikasi. Sampelnya adalah lintas platform.
sample::auth::AcquireToken()
Contoh autentikasi sederhana menunjukkan fungsi sederhana AcquireToken() yang tidak mengambil parameter dan mengembalikan nilai token yang dikodekan secara permanen. Contoh ini kelebihan beban AcquireToken() untuk menerima parameter autentikasi dan memanggil skrip Python eksternal untuk mengembalikan token.
auth.h
Dalam auth.h, AcquireToken() kelebihan beban. Fungsi yang kelebihan beban dan parameter yang diperbarui adalah sebagai berikut:
//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.
}
}
Input pengguna atau aplikasi Anda menyediakan tiga parameter pertama. SDK menyediakan dua parameter terakhir kepada delegasi autentikasi.
auth.cpp
File auth.cpp menambahkan definisi fungsi yang kelebihan beban, lalu menentukan kode yang memanggil skrip Python. Fungsi ini menerima semua parameter yang disediakan dan meneruskannya ke skrip Python. Skrip berjalan dan mengembalikan token dalam format string.
#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;
}
}
}
Skrip Python
Skrip ini memperoleh token autentikasi secara langsung dengan menggunakan Pustaka Autentikasi Microsoft (MSAL) untuk Python. Kode ini hanya disertakan untuk memperoleh token autentikasi untuk digunakan oleh aplikasi sampel dan tidak dimaksudkan untuk digunakan dalam produksi. Skrip hanya berfungsi terhadap penyewa yang mendukung autentikasi nama pengguna/kata sandi. Skrip tidak mendukung autentikasi multifaktor (MFA) atau autentikasi berbasis sertifikat.
Nota
Sebelum Anda menjalankan sampel ini, instal MSAL untuk Python dengan menjalankan salah satu perintah berikut:
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:])
Memperbarui AcquireOAuth2Token
Terakhir, perbarui fungsi AcquireOAuth2Token di AuthDelegateImpl untuk memanggil fungsi AcquireToken yang dipakai berlebih. Baca challenge.GetResource() dan challenge.GetAuthority() untuk mendapatkan URL sumber daya dan otoritas. SDK meneruskan OAuth2Challenge ke delegasi autentikasi saat menambahkan mesin. Perilaku SDK ini tidak memerlukan pekerjaan tambahan dari pengembang.
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;
}
Ketika SDK menambahkan engine, SDK memanggil AcquireOAuth2Token fungsi . Fungsi melewati tantangan, menjalankan skrip Python, menerima token, dan menyajikan token ke layanan.