Miアカウントに「+」が含まれているとパスワードをリセットできない

諸般の事情によりMiアカウントを作った。

Miアカウントについてはこの辺参照。 win-tab.net

メールアドレスで作れるんだけど、この手のやつはローカルパートに "+サービス名" をつけて作ってるので、今回も ほげほげ+mi@gmail.com で作った。

スマホで入力したんだけど、パスワード管理ツールによるパスワード自動生成が効かなかったんで、あとでリセットすればいいやとテキトーにパスワードを入力して記録もしなかった。

で、その後リセットしようとPCのブラウザから https://account.xiaomi.com/pass/forgetPassword でメールアドレスを入力したら「入力したユーザー名が無効です」と言われてしまう。

f:id:tmtms:20200725110533p:plain

+ が含まれてるからだろうと想像はついたけど、生成時とリセット時でバリデーション規則くらいは合わせておいて欲しい…。

ブラウザの開発者ツールで、ネットワーク通信がおこなわれていないことがわかったので、クライアント側でチェックしてるんならなんとかなるかと調べてみたらあっさり見つかった。

HTMLの92行目に正規表現があった。

  <input class="user_input" type="text" name="id"
         id="user" autocomplete="off" 
         placeholder="メールアドレスまたは電話番号"  rule="(^[\w.\-]+@(?:[A-Za-z0-9]+(?:-[A-Za-z0-9]+)*\.)+[A-Za-z]{2,6}$)|(^1\d{10}$)|(^\d{3,}$)|(^\++\d{2,}$)">

ローカルパートは [\w.\-] となってるので、英数字と _, ., - しか許可されていないらしい。まあよくある。 フロントエンド側でのメールアドレスのローカルパートのバリデーションなんて、「ASCIIの印字可能文字であること」くらい緩くてもいいのに。

開発者ツールで [\w.+\-]+ を追加するように変更してから再実行したらちゃんとうまくいった。めでたしめでたし。

その後調べてみたら、ブラウザからアカウントを作成する場合は同じ規則で + は許可されていなかった。どうやらスマホアプリとブラウザでバリデーションが異なるらしい。