Invocación del servicio OAuth 2.0

Un cliente de OAuth registrado puede invocar el punto final de autorización del servicio OAuth de WebSphere Application Server para solicitar un código de autorización. Un cliente de OAuth registrado también puede invocar el punto final de señal del servicio OAuth de WebSphere Application Server para solicitar una señal de acceso. A continuación, el cliente puede utilizar la señal de acceso para solicitar recursos web protegidos de WebSphere Application Server.

El servicio OAuth 2.0 de WebSphere Application Server soporta los cuatro flujos.

Flujo de código de autorización

Invocación del punto final de autorización para solicitar un código de autorización.
El cliente de OAuth redirige al propietario del recurso o al usuario al servicio de autorización OAuth 2.0 de WebSphere Application Server añadiendo su ID de cliente, el secreto del cliente, el estado, el URI de redirección y los ámbitos opcionales.
https://<nombre_host>:<número_puerto>/oauth2/endpoint/<nombre_proveedor>/authorize
o
https://<nombre_host>:<número_puerto>/oauth2/declarativeEndpoint/<nombre_proveedor>/authorize
Invocación del punto final de señal OAuth para solicitar una señal de acceso.
El cliente OAuth solicita una señal de acceso del punto final de señal OAuth 2.0 de WebSphere Application Server añadiendo el tipo de otorgamiento authorization_code, authorization_code, redirect_url y client_id como parámetros de la solicitud.
https://<nombre_host>:<número_puerto>/oauth2/endpoint/<nombre_proveedor>/token
El ejemplo siguiente muestra las construcciones de los URI cuando se utiliza el código de autorización y el uso de la señal de acceso para acceder a los recursos web:
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("Visite: " + s + "\ny otorgue permiso");
  System.out.print("Ahora especifique el código de OAuth que ha recibido en el URI de redirección:");
  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("el mensaje de respuesta es = " + con.getResponseMessage());
  // leer la salida del servidor
  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("la respuesta a la solicitud del recurso es = " + 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 ("el mensaje de respuesta a la solicitud del recurso es = " +  stringBuilder.toString());
    } else {
      isValidResponse = false;
    }
  }
}

Flujo de otorgamiento implícito

El cliente de OAuth solicita una señal de acceso del punto final de autorización de OAuth 2.0 de WebSphere Application Server response_type, redirect_url, client_id, scope y state de la señal como parámetros de solicitud.
https://<nombre_host>:<número_puerto>/oauth2/endpoint/<nombre_proveedor>/authorize
o
https://<nombre_host>:<número_puerto>/oauth2/declarativeEndpoint/<nombre_proveedor>/authorize
El ejemplo siguiente muestra la construcción del URI cuando se utiliza el otorgamiento implícito:
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("Visite: " + s + "\ny otorgue permiso");
  System.out.print("Ahora especifique la señal de acceso que ha recibido en el URI de redirección:");
  BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  accessToken = br.readLine();
  if (accessToken != null) {
    // enviar solicitud de recurso utilizando la señal de acceso
  }
}

Flujo de credenciales de cliente

El cliente de OAuth accede al punto final de señal con el ID y el secreto de cliente e intercambia una señal de acceso para las solicitudes de recursos futuras. En este flujo, el cliente accede al punto final de señal añadiendo el tipo de otorgamiento client_credentials, client_id y client_secret como parámetros de la solicitud.
https://<nombre_host>:<número_puerto>/oauth2/endpoint/<nombre_proveedor>/token
El ejemplo siguiente muestra la construcción del URI cuando se utiliza la credencial del cliente:
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)	{
    //enviar solicitud de recurso utilizando (accessToken);
  }
}

Flujo de contraseña del propietario del recurso

El flujo de credenciales de contraseña del propietario del recurso pasa el ID de usuario y la contraseña del propietario del recurso al punto final de la señal directamente. En este flujo, el cliente de OAuth accede al punto final de señal añadiendo el tipo de otorgamiento password, client_id, client_secret, username, password, scope, and state como parámetros de la solicitud.
https://<nombre_host>:<número_puerto>/oauth2/endpoint/<nombre_proveedor>/token
El ejemplo siguiente muestra la construcción del URI cuando se utiliza la contraseña del propietario del recurso:
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)	{
    //enviar solicitud de recurso utilizando (accessToken);
  }
}
Si la señal de acceso ha caducado, se puede enviar la señal de renovación para obtener una señal de acceso válida. En el ejemplo siguiente se muestra cómo enviar una señal de renovación:
if(isAccessToken) {
  if (this.accessToken != null) {
    if (!sendResourceRequest(this.accessToken)) {
      // la solicitud del recurso ha fallado...
      //obtener señal de renovación
      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);
      }
    }
  }
}

Icon that indicates the type of topic Concept topic



Timestamp icon Last updated: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=cwbs_oauthinvoking
File name: cwbs_oauthinvoking.html