7Spot のログイン仕様が変わってた
久しぶりに、ヨーカードーに行ったのでネットをしようとしたら、自動ログインが動かないので、仕様を再調査してきた。
github 更新した
あとで役に立つように
備忘録的に残しておこうと思う。
7Spot で調べて分かったこと
7Spotでアレコレ調べて分かったこと
- TwitterなどSNSはログイン無しで見られる。
- Https を素通してくれる(googleなど)
- DNSルックアップは通る。
- WiSPrには非対応
- CaptiveNetworkを無視してくる
- JavaScript によるCookie/Location書換でログインチェックしてる
- User-Agent によるフィルタリングが掛かってる(curlでアクセス出来ない)
アプリ通信を阻害しないように「工夫」*1をしてあるようだ。
とくに、問題なのがiOS/OSXでの利用、AppleがiOSで公衆無線LANの検出に使ってるCaptiveNetwork関連で使う http://www.apple.com/library/test/success.html へのアクセスを「素通し」してしまうので、ネットワーク検出がうまくいかない。どうなってんだろう。設計者はマトモにググったのか。
更に問題なのが、JS+Cookieによるクライアントチェック。これが特に厄介。
標準ブラウザ以外のログインを切断するようなので、スクリプトやアプリに依るログインが上手くいかない。
こういうクソ公衆無線LANが「外国人向け」とかになると余計に混乱が生じるだけな気がする。
7Spotやファミマのスーパ系のWifiは、なんか変な仕様が多い。連中は社内ルールをインターネットのルールと勘違いしているフシがある。古くは特定のURLにアクセスできない無線LANを作ったしね。
ログインのチェックの仕組み
ログインの流れは次のようになってた。
- www.yahoo.co.jp などに http でアクセスすると強制リダイレクトがかかる
- リダイレクト先は http://redir.7spot.jp/redir/
- リダイレクト先で、さらにログインへのリダイレクトがかかる。http://webapp-ap.7spot.jp/check.html?tmst=1448711533 ( ←int 秒)
- 該当ページで cookiecheck=true にするJSが動作し、location.href="/?tmst=1448711" (←int秒÷1000 )
- トップ画面が表示される。
- ログインページヘ
一見すると上手く動くようになってるけど、通信会社が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:といっても場当たり的でとてもマトモな対応とはいえない。