2018.10.30
団体用集金システムを作りたい!#7【機能紹介#1-URLログインシステム-】
なんか紙を眺めてぼけーっとしてても開発が進みそうにないので、
僕はキレてコードを書き始めることにしました(明らかな愚策)
最初はそんな複雑なことしないと思いますので、簡単に作れそうなとこから作ってみて様子を見てみたいとおもいまーすwwwwww
たぶん失敗します。予言します。
ただ、ログインまわりとかその辺りは現段階でも作れると思うので先に作っちゃおうかと思います。
さて、今回のシステム・・・・・・一応、コードネームは
Orgsmと名付けております。
オーガズムと僕は呼んでいます
最初は
Organization Systemの頭文字をとってオーガズムwwwwとか言ってたんですけど、あまりにも下品すぎたので
Org"ms"に変えたんですよ。マネージメントシステム、としてね。
ただ・・・・・・
「オーガズム」で脳は処理してるのでいつの間にか戻ってしまったという失態を犯しました。もう諦めてオーガズムを自称します←
さて、前にもちょろっと話しましたが、このシステムで僕がどうしてもやり遂げたい仕組みとして
「会員登録」「ログイン」が不要なシステムを提唱したくてですね。
ただ、ログイン機能を完全に排除してしまうと、データが誰でも閲覧できるセキュリティガバガバのシステムになるので、そんな実用性のないものは作りません。
そこで用いるのが
Eメールアドレスと任意の文字列をトークンにしたURL認証です。指定のURLにアクセスすることでログインができる、というシステムです。複合可能な暗号を用いることで実装できますね。
ただ、暗号化したEメールアドレスのみの認証だと、トークンが漏れた時対応ができないので、もう一つ任意の文字列をトークンにしたものをDBに保存することで、不審なアクティビティがあった際はログインURLを切り替えられる、という仕組みです。
そのURLは自身のメールアドレスに届けられるので、セキュリティ強度は自身のメールアドレスと同一です。Remember Me機能を用いることで、毎回メールを開く必要もないので、現実的なログイン機能となることでしょう。
ということで、その辺の実装をしたいなーと思う所存です。むしろ、基本的にそれ以外の認証方法は実装する必要ないので、
自前のユーザー認証を定義してLaravelに組み込むことになりますね。
ここで必要となるのが、
文字列を暗号化して結果を返す関数ですね。まぁそのへんは
Laravelの方で用意してくれてるので、それを使うのがラクでしょう。
とはいえ、email側は復号が必要ですけど、もう一方のトークンは別に元の文字列がなんだったのかを考える必要ってないんですよね。ただ、ランダムに生成した文字列が一致すればいいだけの話ですし・・・・・・。
セキュリティ強度を上げようと思うともうちょっと工夫が必要な気もしますけど、DBの中身を覗かれるようなSQLインジェクションが発生しないことを前提に進めるしかないですかね・・・・・・。あんま良い手思いつかないです。
これがパスワードだったら、元となるデータは人間の方で記憶してくれているのでDBに保存しなくてもいいんですけど・・・・・・
っていうか、そもそも
新規登録について全く考えていませんでしたね。(屑)
基本的にユーザーは新規登録する必要はないんですけど、既にデータが登録されていない状態で新しいグループを作ろうとした時はさすがに登録作業が必要となりますね。といっても、メールアドレス認証ぐらいですけど・・・・・・。
そのへんの仕組みはちゃんと考えないとなーって感じです。
とりあえず、指定されたメールアドレス宛てに登録させ、そのトークンを用いて改めて新規登録させたらよきですかね。
いちいち新規登録のためのデータを保持するのもめんどくさいので、仕様としては・・・・・・
1.Eメールアドレスを暗号化する
2.暗号化したものをトークンにし、URLに添付してメール送信
3.新規登録用のURLにアクセスした際、Eメールの衝突が起きていなければ新規登録フォームを表示する
こんな感じで実装すれば、省エネで実装できそうですね。新規登録用のテーブルも要らないですし、Eメールの実在性も保証できると思います。
んじゃ実装してみましょ!!
※ちなみに、Laravel5.7にはメールアドレスの確認が標準機能として実装されているみたいですが、構造が多少異なるので今回はそれを用いないことにしました。
中身の実装とか大多数の皆さんには興味ないと思うんですが、作ってる感出すためにちょこちょこと書き記しますね〜。
まず、Eメールを入力させる画面がこちらになります。Bootstrapを安易に導入してますけど、デザイン面を書く際には別のCSSフレームワークを使ってみるつもりではあります。
ただ、Ver0.1、つまり試作版では使い慣れたBootstrapを使って、必要最低限のコーディングで済ませちゃうつもりです。機能さえ動けばデザインは後からどうにでもなる、というか、それができるようなコーディングをしたいところですね。(n敗中)
Eメールを入力させ、それをバリデーションするのが必要になりますね。
//新規登録フォームへのURLをEメールで送るためのもの
public function register(SendEmailTokenRequest $request)
{
$encrypted=encrypt($request->email);//Emailを暗号化
var_dump($encrypted);
var_dump(decrypt($encrypted));
}
まずはこんな感じです。いやー、らくちんらくちん。ちゃんと復号できるとこまで確認しました。
これをトークンとしてメールで送信すればよさそーですね。
あー、なんかこっからめんどくさくなりそーなので次回に回します(笑)
次回はMailgunとかいうのを使ってメール送信してみよーかなと思います。たぶんやったことないんで。