Aufruf des OAuth20-Service
Ein registrierter OAuth-Client kann den Berechtigungsendpunkt des OAuth-Service von WebSphere Application Server aufrufen, um ein Zugriffstoken anzufordern. Außerdem kann ein registrierter OAuth-Client den Tokenendpunkt des OAuth-Service von WebSphere Application Server aufrufen, um ein Zugriffstoken anzufordern. Anschließend kann der Client das Zugriffstoken verwenden, um geschützte Webressourcen von WebSphere Application Server anzufordern.
Der OAuth20-Service von WebSphere Application Server unterstützt die folgenden Abläufe.
Berechtigungscodeablauf
Rufen Sie den
Berechtigungsendpunkt auf, um einen Berechtigungscode anzufordern.
Der OAuth-Client leitet den Ressourceneigner oder Benutzer an den OAuth-2.0-Berechtigungsservice von WebSphere Application Server
um, indem er seine Client-ID, seinen geheimen Clientschlüssel, seinen Status, seinen Umleitungs-URI und die optionalen Geltungsbereiche hinzufügt.
https://Hostname:Portnummer/oauth2/endpoint/Providername/authorize
oderhttps://Hostname:Portnummer/oauth2/declarativeEndpoint/Providername/authorize
Rufen
Sie den OAuth-Tokenendpunkt auf, um ein Zugriffstoken anzufordern.
Der OAuth-Client fordert ein Zugriffstoken vom OAuth-2.0-Tokenendpunkt von WebSphere Application
Server an, indem er den Grant-Typ authorization_code,
redirect_url und client_id als Anforderungsparameter hinzufügt.
https://Hostname:Portnummer/oauth2/endpoint/Providername/token
Im folgenden Beispiel werden die Zusammenstellungen der URIs bei Verwendung des Berechtigungscodes und die Verwendung
des Zugriffstokens für den Zugriff auf Webressourcen veranschaulicht:
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());
// read the output from the server
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;
}
}
}
Ablauf mit implizitem Grant
Der OAuth-Client fordert ein Zugriffstoken vom OAuth-2.0-Berechtigungsendpunkt von WebSphere Application Server an, indem er response_type, redirect_url, client_id, scope und state für das Token als Anforderungsparameter hinzufügt.https://Hostname:Portnummer/oauth2/endpoint/Providername/authorize
oderhttps://Hostname:Portnummer/oauth2/declarativeEndpoint/Providername/authorize
Im folgenden
Beispiel wird die Zusammenstellung des URI bei der Verwendung von implizitem Grant veranschaulicht:
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 mithilfe des Zugriffstokens senden
}
}
Ablauf mit Clientberechtigungsnachweisen
Der OAuth-Client greift mit seiner Client-ID und seinem geheimen Schlüssel auf den Tokenendpunkt zu und fordert für künftige Ressourcenanforderungen ein Zugriffstoken an. In diesem Ablauf 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 die Zusammenstellung des URI bei der Verwendung von Clientberechtigungsnachweisen veranschaulicht:
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) {
// Ressourcenanforderung mit (accessToken) senden;
}
}
Ablauf mit dem Kennwort des Ressourceneigners
Beim Ablauf mit dem Kennwortberechtigungsnachweis des Ressourceneigners werden die Benutzer-ID und das Kennwort des Ressourceneigners direkt an den Tokenendpunkt übergeben. In diesem Ablauf 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 die Zusammenstellung des URI bei der Verwendung des Ressourceneignerkennworts veranschaulicht:
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) {
// Ressourcenanforderung mit (accessToken) senden;
}
}
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)) {
// resource request failed...
//get refresh token
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);
}
}
}
}