OAuth-2.0-Service aufrufen
Ein registrierter OAuth-Client kann den Berechtigungsendpunkt des OAuth-Service von WebSphere Application Server aufrufen, um einen Berechtigungscode anzufordern. Ein registrierter OAuth-Client kann auch den Tokenendpunkt des OAuth-Service von WebSphere Application Server aufrufen, um einen Zugriffstoken anzufordern. Anschließend kann der Client den Zugriffstoken verwenden, um geschützte Webressourcen von WebSphere Application Server anzufordern.
Der OAuth-2.0-Service von WebSphere Application Server unterstützt alle vier Abläufe.
Verarbeitungsablauf für Berechtigungscode
Aufruf des
Berechtigungsendpunkts zur Anforderung des Berechtigungscodes.
Der OAuth-Client leitet
den Ressourceneigner oder Benutzer an den OAuth-2.0-Berechtigungsservice (Authorization Service) von
WebSphere Application Server weiter, indem er seine Client-ID, den geheimen
Clientschlüssel, den Status, den Umleitungs-URI und die optionalen Geltungsbereiche hinzufügt.
https://<Hostname>:<Portnummer>/oauth2/endpoint/<Providername>/authorize
oderhttps://<Hostname>:<Portnummer>/oauth2/declarativeEndpoint/<Providername>/authorize
Aufruf des
OAuth-Tokenendpunkts zur Anforderung eines Zugriffstokens.
Der OAuth-Client fordert vom
OAuth-2.0-Tokenendpunkt von
WebSphere Application
Server einen Tokenendpunkt an, indem er den
Grant-Typ
authorization_code,
authorization code, redirect_url und
client_id als Anforderungsparameter hinzufügt.
https://<Hostname>:<Portnummer>/oauth2/endpoint/<Providername>/token
Im folgenden
Beispiel
ist der Aufbau der URIs dargestellt, wenn Berechtigungscode verwendet wird, und die Verwendung des Zugriffstokens für den
Zugriff auf die Webressourcen.
String charset = "UTF-8";
String param1 = "code";
if (isAuthorizationCode){
String query = String.format("response_type=%s&
client_id=%s&
client_secret=%s&
state=%s&
redirect_uri=%s&
scope=%s",
URLEncoder.encode(param1, charset),
URLEncoder.encode(clientId, charset),
URLEncoder.encode(clientSecret, charset),
URLEncoder.encode(state, charset),
URLEncoder.encode(redirectURI, charset),
URLEncoder.encode(scope, charset));
String s = authorizationEndPoint + "?" + query;
System.out.println("Visit: " + s + "\nand grant permission");
System.out.print("Now enter the OAuth code you have received in redirect uri :");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String code = br.readLine();
param1 = "authorization_code";
query = String.format("grant_type=%s&
code=%s&
client_id=%s&
client_secret=%s&
state=%s&
redirect_uri=%s&
scope=%s",
URLEncoder.encode(param1, charset),
URLEncoder.encode(code, charset),
URLEncoder.encode(clientId, charset),
URLEncoder.encode(clientSecret, charset),
URLEncoder.encode(state, charset),
URLEncoder.encode(redirectURI, charset),
URLEncoder.encode(scope, charset));
URL url = new URL(tokenEndPoint);
HttpsURLConnection con = (HttpsURLConnection)url. openConnection();
con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=" + charset);
con.setDoOutput(true);
con.setRequestMethod("POST");
OutputStream output = null;
try {
output = con.getOutputStream();
output.write(query.getBytes(charset));
output.flush();
} finally {
if (output != null) try {
output.close();
} catch (IOException logOrIgnore) {}
}
con.connect();
System.out.println("response message is = " + con.getResponseMessage());
// Ausgabe vom Server lesen
BufferedReader reader = null;
StringBuilder stringBuilder;
reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
stringBuilder = new StringBuilder();
String line = null;
try {
while ((line = reader.readLine()) != null) {
stringBuilder.append(line + "\n");
}
} finally {
if (reader != null) try {
reader.close();
} catch (IOException logOrIgnore) {}
}
String tokenResponse = stringBuilder.toString();
System.out.println ("response is = " + tokenResponse);
JSONObject json = JSONObject.parse(tokenResponse);
if (json.containsKey("access_token")) {
accessToken = (String)json.get("access_token");
this.accessToken = accessToken;
}
if (json.containsKey("refresh_token")) {
refreshToken = (String)json.get("refresh_token");
}
//sendRequestForAccessToken(query);
if (accessToken != null) {
String query = String.format("access_token=%s",
URLEncoder.encode(accessToken, charset));
URL urlResource = new URL(resourceEndPoint);
HttpsURLConnection conn = (HttpsURLConnection) urlResource.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-type", "application/x-www-form-urlencoded");
conn.setDoOutput(true);
output = null;
try {
output = conn.getOutputStream();
output.write(query.getBytes(charset));
output.flush();
} finally {
if (output != null) try {
output.close();
} catch (IOException logOrIgnore) {}
}
conn.connect();
System.out.println("response to the resource request is = " + conn.getResponseMessage ());
reader = null;
if(conn.getResponseCode()>=200 && conn.getResponseCode() < 400) {
reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
stringBuilder = new StringBuilder();
String line = null;
try {
while ((line = reader.readLine()) != null) {
stringBuilder.append(line + "\n");
}
} finally {
if (reader != null) try {
reader.close();
} catch (IOException logOrIgnore) {}
}
System.out.println ("response message to the request resource is = " + stringBuilder.toString());
} else {
isValidResponse = false;
}
}
}
Verarbeitungsablauf für impliziten Grant
Der OAuth-Client fordert einen Zugriffstoken vom OAuth-2.0-Berechtigungsendpunkt von WebSphere Application Server an, indem er das Token response_type, redirect_url, client_id, scope und state als Anforderungsparameter hinzufügt.https://<Hostname>:<Portnummer>/oauth2/endpoint/<Providername>/authorize
oderhttps://<Hostname>:<Portnummer>/oauth2/declarativeEndpoint/<Providername>/authorize
Im folgenden Beispiel wird der Aufbau des URI gezeigt, wenn ein impliziter Grant verwendet wird:
if (isImplicit) {
param1 = "token";
String query = String.format("response_type=%s&
client_id=%s&
state=%s&
redirect_uri=%s&
scope=%s",
URLEncoder.encode(param1, charset),
URLEncoder.encode(clientId, charset),
URLEncoder.encode(state, charset),
URLEncoder.encode(redirectURI, charset),
URLEncoder.encode(scope, charset));
String s = authorizationEndPoint + "?" + query;
System.out.println("Visit: " + s + "\nand grant permission");
System.out.print("Now enter the access token you have received in redirect uri :");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
accessToken = br.readLine();
if (accessToken != null) {
// Ressourcenanforderung (Resource Request) mit Zugriffstoken senden
}
}
Verarbeitungsablauf für Clientberechtigungsnachweise
Der OAuth-Client greift mit der Client-ID und dem geheimen Schlüssel auf den Tokenendpunkt zu und erhält ein Zugriffstoken für künftige Ressourcenanforderungen. In diesem Verarbeitungsablauf greift der Client auf den Tokenendpunkt zu, indem er den Grant-Typ client_credentials, client_id und client_secret als Anforderungsparameter hinzufügt.https://<Hostname>:<Portnummer>/oauth2/endpoint/<Providername>/token
Im folgenden Beispiel wird der Aufbau des URI gezeigt, wenn
ein Clientberechtigungsnachweis verwendet wird:
if (isClientCredentials){
param1 = "client_credentials";
String query = String.format("grant_type=%s&
scope=%s&
client_id=%s&
client_secret=%s",
URLEncoder.encode(param1, charset),
URLEncoder.encode(scope, charset),
URLEncoder.encode(clientId, charset),
URLEncoder.encode(clientSecret, charset));
accessToken = sendRequestForAccessToken(query);
if (accessToken != null) {
//send Resource Request using (accessToken);
}
}
Verarbeitungsablauf für Kennwort des Ressourceneigners
Im Verarbeitungsablauf für Kennwortberechtigungsnachweise des Ressourceneigners werden die Benutzer-ID und das Kennwort des Ressourceneigners direkt an den Tokenendpunkt übergeben. In diesem Verarbeitungsablauf greift der OAuth-Client auf den Tokenendpunkt zu, indem er den Grant-Typ password, client_id, client_secret, username, password, scope und state als Anforderungsparameter hinzufügt.https://<Hostname>:<Portnummer>/oauth2/endpoint/<Providername>/token
Im folgenden Beispiel
wird der Aufbau des URI gezeigt, wenn das Kennwort des Ressourceneigners
verwendet wird:
if (isResourceOwnerCredentials) {
param1 = "password";
String query = String.format("grant_type=%s&
username=%s&
password=%s&
scope=%s&
client_id=%s&
client_secret=%s",
URLEncoder.encode(param1, charset),
URLEncoder.encode(resOwnerName, charset),
URLEncoder.encode(resOwnerPassword, charset),
URLEncoder.encode(scope, charset),
URLEncoder.encode(clientId, charset),
URLEncoder.encode(clientSecret, charset));
accessToken = sendRequestForAccessToken(query);
if (accessToken != null) {
//send Resource Request using (accessToken);
}
}
Wenn das Zugriffstoken abgelaufen ist, kann
das Aktualisierungstoken gesendet werden, um ein gültiges Zugriffstoken abzurufen.
Im folgenden Beispiel wird gezeigt, wie ein Aktualisierungstoken gesendet wird:
if(isAccessToken) {
if (this.accessToken != null) {
if (!sendResourceRequest(this.accessToken)) {
// Ressourcenanforderung fehlgeschlagen....
//Aktualisierungstoken anfordern
param1 = "refresh_token";
String query = String.format("grant_type=%s&
client_id=%s&
client_secret=%s&
refresh_token=%s&
scope=%s",
URLEncoder.encode(param1, charset),
URLEncoder.encode(clientId, charset),
URLEncoder.encode(clientSecret, charset),
URLEncoder.encode(this.refreshToken, charset),
URLEncoder.encode(scope, charset));
accessToken = sendRequestForAccessToken(query);
if (accessToken != null) {
sendResourceRequest(accessToken);
}
}
}
}