Các tính năng tiện ích Microsoft Graph
Tạo dự án trong Azure Active Directory Admin Center
Một dự án sẽ được tạo trên trung tâm quản trị Azure Active Directory cho người dùng có tài khoản MS Office.
Các bước để Tạo dự án trong Azure Active Directory Admin Center
Dưới đây là hướng dẫn bước từng bước để tạo dự án trong trung tâm quản trị Azure Active Directory.
1. Đi tới Azure Active Directory và đăng nhập bằng thông tin tài khoản MS Office của bạn.
Azure Active Directory Link - https://aad.portal.azure.com/
2. Tạo một Ứng dụng Azure AD trong tenant của bạn.
Trong bảng bên trái, nhấp vào nhãn Azure Active Directory. Điều này sẽ mở blade cho Azure Active Directory. Trong màn hình đó, bạn sẽ thấy nhãn App registrations. Đây là điểm khởi đầu để đăng ký một Ứng dụng Azure AD. Blade này sẽ cho phép bạn tạo một ứng dụng mới cho Azure AD.
Nhấn nút New registration để tạo một ứng dụng mới.

3. Bây giờ bạn sẽ thấy blade đăng ký ứng dụng mới.
- Name Đây sẽ là tên của ứng dụng của bạn.
- Supported account types Phần này sẽ giới hạn quyền truy cập.
Nhấn nút Register.

4. Bạn sẽ thấy blade các ứng dụng vừa đăng ký.
- Application (client) ID Id của ứng dụng của bạn.
- Directory (tenant) ID Id của tenant Azure AD.

5. Cấp quyền cho Microsoft Graph API.
Nhấn vào nhãn API permissions.
Azure đã cấp cho bạn quyền User.Read được ủy quyền cho ứng dụng của bạn. Quyền này sẽ cho phép chúng ta đọc thông tin người dùng đã đăng nhập. Đây là các quyền Microsoft Graph API, hay còn gọi là Scopes.
Danh sách đầy đủ các phạm vi (scopes) cho Microsoft Graph API - https://docs.microsoft.com/en-us/graph/permissions-reference.
Nhấn nút + Add a permission và chọn Microsoft Graph.
Nhấn vào Delegated permissions. Bây giờ bạn sẽ thấy danh sách các quyền có sẵn cho Microsoft Graph API.
Chọn các quyền cần thiết, nhấn nút Add permissions.
Nhấn nút Grant admin consent.

6. Cho phép luồng client công cộng.
Xác định liệu ứng dụng là client công cộng hay không. Thích hợp cho các ứng dụng sử dụng luồng cấp token mà không dùng redirect URI.

7. Tạo khóa cho ứng dụng

Các Lớp Trợ Giúp
Các lớp trợ giúp sau đây cần thiết để chạy mã trong phần này. Những lớp này chỉ để đơn giản hoá việc minh họa.
Lớp AzureROPCTokenProvider
Một thể hiện của IGraphClient lớp xử lý việc xây dựng yêu cầu, gửi chúng tới Microsoft Graph API và xử lý các phản hồi. Để tạo một thể hiện mới của lớp này, bạn cần cung cấp một thể hiện của ITokenProvider, có thể xác thực các yêu cầu tới 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();
}
}