OAuth 2.0 サービス呼び出し

登録済みの OAuth クライアントは WebSphere® Application Server OAuth サービス許可エンドポイントを呼び出して、アクセス・トークンを要求できます。 また、登録済みの OAuth クライアントは WebSphere Application Server OAuth サービス・トークン・エンドポイントを呼び出して、アクセス・トークンを要求することもできます。その後、クライアントはそのアクセス・トークンを使用して、保護された Web リソースを WebSphere Application Server に要求できます。

WebSphere Application Server OAuth 2.0 サービスでは、以下のフローがサポートされます。

許可コード・フロー

許可エンドポイントを呼び出して許可コードを要求します。
OAuth クライアントは、クライアント ID、クライアント秘密鍵、状態、リダイレクト URI、およびオプションのスコープを追加して、リソース所有者またはユーザーを WebSphere Application Server OAuth 2.0 許可サービスにリダイレクトします。
https://host_name:port_number/oauth2/endpoint/provider_name/authorize
または
https://host_name:port_number/oauth2/declarativeEndpoint/provider_name/authorize
OAuth トークン・エンドポイントを呼び出して、アクセス・トークンを要求します。
OAuth クライアントは、authorization_code 付与タイプ、authorization coderedirect_url、および client_id を要求パラメーターとして追加して、アクセス・トークンを WebSphere Application Server OAuth 2.0 トークン・エンドポイントに要求します。
https://host_name:port_number/oauth2/endpoint/provider_name/token
以下の例で、許可コードを使用した場合の URI の構成と、アクセス・トークンを使用した 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;
    }
  }
}

暗黙的付与のフロー

OAuth クライアントは、response_typeredirect_urlclient_idscope、および state を要求パラメーターとして追加して、アクセス・トークンを WebSphere Application Server OAuth 2.0 許可エンドポイントに要求します。
https://host_name:port_number/oauth2/endpoint/provider_name/authorize
または
https://host_name:port_number/oauth2/declarativeEndpoint/provider_name/authorize
以下の例で、暗黙的付与を使用した場合の URI の構成を示します。
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
  }
}

クライアント・クレデンシャルのフロー

OAuth クライアントは、クライアント ID およびクライアントの機密鍵を使用してトークン・エンドポイントにアクセスし、その後のリソース要求のためにアクセス・トークンを交換します。 このフローでは、クライアントは、client_credentials 付与タイプ、client_id、および client_secret を要求パラメーターとして追加することで、トークン・エンドポイントにアクセスします。
https://host_name:port_number/oauth2/endpoint/provider_name/token
以下の例で、クライアント・クレデンシャルを使用した場合の URI の構成を示します。
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);
  }
}

リソース所有者パスワード・クレデンシャルのフロー

リソース所有者パスワード・クレデンシャルのフローは、リソース所有者のユーザー ID とパスワードをトークン・エンドポイントに直接渡します。このフローでは、OAuth クライアントは、password 付与タイプ、client_idclient_secretusernamepasswordscope、および state を要求パラメーターとして追加することで、トークン・エンドポイントにアクセスします。
https://host_name:port_number/oauth2/endpoint/provider_name/token
以下の例で、リソース所有者パスワードを使用した場合の URI の構成を示します。
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);
  }
}
アクセス・トークンの有効期限が切れている場合は、リフレッシュ・トークンを送信して有効なアクセス・トークンを取得できます。以下の例で、リフレッシュ・トークンの送信方法を示します。
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);
      }
    }
  }
}

トピックのタイプを示すアイコン 概念トピック



タイム・スタンプ・アイコン 最終更新: Tuesday, 6 December 2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=cwlp_oauth_invoking
ファイル名: cwlp_oauth_invoking.html