JSPで行こう!

アクセストークンの取得

手順の確認

  1. 認可を依頼する URL を呼び出す。
  2. リダイレクト先に結果(認可コード)が返される。
  3. 「認可コードを」を使って、「アクセストークン」を取得する
  4. 「アクセストークン」から認可された情報を取得する
  5. 必要ならユーザー登録をする

前節で「認可コード」を取得しましたので、続いて Google からユーザー情報を取得する為に
さらに、「アクセストークン」を取得します。

なぜ、「認可コード」をそのまま使えないかと言えば、リダイレクト先が本当に要求した本人かどうか
まだ 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 というライブラリを使って解析していきます。

« 前頁 次頁 »