Play! の OAuth2 不具合いろいろ

Play! Framework 1.2.4 の play.libs.OAuth2 を Instagram に対して使ってみて見付けた不具合いろいろ。結果的にアクセストークンの取得部分が POST に対応していないため Instagram には使えませんでした。

  1. retrieveVerificationCode(): 認証 URL (コンストラクタの第1パラメータ) に対して強制的に '?' から始まるリクエストパラメータを連結しているため、OAuth2 プロバイダ (今回は Intagram) から提供された URL にパラメータが含まれていると正しく機能しない。例えば "http://api.instagram.com/oauth/authorize/?response=code" のような場合、"http://api.instagram.com/oauth/authorize/?response=code?client_id=xxxx&redirect_url=http://myserver.." といった予期しないパラメータでリクエストが行われる。
    回避策として client_id パラメータをあらかじめ認証 URL に梅こみ URL の最後に '&' を付けることで何とかなる (かもしれない)。つまり "http://api.instagram.com/oauth/authorize/?client_id=xxxx&response=code&" を指定すれば "http://api.instagram.com/oauth/authorize/?client_id=xxxx&response=code&?client_id=xxxx&redirect_url=http://myserver.." となる。ゴミパラメータが入るが。
  2. retrieveVerificationCode(): リクエストパラメータをエスケープしていない。リダイレクト URL にパラメータ部分が入る場合は呼び出し側で URL エスケープする必要がある。
  3. retrieveAccessToken(): GET のみに対応。Instagram のように POST 指定がされている OAuth2 プロバイダには使用できない。