Fitur Utilitas Microsoft Graph
Membuat Proyek di Azure Active Directory Admin Center
Sebuah Proyek akan dibuat di pusat admin Azure Active Directory untuk pengguna yang memiliki akun MS Office.
Langkah-langkah Membuat Proyek di Azure Active Directory Admin Center
Berikut ini tutorial langkah demi langkah untuk membuat proyek di pusat admin Azure Active Directory.
1. Buka Azure Active Directory dan masuk menggunakan kredensial MS Office Anda.
Azure Active Directory Tautan - https://aad.portal.azure.com/
2. Buat Aplikasi Azure AD di penyewa Anda.
Di panel sisi kiri, klik label Azure Active Directory. Ini akan membuka bilah untuk Azure Active Directory. Di layar itu Anda akan melihat label App registrations. Ini adalah titik awal untuk mendaftarkan Aplikasi Azure AD. Bilah ini akan memungkinkan Anda membuat aplikasi baru untuk Azure AD.
Klik tombol New registration untuk membuat aplikasi baru.

3. Sekarang Anda akan melihat bilah pendaftaran aplikasi baru.
- Name Ini akan menjadi nama aplikasi Anda.
- Supported account types Bagian ini akan membatasi akses.
Klik tombol Register.

4. Anda akan melihat bilah aplikasi yang baru terdaftar.
- Application (client) ID ID aplikasi Anda.
- Directory (tenant) ID ID penyewa Azure AD.

5. Mengizinkan izin untuk Microsoft Graph API.
Klik label API permissions.
Azure telah memberikan Anda izin delegasi User.Read untuk aplikasi Anda. Izin ini akan memungkinkan kami membaca informasi pengguna untuk pengguna yang masuk. Ini adalah izin Microsoft Graph API, yang lain kami dapat menyebutnya sebagai Scopes.
Daftar lengkap scope untuk Microsoft Graph API - https://docs.microsoft.com/en-us/graph/permissions-reference.
Klik tombol + Add a permission dan pilih Microsoft Graph.
Klik Delegated permissions. Sekarang Anda melihat daftar izin yang tersedia untuk Microsoft Graph API.
Pilih izin yang diperlukan, klik tombol Add permissions.
Klik tombol Grant admin consent.

6. Izinkan alur klien publik.
Menentukan apakah aplikasi adalah klien publik. Sesuai untuk aplikasi yang menggunakan alur pemberian token yang tidak menggunakan URI pengalihan.

7. Buat kunci untuk aplikasi

Kelas Pembantu
Kelas pembantu berikut diperlukan untuk menjalankan kode di bagian ini. Kelas-kelas ini hanya untuk penyederhanaan demonstrasi.
Kelas AzureROPCTokenProvider
Sebuah instance dari IGraphClient kelas menangani pembuatan permintaan, mengirimnya ke API Microsoft Graph, dan memproses respons. Untuk membuat instance baru dari kelas ini, Anda perlu menyediakan sebuah instance dari ITokenProvider, yang dapat mengautentikasi permintaan ke 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();
}
}