Yahoo! ID連携

Javaによる導入方法

STEP2: Yahoo! JAPAN IDログインボタンを作成する

サンプル

ボタンを押すと別ウィンドウが起動してログイン画面、同意画面が表示されます。

はじめに設置するボタンのデザインを選択します。アプリケーションIDを登録する で登録したアプリケーションIDとコールバックURLを指定します。scopeはメールアドレスや氏名など 属性情報の取得 に必要なパラメーターです。以下を参考に必要に応じて指定してください。

ログインボタン生成

ボタンの種類
ボタン
テキストリンク
ボタンのテキスト
サイズ
プレビュー
ログイン
scope

以下に生成されたスクリプトをHTML内に設置してください。



STEP3: サンプルコードを確認して実装する

1. nonceを生成してスクリプト内に埋め込む

Javaでユニークなランダム文字列を生成してstate(リクエストとコールバック間の検証用)とnonce(リプレイアタック対策)に指定してください。

ログインするリクエストごとに生成しセッションやデータベースなどに保存してください。stateはユーザーのセッションにひもづけて保存してください。

<script type="text/javascript">
window.yconnectInit = function() {
    YAHOO.JP.yconnect.Authorization.init({
        button: {
            format: "image",
            type: "a",
            width: 196,
            height: 38,
            className: "yconnectLogin"
        },
        authorization: {
            clientId: "YOUR_APPLICATION_ID",
            redirectUri: "https://example.com/callback",
            scope: "openid",
            state: "<リクエストとコールバック間の検証用のランダムな文字列>",
            nonce: "<リプレイアタック対策のランダムな文字列>"
        },
        onError: function(res) {
            // エラー発生時のコールバック関数
        },
        onCancel: function(res) {
            // 同意キャンセルされた時のコールバック関数
        }
    });
};
(function(){
var fs = document.getElementsByTagName("script")[0], s = document.createElement("script");
    s.setAttribute("src", "https://s.yimg.jp/images/login/yconnect/auth/1.0.3/auth-min.js");
fs.parentNode.insertBefore(s, fs);
})();
</script>

state, nonceの生成アルゴリズムについて

十分な長さ(目安として32Byte以上)のランダムな文字列にしてください。数学関数やハッシュ関数を用いて英数字の文字列を生成する方法などがあります。

2. 認可コードを取得してトークンを発行

以下よりSDKをダウンロードしてjarファイルのビルド・パスを設定してください。

ユーザーがログイン、同意をした後に認可コードが発行されます。認可コードは認証に必要なIDトークンや属性を取得するためのアクセストークンを取得するために必要な文字列です。コールバックURLに付加されている認可コードを取得し、トークンを発行するための処理を実装します。

https://example.com/callback
// アプリケーションID、シークレット、コールバックURL
String clientId = "YOUR_APPLICATION_ID";
String clientSecret = "YOUR_SECRET";
String redirectUri = "http://example.com/callback";
 
// YConnectインスタンス取得
YConnectExplicit yconnect = new YConnectExplicit();
 
// コールバックURLから各パラメーターを抽出
if(yconnect.hasAuthorizationCode(request)) {
    // 認可コードを取得
    String code = yconnect.getAuthorizationCode(state);
    yconnect.requestToken(code, clientId, clientSecret, redirectUri);
    // アクセストークン、リフレッシュトークン、IDトークンを取得
    String accessTokenString = yconnect.getAccessToken();
    String refreshToken = yconnect.getRefreshToken();
}

getAuthorizationCodeメソッドに保存していたstateを指定してコールバックURLに付加されている認可コードを抽出します。認可コードの有効期限は10分で一度使用すると利用できなくなるため、Exceptionが発生した際には再度ログインして発行する必要があります。requestTokenメソッド呼び出し時に トークンを検証 の際に必要なIDトークンも同時に取得します。

3. トークンを検証

アクセストークン取得と同時に取得したIDトークンを検証します。セッションまたはデータベース等に保存していたnonce値をverifyIdTokenメソッドに指定します。

https://example.com/callback
//IDトークンの検証
if (yconnect.verifyIdToken(nonce, clientId, clientSecret, idTokenString)) {
    // 認証成功
    // IDトークンからユーザー識別子を取り出してCookie発行などのログイン処理を行ってください
    IdTokenObject idTokenObject = yconnect.decodeIdToken(idTokenString);
} else {
    // 認証失敗
}

Exceptionが発生した場合には検証が失敗しているため認証完了状態にはしないでください。再度ログインして認可コードの取得から処理をやり直してください。検証が成功した場合には、IDトークンから ユーザー識別子 を取り出して新規アカウントへのひもづけやログイン処理を行ってください。IDトークンの詳細については IDトークンとは を参照してください。

4. 属性情報の取得

アクセストークンを用いて属性情報を取得することが可能です。

https://example.com/callback
// UserInfo APIへリクエスト
yconnect.requestUserInfo(accessTokenString);
// UserInfo情報を取得
UserInfoObject userInfoObject = yconnect.getUserInfoObject();

各パラメーターはUserInfoオブジェクトのプロパティーに保持されているので必要に応じて参照してください。

アクセストークンの有効期限は発行から3600秒です。継続してWeb APIにアクセスする場合にはリフレッシュトークンを用いてアクセストークンを更新する必要があります。更新の方法については Java SDK をご確認ください。



詳細な仕様について

クラスやメソッドなどの詳細な仕様については Java SDK を参照してください。



Yahoo!知恵袋で調べる