Vlastnosti nástrojů Microsoft Graph
Vytvoření projektu v Azure Active Directory Admin Center
Projekt je třeba vytvořit v Azure Active Directory admin centru pro uživatele s účtem MS Office.
Kroky k vytvoření projektu v Azure Active Directory Admin Center
Následuje krok za krokem návod na vytvoření projektu v Azure Active Directory admin centru.
1. Přejděte do Azure Active Directory a přihlaste se pomocí svých MS Office přihlašovacích údajů.
Azure Active Directory Odkaz - https://aad.portal.azure.com/
2. Vytvořte Azure AD aplikaci ve vašem tenantovi.
V levém sloupci klikněte na štítek Azure Active Directory. Otevře se panel pro Azure Active Directory. Na této obrazovce byste měli vidět štítek App registrations. Toto je výchozí bod pro registraci Azure AD aplikace. Tento panel vám umožní vytvořit novou aplikaci pro Azure AD.
Klikněte na tlačítko New registration pro vytvoření nové aplikace.

3. Nyní uvidíte panel registrace nové aplikace.
- Name Bude to název vaší aplikace.
- Supported account types Tato sekce omezí přístup.
Klikněte na tlačítko Register.

4. Měli byste vidět panel nově registrovaných aplikací.
- Application (client) ID ID vaší aplikace.
- Directory (tenant) ID ID tenantu Azure AD.

5. Povolení oprávnění pro Microsoft Graph API.
Klikněte na štítek API permissions.
Azure vám již poskytlo delegované oprávnění User.Read pro vaši aplikaci. Toto oprávnění nám umožní číst informace o přihlášeném uživateli. Jedná se o oprávnění Microsoft Graph API, která lze také označit jako Scopes.
Kompletní seznam rozsahů (scopes) pro Microsoft Graph API - https://docs.microsoft.com/en-us/graph/permissions-reference.
Klikněte na tlačítko + Add a permission a vyberte Microsoft Graph.
Klikněte na Delegated permissions. Nyní vidíte seznam oprávnění dostupných pro Microsoft Graph API.
Vyberte požadovaná oprávnění, klikněte na tlačítko Add permissions.
Klikněte na tlačítko Grant admin consent.

6. Povolit toky veřejných klientů.
Určuje, zda je aplikace veřejný klient. Vhodné pro aplikace používající token grant toky, které nevyužívají redirect URI.

7. Vytvořte klíč pro aplikaci

Pomocné třídy
Následující pomocné třídy jsou vyžadovány pro spuštění kódu v této sekci. Tyto třídy slouží jen k zjednodušení demonstrace.
Třída AzureROPCTokenProvider
Instance třídy IGraphClient třída zpracovává tvorbu požadavků, jejich odesílání na Microsoft Graph API a zpracování odpovědí. Pro vytvoření nové instance této třídy musíte poskytnout instanci ITokenProvider, které mohou autentizovat požadavky na 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();
}
}