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 code、redirect_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_type、redirect_url、client_id、scope、および 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_id、client_secret、username、password、scope、および 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);
}
}
}
}