javaのYconnect SDK(jp.co.yahoo.yconnect-2.0.0.jar)を使用してID連携を行いたいと考えています。
jp.co.yahoo.yconnect-2.0.0.jarに同梱されていたサンプルサーブレット(YConnectServlet.java)を使用してID連携を試みたのですが、IDトークンの検証時にJsonの解析エラーが出てしまいます。
なにか足りないことがあるのでしょうか。
■行ったことは以下のとおりです。
【サンプルプログラムの準備】
1.Yahooデベロッパーネットワークで、サーバサイドアプリケーションを作成
2.サンプルサーブレット(YConnectServlet.java)のアプリケーションID、シークレット、コールバックURLの箇所を取得したものに書き換え
3.コンパイル、サーバ(tomcat)にデプロイ
【サンプルプログラムの実行】
1.ブラウザでサンプルサーブレットへアクセス
2.Yahooの「アプリケーションの利用」画面が表示される
3.「同意する」ボタンを押下する
4.コールバックURLへリダイレクトされ、サンプルサーブレットが実行される
ここで、エラーが発生します。
■エラーの発生箇所・内容
サンプルサーブレット(YConnectServlet.java)の、IDトークンの検証でエラーが発生しています。
具体的には、YConnectExplicit#verifyIdToken()メソッドを呼んだときに、javax.json.stream.JsonParsingExceptionが発生します。
jsonの解析に失敗しているようです。
以下、その際のスタックトレースです。
javax.json.stream.JsonParsingException: Unexpected char 0 at (line no=1, column no=226, offset=225)
at org.glassfish.json.JsonTokenizer.unexpectedChar(JsonTokenizer.java:532)
at org.glassfish.json.JsonTokenizer.nextToken(JsonTokenizer.java:415)
at org.glassfish.json.JsonParserImpl$ObjectContext.getNextEvent(JsonParserImpl.java:255)
at org.glassfish.json.JsonParserImpl$StateIterator.next(JsonParserImpl.java:172)
at org.glassfish.json.JsonParserImpl.next(JsonParserImpl.java:149)
at org.glassfish.json.JsonReaderImpl.readObject(JsonReaderImpl.java:177)
at org.glassfish.json.JsonReaderImpl.readObject(JsonReaderImpl.java:103)
at jp.co.yahoo.yconnect.core.oidc.IdTokenDecoder.decode(IdTokenDecoder.java:62)
at jp.co.yahoo.yconnect.YConnectExplicit.verifyIdToken(YConnectExplicit.java:226)
at jp.co.yahoo.sample.YConnectServlet.doGet(YConnectServlet.java:103)
■これまでに調査したこと
YConnectExplicit#getIdToken()メソッドからの戻り値は、ドット区切りの文字列が取得できています。
ですので、IDトークンは取得できているようです。
取得できたIDトークンが正常なのかどうかを調査するため、base64デコードしてみました。
その結果、ドット区切りの2番目のデータがうまくデコードできず、jsonとして不正なもの(データが途中で切れてしまう)になりました。
おそらくこのことが原因でIDトークンの検証に失敗しているのだと思います。
通信の障害も疑い、時間をおいて何度かやり直してみましたが、毎回同様に失敗します。
ちなみに、アクセストークンは正常に取得できており、UserInfo情報の取得も正常にできました。
IDトークンが正常にbase64デコードできれば解決するように思いますが、原因がわかりましたらご教示ください。