ガラケー対応してみる

やろうと思えば出来ないこともないのでは、と思って改めて色々調べた所なんとかなったようです。
ただし圧倒的に実機検証していないので、ダメな機種もあるんじゃないかと思います。

ガラケーでOAuthする時

OAuth認証時、リクエストトークンとアクセストークンをセッションに保存しておく必要があるので、
ガラケーではセッションIDをどのように取り回すかが重要になります。

認証先サーバーで認証後、oauth_verifierなどを持ってコールバックURLにリダイレクトされてくるわけですが、
その際にリクエストトークンを保存したセッションと同じセッションを引き継げるよう、
セッションIDも持ってリダイレクトしてきてもらわなければなりません。

OAuth認証時は、コールバックURLを都度指定することが出来るので、
それをセッションIDのパラメータ付きのものに指定することで、
送り元のリクエストトークンを持ったセッションのIDを、そのまま認証先サーバーから返してもらえるという寸法です。

そもそもガラケーのセッションの引き回し方

COOKIEが使えない、ということを前提にすると(最近は使えるものもありますが)、
各ページでセッション開始前にIDを指定してsession_start()する必要があります。
session_id()の引数にIDを入れれば、そのIDでセッションを使えるようになります。

まず、phpの設定でガラケー領域はCOOKIEでセッションを使わない設定にします。
phpのスクリプト上で設定をするなら下記のようにします。
PCスマホ版とサイトが同じである場合は、php.iniで設定すると問題が起きることもあると思いますので、
ガラケーページを別にして個別に設定する方が良いと思います。
ディレクトリごと分かれていれば.htaccessやphp.iniで設定してもいいでしょう。(サーバーによりますが)

ini_set('session.use_cookies', 0); /*セッションの保存にcookieを使わない*/
ini_set('session.use_only_cookies', 0); /*セッションの利用をcookie以外でも可能にする*/

楽をしたい場合は下記も設定すると、aタグやformタグのinputに自動的にセッションIDが付与されるようになります。

ini_set('session.use_trans_sid',1); /*リンクやフォームに自動的にセッションIDを付与*/

更に、ページごとにGETないしはPOSTで送られてきたセッションIDを設定してから、
セッションを開始するようにします。

session_id($_REQUEST["PHPSESSID"]);  /*開始するセッションのIDを指定する*/

これらは必ずsession_start()より前に書きます。
ページ遷移のたびにこの処理を行うことで、PCサイトのようにセッションを利用することが出来るようになります。

OAuthのコールバックURLにセッションを指定

twitteroauthライブラリを利用する場合、認証はここのサンプルで言うと下記の流れになっています。

  1. redirect.phpでリクエストトークンを取得し、認証画面へリダイレクト
  2. 認証画面で認証後、コールバックURLへリダイレクト
  3. collback.phpでoauth_verifierを受け取る

1でコールバックURLを指定することで、2のリダイレクト先をコントロール出来るので、
1の時点でセッションID付きのコールバックURLを指定すれば良いということです。
そして、それを3で前述のようにIDをセットしてからセッション開始すれば、PCサイト同様の認証を完了することが出来ます。
※サンプルのcollback.phpは最後にindex.phpにリダイレクトしますが、
この時にもセッションIDをGETに付与することを忘れないようにしてください。

コールバックURLの指定部分は具体的には下記のようにします。

/* Get temporary credentials. */
$request_token = $connection->getRequestToken(OAUTH_CALLBACK."?PHPSESSID=".session_id());

ここのOAUTH_CALLBACKはcollback.phpのURLパスが指定されています。
これで、Twitterサーバーから帰ってくる時でも、collback.phpにセッションIDを渡すことが出来ます。

実際のところ

セッションIDがGETで剥き出しになるのは、如何にガラケーブラウザとはいえあまり気持ちのいいものではないので、
iconDecotterでは基本的にPOSTでやり取りしています。
また上記では割愛していますが、認証直後やデコレーション後等で都度セッションIDの変更をしているので、
多少はセキュリティを考慮した作りになっているのではと思います。

ところで、実はガラケーユーザーの需要がどのくらいあるのかまったく見通しなく対応してみたのですが、
多分ものすごく少ないだろうとは思っています。
一応機能的には位置調整オプションも可能な程度には作りこみましたが、とにかく荒い作りなのは間違いないので、
様子見しながら、ちょくちょく改良出来たらなと思います。

コメント

タイトルとURLをコピーしました