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
oder
https://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
oder
https://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);
      }
    }
  }
}

Symbol das den Typ des Artikels anzeigt. Konzeptartikel

Dateiname: cwlp_oauth_invoking.html