それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

7SpotのWifiの自動ログインを書き直した。

7Spot のログイン仕様が変わってた

f:id:takuya_1st:20151128224536p:plain:w200 久しぶりに、ヨーカードーに行ったのでネットをしようとしたら、自動ログインが動かないので、仕様を再調査してきた。

github 更新した

github.com

あとで役に立つように

備忘録的に残しておこうと思う。

7Spot で調べて分かったこと

7Spotでアレコレ調べて分かったこと

  • TwitterなどSNSはログイン無しで見られる。
  • Https を素通してくれる(googleなど)
  • DNSルックアップは通る。
  • WiSPrには非対応
  • CaptiveNetworkを無視してくる
  • JavaScript によるCookie/Location書換でログインチェックしてる
  • User-Agent によるフィルタリングが掛かってる(curlでアクセス出来ない)

アプリ通信を阻害しないように「工夫」*1をしてあるようだ。

とくに、問題なのがiOS/OSXでの利用、AppleiOSで公衆無線LANの検出に使ってるCaptiveNetwork関連で使う http://www.apple.com/library/test/success.html へのアクセスを「素通し」してしまうので、ネットワーク検出がうまくいかない。どうなってんだろう。設計者はマトモにググったのか。

更に問題なのが、JS+Cookieによるクライアントチェック。これが特に厄介。

標準ブラウザ以外のログインを切断するようなので、スクリプトやアプリに依るログインが上手くいかない。

こういうクソ公衆無線LANが「外国人向け」とかになると余計に混乱が生じるだけな気がする。

7Spotやファミマのスーパ系のWifiは、なんか変な仕様が多い。連中は社内ルールをインターネットのルールと勘違いしているフシがある。古くは特定のURLにアクセスできない無線LANを作ったしね。

ログインのチェックの仕組み

ログインの流れは次のようになってた。

  1. www.yahoo.co.jp などに http でアクセスすると強制リダイレクトがかかる
  2. リダイレクト先は http://redir.7spot.jp/redir/ 
  3. リダイレクト先で、さらにログインへのリダイレクトがかかる。http://webapp-ap.7spot.jp/check.html?tmst=1448711533 ( ←int 秒)
  4. 該当ページで cookiecheck=true にするJSが動作し、location.href="/?tmst=1448711" (←int秒÷1000 )
  5. トップ画面が表示される。
  6. ログインページヘ

一見すると上手く動くようになってるけど、通信会社がWiSPr対応でXML提示してくれるのと大きく違ってる。JSチェックが走るのでログイン機構でWebkitを起動する必要があって、ちょっとマナーが悪いかなって思う。

JSチェックの部分

露骨に true 入れてました。

tmp = "cookiecheck="+escape('true')+"; expires=" + expires;

文字列にescape つけるってセンスは「セキュリティ対策」だと思いますが、意味なしなescapeをやらなくちゃいけないのは可哀想ですね。

function getCookie( key, tmp1, tmp2, xx1, xx2, xx3 ){
  tmp1 = " " + document.cookie + ";";
  xx1 = xx2 = 0;
  len = tmp1.length;
  while (xx1 < len){
    xx2 = tmp1.indexOf(";", xx1);
    tmp2 = tmp1.substring(xx1 + 1, xx2);
    xx3 = tmp2.indexOf("=");
    if (tmp2.substring(0, xx3) == key){
      return(unescape(tmp2.substring(xx3 + 1, xx2 - xx1 - 1)));
    }
    xx1 = xx2 + 1;
  }
  return("");
}

var nowtime = new Date().getTime();
var clear_time = new Date(nowtime + 5000);
var expires = clear_time.toGMTString();

tmp = "cookiecheck="+escape('true')+"; expires=" + expires;
document.cookie = tmp;
cookiecheck = getCookie("cookiecheck");
android4 = (navigator.appVersion.indexOf('Android 4') > -1);
if ( (!android4 && cookiecheck == "true") || (android4 && navigator.cookieEnabled)){
  location.href = "/?tmst=" + Math.round((new Date()).getTime() / 1000);
}
tmp = "cookiecheck="+escape('')+"; ";
document.cookie = tmp;

*1:といっても場当たり的でとてもマトモな対応とはいえない。