前回も書きましたが、GAE/J上ではSocketが使えない。故にopenid4javaはGAEでは使えない。

でも、dyuprojectは動くし、動かした上にコードを公開されている方もいる。

どうやらGAE/Jの URLフェッチ API を使っている模様。そりゃそれしか方法はないですよね。

私は職業プログラマでは無いので、車輪の再開発どころか、なるべくコードは書きたくないんです。

早速、dyprojectにトライしてみましょう。

 

 


dyuproject-openid-1.1.6-jarjar.jar のダウンロード

dyuprojectDownloadsから、dyuproject-1.1.6.zipをダウンロードします。

JavaDocとか他のライブラリとかデモが不要なら、dyuproject-openid-1.1.6-jarjar.jar でもいいです。

 

 


eclipseのGAEプロジェクトへライブラリを追加する

ダウンロードしたzipファイルの、/dist に、dyuproject-openid-1.1.6-jarjar.jar はあります。

それを、eclipse の /war/WEB-INF/lib/にコピーします。

eclipseを起動して、war/WEB-INF/lib/ の下にコピーしたjarファイルを右クリックして、[ビルド・バス(B)] – [ビルド・パスに追加(A)]をクリックします。

念のため、プロジェクトの[参照ライブラリー]に追加されている事を確認します。

 

 


/WEB-INF/web.xml に追記する

QuickStartOpenid – dyuprojectのんを参考にしながら書きます。

ちょっとだけ手を加え (ログアウト用サーブレットを追加とか) ましたが、基本的に同じです。

<filter>
    <filter-name>openid-filter</filter-name>
    <filter-class>com.dyuproject.openid.OpenIdServletFilter</filter-class>
    <init-param>
        <param-name>forwardUri</param-name>
        <param-value>/</param-value> 
    </init-param>
</filter> 

<filter-mapping>
    <filter-name>openid-filter</filter-name>
    <url-pattern>/openid-login</url-pattern>
</filter-mapping>

<filter-mapping>
    <filter-name>openid-filter</filter-name>
    <url-pattern>/openid-logout</url-pattern>
</filter-mapping>

<servlet>
    <servlet-name>openid-servlet</servlet-name>
    <servlet-class>my.package.OpenIdLoginServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>openid-servlet</servlet-name>
    <url-pattern>/openid-login</url-pattern>
</servlet-mapping>

<servlet>
    <servlet-name>openid-logout</servlet-name>
    <servlet-class>my.package.OpenIdLogoutServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>openid-logout</servlet-name>
    <url-pattern>/openid-logout</url-pattern>
</servlet-mapping>

ログイン用サーブレットを作る

QuickStartOpenid – dyuprojectのサンプルコードにほんに少しだけ異常系を付け足しただけです。

package my.package;

import com.dyuproject.openid.RelyingParty;
import com.dyuproject.openid.ext.AxSchemaExtension;
import com.dyuproject.openid.OpenIdUser;

public class OpenIdLoginServlet extends HttpServlet {

    static {
        RelyingParty.getInstance()
        .addListener(new AxSchemaExtension()
            .addExchange("email")
            .addExchange("nickname")
            .addExchange("fullname")
            .addExchange("gender")
            .addExchange("postcode")
            .addExchange("country")
            .addExchange("language")
        );
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException
    {
        doPost(request, response);
    }
    
    public void doPost(HttpServletRequest request, HttpServletResponse response)
        throws IOException, ServletException
    {
        OpenIdUser user = (OpenIdUser) request.getAttribute(OpenIdUser.ATTR_NAME);
        if (user != null) {
            String identity = user.getIdentity();
            HttpSession session = request.getSession();
            session.setAttribute("identity", identity);
            Map<String,String> axschema = AxSchemaExtension.get(user);
            if (axschema != null && axschema.size() > 0) {
                session.setAttribute("email", axschema.get("email"));
                session.setAttribute("nickname", axschema.get("nickname"));
            } else {
                session.setAttribute("email", "unknown");
                session.setAttribute("nickname", identity);
            }
        } else {
            //
        }
        response.sendRedirect(response.encodeRedirectURL(request.getParameter("redirect_url")));
    }

}

 

 


ログアウト用サーブレットを作る

QuickStartOpenid – dyuprojectにはサンプルが無かったけど、ログインしっぱなしじゃ困るから、ログアウト用サーブレットも作ります。

package my.package;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;
import javax.servlet.http.HttpSession;
import javax.servlet.RequestDispatcher;

public class OpenIdLogoutServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException
    {
        doPost(request, response);
    }
    
    public void doPost(HttpServletRequest request, HttpServletResponse response)
        throws IOException, ServletException
    {
        HttpSession session = request.getSession(false);
        session.invalidate();
        response.sendRedirect(response.encodeRedirectURL(request.getParameter("redirect_url")));

    }
}

 

 


動かす

あとはHTMLでいいので、OpenIDプロバイダのURLを引数 “openid_identifier”にセットして、サーブレットに渡すAタグなり、フォームなりを書いて実行します。

mixi OpenIDならこんな感じですね。

<a href="openid-login?openid_identifier=https://mixi.jp">mixiでログインします</a>

なんて簡単なんでしょう。

サンプルコードでは、mixi、Google、Yahoo!、openid.ne.jp は動きました。

hatena はうまくいきませんでした。なんでだろう。

nickNameが取れたのはmixiだけでした。