前節で「認可コード」を取得しましたので、続いて Google からユーザー情報を取得する為に
さらに、「アクセストークン」を取得します。
「シークレット」は利用者からは見られない場所で管理します。
手順3の処理は、JSP だけでは一度に出来ません。次の2つのライブラリを使います。
リダイレクトされたJSPの中でさらにアクセストークンを取得するには、
処理の中で http 通信を行わなければなりません。
ここでは、汎用性を考えて Apache プロジェクトの httpclient を使う事にします。
以下が JSP で書いた例です。
httpclient を使いますので、若干複雑そうに見えるかもしれません。
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ page import="java.util.*"%>
<%@ page import="java.io.*"%>
<%@ page import="org.apache.http.*"%>
<%@ page import="org.apache.http.client.*"%>
<%@ page import="org.apache.http.client.entity.*"%>
<%@ page import="org.apache.http.client.methods.*"%>
<%@ page import="org.apache.http.impl.client.*"%>
<%@ page import="org.apache.http.message.*"%>
<%@ page import="org.apache.http.util.*"%>
<%@ include file="oauth2_env.jsp"%>
<%
request.setCharacterEncoding("UTF-8");
String me = "auth_redirect.jsp";
// 「認可コード」が渡される
String code = (String)request.getParameter("code");
// アクセストークンの取得
String access_token = oauth.getAccessToken(
"https://accounts.google.com/o/oauth2/token"
, CLIENT_ID
, CLIENT_SECRET
, code
, MY_APP_URL + me
);
// 後で使う為に、とりあえずセッション変数に格納
session.setAttribute("access_token", access_token );
%>
<!doctype html>
<html>
<body>
<p>認可コード:<%=code%></p>
<p>AccessToken:<%=access_token%></p>
</body>
</html>
<%!
private static String getAccessToken(
String url
, String client_id
, String client_secret
, String code
, String redirect_uri
) {
String body = "";
ArrayList<NameValuePair> formparams = new ArrayList<NameValuePair>();
formparams.add( new BasicNameValuePair("grant_type","authorization_code"));
formparams.add( new BasicNameValuePair("client_id",client_id));
formparams.add( new BasicNameValuePair("client_secret",client_secret));
formparams.add( new BasicNameValuePair("code",code));
formparams.add( new BasicNameValuePair("redirect_uri",redirect_uri));
UrlEncodedFormEntity form_entity = new UrlEncodedFormEntity(formparams, Consts.UTF_8);
HttpPost postRequest = new HttpPost(url);
postRequest.setEntity(form_entity);
CloseableHttpClient httpclient = HttpClients.createDefault();
try {
CloseableHttpResponse response = httpclient.execute( postRequest );
if(response.getStatusLine().getStatusCode() != 200 ){
body = "Error:" + response.getStatusLine().getStatusCode();
return body;
}
HttpEntity entity = response.getEntity();
if (entity != null) {
body = EntityUtils.toString(entity);
}
return body;
} catch (ClientProtocolException e) {
} catch (IOException e) {
}
return null;
}
%>
コードを少し見やすくする為、アクセストークンの取得処理はメソッドにしています。
上記で、メソッドは純粋に java のコードそのものです。
メソッド内は手順に従ってコーディングしていかなければならないので、プログラムは少し長くなっていますが、
複雑な処理を行っている訳ではなく、html の FORM で POST する操作を httpclient で行っているだけです。
ここでは、無理に jap に埋め込んでいますが、後々は java の class にするほうがスッキリします。
POST した結果として返される情報を見ると判りますが、javascript のオブジェクトのような文字列になっています。
この中に、アクセストークンが含まれます。
このように、google からの応答は html では無く、JSON形式で返ってきます。
(content-type が"text/html"ではなく、"application/json")
JSON形式は単なる文字列ですから、簡単なものは自力で解析できない事も無いのですが、
JSON形式はこれからいろいろな場面で使われますので、ここは Jackson というライブラリを使って解析していきます。
| « 前頁 | 次頁 » |