Invocación de servicio OAuth 2.0

Un cliente de OAuth registrado puede invocar el punto final de autorización de servicio OAuth de WebSphere Application Server para solicitar una señal de acceso. 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 da soporte a los flujos siguientes.

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
Invoque el 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("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;
    }
  }
}

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("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) {
    // send Resource Request using the access token
  }
}

Flujo de credenciales de cliente

El cliente de OAuth accede al punto final de señal utilizando 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)	{
    //send Resource Request using (accessToken);
  }
}

Flujo de credenciales 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 y 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)	{
    //send Resource Request using (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)) {
      // 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);
      }
    }
  }
}

Icono que indica el tipo de tema Tema de concepto

Nombre de archivo: cwlp_oauth_invoking.html