code: private Response process(
              MultivaluedMap<String, String> parameters, String clientId,
              String clientSecret, String[] clientCertificatePath)
      {
          // Extra properties to associate with an access token.
          Property[] properties = mSpi.getProperties();
  
          String clientCertificate = null;
          if (clientCertificatePath != null && clientCertificatePath.length > 0)
          {
              // The first one is the client's certificate.
              clientCertificate = clientCertificatePath[0];
  
              // if we have more in the path, pass them along separately without the first one
              if (clientCertificatePath.length > 1)
              {
                  clientCertificatePath = Arrays.copyOfRange(
                          clientCertificatePath, 1, clientCertificatePath.length);
              }
          }
  
          // Call Authlete's /api/auth/token API.
          TokenResponse response = getApiCaller().callToken(
                  parameters, clientId, clientSecret, properties,
                  clientCertificate, clientCertificatePath);
  
          // 'action' in the response denotes the next action which
          // this service implementation should take.
          Action action = response.getAction();
  
          // The content of the response to the client application.
          String content = response.getResponseContent();
  
          // Dispatch according to the action.
          switch (action)
          {
              case INVALID_CLIENT:
                  // 401 Unauthorized
                  return ResponseUtil.unauthorized(content, CHALLENGE);
  
              case INTERNAL_SERVER_ERROR:
                  // 500 Internal Server Error
                  return ResponseUtil.internalServerError(content);
  
              case BAD_REQUEST:
                  // 400 Bad Request
                  return ResponseUtil.badRequest(content);
  
              case PASSWORD:
                  // Process the token request whose flow is "Resource Owner Password Credentials".
                  return handlePassword(response);
  
              case OK:
                  // 200 OK
                  return ResponseUtil.ok(content);
  
              default:
                  // This never happens.
                  throw getApiCaller().unknownAction("/api/auth/token", action);
          }
      }
docs: Process the parameters of the token request.