import java.io.;
import javax.servlet.;
import javax.servlet.http.*;
public class test{
// OAuth2 Parameters
private static String CLIENT_ID = “relyingparty”;
private static String CLIENT_SECRET = “P@ssw0rd”;
private static final String SSO_HOST = “https://test-cent.test.com:443/openam/”;
private static final String SCOPE = “openid profile”;
// openAM endpoint url
private static final String AUTHORIZATION_SERVER_URL = SSO_HOST + “oauth2/authorize”;
private static final String TOKEN_SERVER_URL = SSO_HOST + “oauth2/access_token”;
private static final String PROFILE_SERVER_URL = SSO_HOST + “oauth2/userinfo”;
}
// redirect url from openAM
// 認証サーバからリダイレクトで戻って来るURL。
// 結果を受け取るサーブレットがcallされるようにセットしてね。
// (事前にOpenAMのOAuthエージェントに設定したURLじゃないとだめ)
private static final String REDIRECT_URL = “https://localhost:8080/webservice/OAuthLogin/oauth2Callback”
//認可コード受け取りメソッド
public String oauth2Callback() {
// OpenAM が "code"という名前のパラメータをくれるので受け取る。
String code = ((String[])request.getParameterMap().get(“code”))
0;
//
TODO: codeがない場合の処理(直接たたいたとか)
// もらったcodeを使ってアクセストークンを取りに行くメソッドをたたく。
String accesstoken = OAuthUtil.getAccessToken(code);
// アクセストークンをセッションにでもつっこんでおくか。
commonDto.setAccessToken(accesstoken);
// アクセストークンを使ってユーザ情報を取ってくるぞ
UserDto user = OAuthUtil.getProfileData(accesstoken);
// 取ってきたユーザ情報をセッションに入れちゃう。
Beans.copy(user, userDto).execute();
userDto.setUserid(user.getSub());
userDto.setUsername(user.getName());
// 認証OK後の画面に遷移するぞ!
}
//アクセストークン取得メソッド
public static String getAccessToken(String code) {
// tokenを取得
TokenResponse tr = getTokenResponse(code);
return tr.getAccessToken();
}
private static TokenResponse getTokenResponse(String code) {
// アクセストークンをもらうためのURLを作る
AuthorizationCodeTokenRequest tokenUrl = new AuthorizationCodeTokenRequest(
HTTP_TRANSPORT,
JSON_FACTORY,
new GenericUrl(TOKEN_SERVER_URL),
code
);
tokenUrl.setGrantType(“authorization_code”);
tokenUrl.setRedirectUri(REDIRECT_URL);
tokenUrl.set(“client_id”, CLIENT_ID);
tokenUrl.set(“client_secret”, CLIENT_SECRET);
TokenResponse tr = null;
try {
tr = tokenUrl.execute();
} catch (IOException e) {
e.printStackTrace();
}
return tr;
}
//ユーザ情報取得メソッド
public static UserDto getProfileData(String accessToken) {
// profile情報をJSONで作るメソッドをキック
String data = getProfileJson(accessToken);
Gson gson = new Gson();
UserDto user = gson.fromJson(data, UserDto.class);
return user;
}
private static String getProfileJson(String accessToken) {
try {
// profile取得用エンドポイントにアクセスするURLを作る
URL url = new
URL;
// HTTP通信するぞ
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
// この辺は決まった形式。アクセストークンもこんな感じでOpenAMに渡す。
connection.setRequestProperty(“Authorization”, String.format(“Basic %s”, accessToken));
connection.setRequestProperty(“Content-Type”, “application/json”);
connection.setRequestProperty(“Accept”, “
/”);
connection.setRequestMethod(“
POST”);
connection.connect();
int responseCode = connection.getResponseCode();
//System.out.println("\nSending ‘
POST’ request to
URL : " + url);
//System.out.println("Response Code : " + responseCode);
switch(responseCode) {
case 200:
case 201:
// 戻ってくるのはJSON文字列。全部読み取って返すとか。
InputStream content = (InputStream) connection.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(content));
String line;
StringBuilder sb = new StringBuilder();
while ((line = in.readLine()) != null) {
//System.out.println("\n line : " + line);
sb.append(line+"\n");
}
in.close();
return sb.toString();
default:
return "";
}
} catch (Exception e) {
//
TODO: handle exception
e.printStackTrace();
return "";
}
}