ميزات أداة Microsoft Graph
إنشاء مشروع في مركز إدارة Azure Active Directory
يجب إنشاء مشروع في مركز إدارة Azure Active Directory لمستخدم يمتلك حساب MS Office.
خطوات إنشاء مشروع في مركز إدارة Azure Active Directory
فيما يلي برنامج تعليمي خطوة بخطوة لإنشاء مشروع في مركز إدارة Azure Active Directory.
1. انتقل إلى Azure Active Directory وسجّل الدخول باستخدام بيانات اعتماد MS Office الخاصة بك.
Azure Active Directory الرابط - https://aad.portal.azure.com/
2. إنشاء تطبيق Azure AD في مستأجرك.
في اللوحة الجانبية اليسرى انقر على تسمية Azure Active Directory. سيفتح ذلك شريط Azure Active Directory. في تلك الشاشة يجب أن ترى تسمية تسجيلات التطبيقات. هذا هو نقطة البدء لتسجيل تطبيق Azure AD. سيمكنك هذا الشريط من إنشاء تطبيق جديد لـ Azure AD.
انقر على زر تسجيل جديد لإنشاء تطبيق جديد.

3. الآن سترى شريط تسجيل التطبيق الجديد.
- الاسم سيكون هذا اسم تطبيقك.
- أنواع الحسابات المدعومة سيقيد هذا القسم الوصول.
انقر زر تسجيل.

4. يجب أن ترى شريط التطبيقات المسجل حديثًا.
- معرف التطبيق (العميل) معرف تطبيقك.
- معرف الدليل (المستأجر) معرّف مستأجر Azure AD.

5. السماح بالأذونات لواجهة Microsoft Graph API.
انقر على تسمية أذونات API.
لقد منحك Azure بالفعل أذونات مفوضة User.Read لتطبيقك. سيسمح لنا هذا الإذن بقراءة معلومات المستخدم للمستخدم المسجل الدخول. هذه أذونات Microsoft Graph API، ويمكننا من ناحية أخرى تسميتها نطاقات.
القائمة الكاملة للنطاقات لواجهة Microsoft Graph API - https://docs.microsoft.com/en-us/graph/permissions-reference.
انقر على زر + إضافة إذن واختر Microsoft Graph.
انقر على الأذونات المفوضة. الآن ترى قائمة بالأذونات المتاحة لواجهة Microsoft Graph API.
حدد الأذونات المطلوبة، انقر زر إضافة الأذونات.
انقر زر منح موافقة المسؤول.

6. السماح بتدفقات العملاء العامة.
يحدد ما إذا كان التطبيق عميلًا عامًا. مناسب للتطبيقات التي تستخدم تدفقات منح الرموز ولا تستخدم URI لإعادة التوجيه.

7. إنشاء مفتاح للتطبيق

فئات المساعدة
الفئات المساعدة التالية مطلوبة لتشغيل الشيفرات في هذا القسم. هذه الفئات هي فقط لتبسيط العرض.
فئة AzureROPCTokenProvider
نسخة من IGraphClient الفئة تتعامل مع بناء الطلبات، وإرسالها إلى API Microsoft Graph، ومعالجة الردود. لإنشاء نسخة جديدة من هذه الفئة، تحتاج إلى توفير نسخة من ITokenProvider, والتي يمكنها مصادقة الطلبات إلى Microsoft Graph.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
/**
* <p>
* Azure resource owner password credential (ROPC) token provider
* https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth-ropc
* https://docs.microsoft.com/en-us/exchange/client-developer/exchange-web-services/how-to-authenticate-an-ews-application-by-using-oauth
* https://portal.azure.com
* https://developer.microsoft.com/en-us/graph/graph-explorer/#
* token parser https://jwt.io
* </p>
*/
class AzureROPCTokenProvider implements ITokenProvider {
private static final String GRANT_TYPE = "password";
private final String clientId;
private final String clientSecret;
private final String userName;
private final String password;
private final String tenant;
private final String scope;
private OAuthToken token;
public AzureROPCTokenProvider(String tenant, String clientId, String clientSecret,
String userName, String password, String[] scopeAr) {
this.tenant = tenant;
this.clientId = clientId;
this.clientSecret = clientSecret;
this.userName = userName;
this.password = password;
this.scope = joinToStr(scopeAr, " ");
}
public synchronized OAuthToken getAccessToken(boolean ignoreExistingToken) {
if (this.token != null && !this.token.getExpired() && !ignoreExistingToken)
return this.token;
token = null;
Map<String, String> tokenArgs = geToken();
java.util.Calendar c = java.util.Calendar.getInstance();
c.add(java.util.Calendar.SECOND, Integer.parseInt(tokenArgs.get("expires_in")));
token = new OAuthToken(tokenArgs.get("access_token"), TokenType.AccessToken, c.getTime());
return token;
}
public final OAuthToken getAccessToken() {
return getAccessToken(false);
}
public void dispose() {
}
private String getEncodedParameters() {
return "client_id=" + urlEncode(clientId) + "&scope=" + urlEncode(scope) + "&username=" + urlEncode(userName)
+ "&password=" + urlEncode(password) + "&grant_type="
+ urlEncode(GRANT_TYPE);
}
private String getUri() {
if (tenant == null || tenant.trim().isEmpty())
return "https://login.microsoftonline.com/common/oauth2/v2.0/token";
else
return "https://login.microsoftonline.com/" + tenant + "/oauth2/v2.0/token";
}
private Map<String, String> geToken() {
try {
HttpURLConnection connection = (HttpURLConnection) new URL(getUri()).openConnection();
connection.setRequestMethod("POST");
byte[] requestData = getEncodedParameters().getBytes(StandardCharsets.UTF_8);
connection.setUseCaches(false);
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setRequestProperty("Content-Length", "" + requestData.length);
final OutputStream st = connection.getOutputStream();
try {
st.write(requestData, 0, requestData.length);
} finally {
st.flush();
st.close();
}
connection.connect();
if (connection.getResponseCode() >= HttpURLConnection.HTTP_BAD_REQUEST) {
throw new IllegalAccessError("Operation failed: " + connection.getResponseCode() + "/" +
connection.getResponseMessage() + "\r\nDetails:\r\n{2}"
+ readInputStream(connection.getErrorStream()));
}
String responseText = readInputStream(connection.getInputStream());
Map<String, String> result = new HashMap<>();
String[] fromJsonToKeyValue = responseText.replace("{", "").replace("}", "")
.replace("\"", "").replace("\r", "")
.replace("\n", "").split(",");
for (String keyValue : fromJsonToKeyValue) {
String[] pair = keyValue.split(":");
String name = pair[0].trim().toLowerCase();
String value = urlDecode(pair[1].trim());
result.put(name, value);
}
return result;
} catch (IOException e) {
throw new IllegalAccessError(e.getMessage());
}
}
static String urlEncode(String value) {
try {
return URLEncoder.encode(value, StandardCharsets.UTF_8.toString());
} catch (UnsupportedEncodingException e) {
throw new IllegalAccessError(e.getMessage());
}
}
static String urlDecode(String value) {
try {
return URLDecoder.decode(value, StandardCharsets.UTF_8.toString());
} catch (UnsupportedEncodingException e) {
throw new IllegalAccessError(e.getMessage());
}
}
static String readInputStream(InputStream is) {
if (is == null)
return "";
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder result = new StringBuilder();
String line;
try {
while ((line = reader.readLine()) != null) {
result.append(line);
}
} catch (IOException e) {
// ignore
}
return result.toString();
}
static String joinToStr(String[] arr, String sep) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < arr.length; i++) {
if (i > 0)
sb.append(sep);
sb.append(arr[i]);
}
return sb.toString();
}
}