OAuth認証からのコールバックでjava.lang.NullPointerException発生

434 views
Skip to first unread message

ryan....@gmail.com

unread,
Apr 11, 2014, 5:51:11 PM4/11/14
to twitt...@googlegroups.com
お世話になります。

OAuth認証を行なうさい、ツイッター公式ページでユーザーがキャンセルして、アプリケーションに戻るボタンをクリックした場合に起こる不具合で質問いたします。

開発環境は、GAE/J、twitter4j-4.0.1 を利用させていただいています。
はきだされたエラーは下記のようになっております。
コールバックのパラメータについては伏せさせていただいています。

GET /CallBack?denied=****************************************

java.lang.NullPointerException
at java.net.URLEncoder.encode(URLEncoder.java:205)
at twitter4j.HttpParameter.encode(HttpParameter.java:261)
at twitter4j.auth.OAuthAuthorization.encodeParameters(OAuthAuthorization.java:411)
at twitter4j.auth.OAuthAuthorization.encodeParameters(OAuthAuthorization.java:394)
at twitter4j.auth.OAuthAuthorization.normalizeRequestParameters(OAuthAuthorization.java:378)
at twitter4j.auth.OAuthAuthorization.generateAuthorizationHeader(OAuthAuthorization.java:225)
at twitter4j.auth.OAuthAuthorization.generateAuthorizationHeader(OAuthAuthorization.java:277)
at twitter4j.auth.OAuthAuthorization.getAuthorizationHeader(OAuthAuthorization.java:66)
at twitter4j.HttpClientImpl.setHeaders(HttpClientImpl.java:208)
at twitter4j.HttpClientImpl.handleRequest(HttpClientImpl.java:91)
at twitter4j.HttpClientBase.request(HttpClientBase.java:53)
at twitter4j.HttpClientBase.post(HttpClientBase.java:82)
at twitter4j.auth.OAuthAuthorization.getOAuthAccessToken(OAuthAuthorization.java:139)
at twitter4j.auth.OAuthAuthorization.getOAuthAccessToken(OAuthAuthorization.java:159)
at twitter4j.TwitterBaseImpl.getOAuthAccessToken(TwitterBaseImpl.java:370)
・・・・以下省略

開発中のソースは公開できませんが、認証はすべてうまく行っております。
予想できることは、キャンセル時のコールバックのパラメータが不足しているためではないかと思われます。

ご回答いただければ、幸いです。

アプリケーションのリリースは来週初めを予定しておりますが、
バグであった場合の対処方法として、認証をキャンセルする場合は、アプリケーションには戻るとはせずに、ホームページに戻るようにするよう説明を加えるつもりです。

Yamamoto Yusuke

unread,
Apr 12, 2014, 4:17:01 AM4/12/14
to twitt...@googlegroups.com
キャンセルしているにもかかわらずアクセストークンを取得しようとしているのが問題のようです。
コールバックのパラメータに"denied="が含まれている場合はキャンセルされたと判断してはいかがでしょう。
アクセストークンを取得する処理をせずに、キャンセルされたことを把握した旨を表示すれば良いかと思います。

ソースコードの確認など必要でしたら個別に対応しておりますのでお申し付けください。
--
山本 裕介
yus...@mac.com
2014年4月12日 06:51、ryan....@gmail.comさんのメッセージ:

--
Twitter4J の最新情報をフォロー: http://twitter.com/t4j_news
現在のバージョン - 安定: 4.0.1, 開発中: 4.0.2-SNAPSHOT
バグトラッキング: http://issue.twitter4j.org/youtrack/issues/TFJ
 
このメールは次の Google グループの参加者に送られています: Twitter4J J
このグループにメールで投稿: twitt...@googlegroups.com
このグループから退会する: http://groups.google.com/group/twitter4j-j?hl=ja
---
このメールは Google グループのグループ「Twitter4J J」に登録しているユーザーに送られています。
このグループから退会し、グループからのメールの配信を停止するには twitter4j-j...@googlegroups.com にメールを送信してください。
その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。

ryan....@gmail.com

unread,
Apr 12, 2014, 10:05:39 AM4/12/14
to twitt...@googlegroups.com
早速のご回答ありがとうございます。

ご回答がいただけ無ければ、そのように対処する予定でした。
確認したかったのは、getOAuthAccessToken()メソッドでキャンセル時の対処がなされていないことでしたので、
下記の処理を追加しております。

// キャンセルパラメータの取得
if ( request.getParameter("denied") != null ) {
  // キャンセルされた
} else {
   // トークンを取得
 accessToken = twitter.getOAuthAccessToken(...);

}

ありがとうございました。


2014年4月12日土曜日 17時17分01秒 UTC+9 yus...@mac.com:

Yamamoto Yusuke

unread,
Apr 12, 2014, 10:08:35 AM4/12/14
to twitt...@googlegroups.com
getOAuthAccessToken()は「アクセストークンを取得する」メソッドですので、取得できない状況で呼び出した場合の動作は未定義です。
NullPointerExceptionのかわりにTwitterExceptionを投げても良いかもしれませんが、アプリケーション的には条件分岐をするタイミングが変わるだけで使い方としてシンプルになるわけではありませんね。

「こうだったら良いのに」という挙動があればYouTrackに登録していただければと思います。
--
山本 裕介
@yusuke
http://samuraism.jp/

ryan....@gmail.com

unread,
Apr 12, 2014, 10:42:06 AM4/12/14
to twitt...@googlegroups.com
ご返信、ありがとうございます。
APIへの依存性について、ここの範疇ではないと思いますが、ちょっときにかかります。
メソッドへ投入するパラメータの不具合で、NullPointerExceptionは理解できますが、
取得することができない場合の挙動としては、いささか疑問の残るところです。

お忙しい中、対処していただきありがとうございました。
Twitter4jがよりよいものとなりますように、心より願っております。

2014年4月12日土曜日 23時08分35秒 UTC+9 yus...@mac.com:

Yamamoto Yusuke

unread,
Apr 12, 2014, 10:47:09 AM4/12/14
to twitt...@googlegroups.com
getOAuthAccessTokenのパラメータはrequestTokenとoauthVerifierです。
http://twitter4j.org/javadoc/twitter4j/auth/OAuthSupport.html#getOAuthAccessToken(twitter4j.auth.RequestToken,%20java.lang.String)
アプリケーション側はrequestTokenとoauthVerifierを渡す責務があるので、そこにnullを渡した場合の挙動についてなにかライブラリ側に期待するのはちょっと違うかなと。

何か良いインターフェース、実装、JavaDocのアイディアがあるようでしたらYouTrackへの登録、pull requestなどお待ちしてます。
--
山本 裕介
@yusuke
http://samuraism.jp/

Reply all
Reply to author
Forward
0 new messages