aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorMarvin Borner2018-07-11 18:51:39 +0200
committerMarvin Borner2018-07-11 18:51:39 +0200
commitb7a6fbc9cc5d9d601c60e6ed4123e021e4aeaf5b (patch)
tree17af273b117187ad7937c477fe245c69410f7179
parent419c90e49c34aa2b326a25e2ab85cdfb71f18e53 (diff)
Added/fixed email verification
-rw-r--r--app/Http/Controllers/Auth/RegisterController.php45
-rw-r--r--app/Jobs/SendVerificationEmail.php39
-rw-r--r--app/Mail/EmailVerification.php36
-rw-r--r--app/User.php2
-rw-r--r--database/migrations/2014_10_12_000000_create_users_table.php2
-rw-r--r--public/js/app.js2
-rw-r--r--resources/views/confirmEmail.blade.php16
-rw-r--r--resources/views/email/verify.blade.php3
-rw-r--r--resources/views/verificationSuccess.blade.php17
-rw-r--r--routes/web.php4
10 files changed, 159 insertions, 7 deletions
diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php
index f922f9f..2994499 100644
--- a/app/Http/Controllers/Auth/RegisterController.php
+++ b/app/Http/Controllers/Auth/RegisterController.php
@@ -2,11 +2,14 @@
namespace App\Http\Controllers\Auth;
-use App\User;
use App\Http\Controllers\Controller;
+use App\Jobs\SendVerificationEmail;
+use App\User;
+use Illuminate\Auth\Events\Registered;
+use Illuminate\Foundation\Auth\RegistersUsers;
+use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
-use Illuminate\Foundation\Auth\RegistersUsers;
class RegisterController extends Controller
{
@@ -19,7 +22,7 @@ class RegisterController extends Controller
| validation and creation. By default this controller uses a trait to
| provide this functionality without requiring any additional code.
|
- */
+ */
use RegistersUsers;
@@ -64,7 +67,7 @@ class RegisterController extends Controller
protected function create(array $data)
{
$hashedPassword = Hash::make($data['password']);
- $previousHash = User::select('hash')->orderBy('id','desc')->first()->hash;
+ $previousHash = User::select('hash')->orderBy('id', 'desc')->first()->hash;
$summedHash = Hash::make($previousHash . $data['name'] . $data['email'] . 'password' . $hashedPassword); // Hash::check to verify
return User::create([
@@ -72,7 +75,39 @@ class RegisterController extends Controller
'email' => $data['email'],
'password' => $hashedPassword,
'prevHash' => $previousHash,
- 'hash' => $summedHash
+ 'hash' => $summedHash,
+ 'email_token' => base64_encode($data['email']),
]);
}
+
+ /**
+ * Handle a registration request for the application.
+ *
+ * @param \Illuminate\Http\Request $request
+ * @return \Illuminate\Http\Response
+ */
+
+ public function register(Request $request)
+ {
+ $this->validator($request->all())->validate();
+ event(new Registered($user = $this->create($request->all())));
+ dispatch(new SendVerificationEmail($user));
+ return view('confirmEmail');
+ }
+
+ /**
+ * Handle a registration request for the application.
+ *
+ * @param $token
+ * @return \Illuminate\Http\Response
+ */
+ public function verifyEmail($token)
+ {
+ $user = User::where('email_token', $token)->first();
+ $user->verified = 1;
+ if ($user->save()) {
+ return view('verificationSuccess', ['user' => $user]);
+ }
+ }
+
}
diff --git a/app/Jobs/SendVerificationEmail.php b/app/Jobs/SendVerificationEmail.php
new file mode 100644
index 0000000..0a71f05
--- /dev/null
+++ b/app/Jobs/SendVerificationEmail.php
@@ -0,0 +1,39 @@
+<?php
+
+namespace App\Jobs;
+
+use App\Mail\EmailVerification;
+use Illuminate\Bus\Queueable;
+use Illuminate\Contracts\Queue\ShouldQueue;
+use Illuminate\Foundation\Bus\Dispatchable;
+use Illuminate\Queue\InteractsWithQueue;
+use Illuminate\Queue\SerializesModels;
+use Mail;
+
+class SendVerificationEmail implements ShouldQueue
+{
+ use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
+
+ protected $user;
+
+ /**
+ * Create a new job instance.
+ *
+ * @return void
+ */
+ public function __construct($user)
+ {
+ $this->user = $user;
+ }
+
+ /**
+ * Execute the job.
+ *
+ * @return void
+ */
+ public function handle()
+ {
+ $email = new EmailVerification($this->user);
+ Mail::to($this->user->email)->send($email);
+ }
+}
diff --git a/app/Mail/EmailVerification.php b/app/Mail/EmailVerification.php
new file mode 100644
index 0000000..4f393ac
--- /dev/null
+++ b/app/Mail/EmailVerification.php
@@ -0,0 +1,36 @@
+<?php
+
+namespace App\Mail;
+
+use Illuminate\Bus\Queueable;
+use Illuminate\Mail\Mailable;
+use Illuminate\Queue\SerializesModels;
+
+class EmailVerification extends Mailable
+{
+ use Queueable, SerializesModels;
+
+ protected $user;
+
+ /**
+ * Create a new message instance.
+ *
+ * @return void
+ */
+ public function __construct($user)
+ {
+ $this->user = $user;
+ }
+
+ /**
+ * Build the message.
+ *
+ * @return $this
+ */
+ public function build()
+ {
+ return $this->view('email.verify')->with([
+ 'email_token' => $this->user->email_token,
+ ]);
+ }
+}
diff --git a/app/User.php b/app/User.php
index f263c47..9dcf98e 100644
--- a/app/User.php
+++ b/app/User.php
@@ -13,7 +13,7 @@ class User extends Authenticatable
* @var array
*/
protected $fillable = [
- 'name', 'email', 'password', 'prevHash', 'hash',
+ 'name', 'email', 'password', 'prevHash', 'hash', 'email_token'
];
/**
diff --git a/database/migrations/2014_10_12_000000_create_users_table.php b/database/migrations/2014_10_12_000000_create_users_table.php
index 1846db1..ab3cbc1 100644
--- a/database/migrations/2014_10_12_000000_create_users_table.php
+++ b/database/migrations/2014_10_12_000000_create_users_table.php
@@ -21,6 +21,8 @@ class CreateUsersTable extends Migration
$table->string('prevHash', 60)->unique();
$table->string('hash', 60)->unique();
$table->string('api_token')->default("");
+ $table->tinyInteger('verified')->default(0);
+ $table->string('email_token')->nullable();
$table->rememberToken();
$table->timestamps();
});
diff --git a/public/js/app.js b/public/js/app.js
index 3eb309f..24bab84 100644
--- a/public/js/app.js
+++ b/public/js/app.js
@@ -347,7 +347,7 @@ eval("$(\"#avatarFile\").on(\"change\", function () {\n var preview = documen
/* 42 */
/***/ (function(module, exports) {
-eval("// var openpgp = window.openpgp;\n\n// var options = {\n// userIds: [{ name:'Marvin Borner', email:'test@test.de' }], // multiple user IDs\n// numBits: 4096, // RSA key size\n// passphrase: 'cool password of private key'\n// };\n\n// openpgp.generateKey(options).then(function(key) {\n// var privateKey = key.privateKeyArmored; // '-----BEGIN PGP PRIVATE KEY BLOCK ... '\n// var publicKey = key.publicKeyArmored; // '-----BEGIN PGP PUBLIC KEY BLOCK ... '\n\n// console.log(publicKey);\n// console.log(privateKey);\n// });\n\n// $.ajax({\n// type: \"POST\",\n// url: \"keys/public/1\",\n// data: {\n// \"key\": \"test_key_2\"\n// },\n// cache: false,\n// success: (results) => {\n// console.log(results);\n// }\n// });\n\n\nvar socket = io('http://127.0.0.1:8890', {\n transports: ['websocket']\n});\nsocket.on('message', function (data) {\n data = JSON.parse(data);\n $(\"#messages\").append(\"<p>\" + data.user + \" : \" + data.message + \"</p>\");\n});\n\n$('input.send').click(function (e) {\n e.preventDefault();\n sendMessage();\n});\n\nfunction sendMessage() {\n var message = $('input.message').val();\n $('input.message').val(\"\");\n $.ajax({\n type: \"POST\",\n url: \"sendMessage\",\n data: {\n \"message\": message\n },\n cache: false\n });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NoYXQuanM/NjE1NCJdLCJuYW1lcyI6WyJzb2NrZXQiLCJpbyIsInRyYW5zcG9ydHMiLCJvbiIsImRhdGEiLCJKU09OIiwicGFyc2UiLCIkIiwiYXBwZW5kIiwidXNlciIsIm1lc3NhZ2UiLCJjbGljayIsImUiLCJwcmV2ZW50RGVmYXVsdCIsInNlbmRNZXNzYWdlIiwidmFsIiwiYWpheCIsInR5cGUiLCJ1cmwiLCJjYWNoZSJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUtBLElBQUlBLFNBQVNDLEdBQUcsdUJBQUgsRUFBNEI7QUFDckNDLGdCQUFZLENBQUMsV0FBRDtBQUR5QixDQUE1QixDQUFiO0FBR0FGLE9BQU9HLEVBQVAsQ0FBVSxTQUFWLEVBQXFCLFVBQUNDLElBQUQsRUFBVTtBQUMzQkEsV0FBT0MsS0FBS0MsS0FBTCxDQUFXRixJQUFYLENBQVA7QUFDQUcsTUFBRSxXQUFGLEVBQWVDLE1BQWYsQ0FBc0IsUUFBUUosS0FBS0ssSUFBYixHQUFvQixLQUFwQixHQUE0QkwsS0FBS00sT0FBakMsR0FBMkMsTUFBakU7QUFDSCxDQUhEOztBQUtBSCxFQUFFLFlBQUYsRUFBZ0JJLEtBQWhCLENBQXNCLFVBQUNDLENBQUQsRUFBTztBQUN6QkEsTUFBRUMsY0FBRjtBQUNBQztBQUNILENBSEQ7O0FBS0EsU0FBU0EsV0FBVCxHQUF1QjtBQUNuQixRQUFJSixVQUFVSCxFQUFFLGVBQUYsRUFBbUJRLEdBQW5CLEVBQWQ7QUFDQVIsTUFBRSxlQUFGLEVBQW1CUSxHQUFuQixDQUF1QixFQUF2QjtBQUNBUixNQUFFUyxJQUFGLENBQU87QUFDSEMsY0FBTSxNQURIO0FBRUhDLGFBQUssYUFGRjtBQUdIZCxjQUFNO0FBQ0YsdUJBQVdNO0FBRFQsU0FISDtBQU1IUyxlQUFPO0FBTkosS0FBUDtBQVFIIiwiZmlsZSI6IjQyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gdmFyIG9wZW5wZ3AgPSB3aW5kb3cub3BlbnBncDtcblxuLy8gdmFyIG9wdGlvbnMgPSB7XG4vLyAgICAgdXNlcklkczogW3sgbmFtZTonTWFydmluIEJvcm5lcicsIGVtYWlsOid0ZXN0QHRlc3QuZGUnIH1dLCAvLyBtdWx0aXBsZSB1c2VyIElEc1xuLy8gICAgIG51bUJpdHM6IDQwOTYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSU0Ega2V5IHNpemVcbi8vICAgICBwYXNzcGhyYXNlOiAnY29vbCBwYXNzd29yZCBvZiBwcml2YXRlIGtleSdcbi8vIH07XG5cbi8vIG9wZW5wZ3AuZ2VuZXJhdGVLZXkob3B0aW9ucykudGhlbihmdW5jdGlvbihrZXkpIHtcbi8vICAgICB2YXIgcHJpdmF0ZUtleSA9IGtleS5wcml2YXRlS2V5QXJtb3JlZDsgLy8gJy0tLS0tQkVHSU4gUEdQIFBSSVZBVEUgS0VZIEJMT0NLIC4uLiAnXG4vLyAgICAgdmFyIHB1YmxpY0tleSA9IGtleS5wdWJsaWNLZXlBcm1vcmVkOyAgIC8vICctLS0tLUJFR0lOIFBHUCBQVUJMSUMgS0VZIEJMT0NLIC4uLiAnXG5cbi8vICAgICBjb25zb2xlLmxvZyhwdWJsaWNLZXkpO1xuLy8gICAgIGNvbnNvbGUubG9nKHByaXZhdGVLZXkpO1xuLy8gfSk7XG5cbi8vICQuYWpheCh7XG4vLyAgICAgdHlwZTogXCJQT1NUXCIsXG4vLyAgICAgdXJsOiBcImtleXMvcHVibGljLzFcIixcbi8vICAgICBkYXRhOiB7XG4vLyAgICAgICAgIFwia2V5XCI6IFwidGVzdF9rZXlfMlwiXG4vLyAgICAgfSxcbi8vICAgICBjYWNoZTogZmFsc2UsXG4vLyAgICAgc3VjY2VzczogKHJlc3VsdHMpID0+IHtcbi8vICAgICAgICAgY29uc29sZS5sb2cocmVzdWx0cyk7XG4vLyAgICAgfVxuLy8gfSk7XG5cblxuXG5cbnZhciBzb2NrZXQgPSBpbygnaHR0cDovLzEyNy4wLjAuMTo4ODkwJywge1xuICAgIHRyYW5zcG9ydHM6IFsnd2Vic29ja2V0J11cbn0pO1xuc29ja2V0Lm9uKCdtZXNzYWdlJywgKGRhdGEpID0+IHtcbiAgICBkYXRhID0gSlNPTi5wYXJzZShkYXRhKTtcbiAgICAkKFwiI21lc3NhZ2VzXCIpLmFwcGVuZChcIjxwPlwiICsgZGF0YS51c2VyICsgXCIgOiBcIiArIGRhdGEubWVzc2FnZSArIFwiPC9wPlwiKTtcbn0pO1xuXG4kKCdpbnB1dC5zZW5kJykuY2xpY2soKGUpID0+IHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgc2VuZE1lc3NhZ2UoKTtcbn0pO1xuXG5mdW5jdGlvbiBzZW5kTWVzc2FnZSgpIHtcbiAgICB2YXIgbWVzc2FnZSA9ICQoJ2lucHV0Lm1lc3NhZ2UnKS52YWwoKTtcbiAgICAkKCdpbnB1dC5tZXNzYWdlJykudmFsKFwiXCIpO1xuICAgICQuYWpheCh7XG4gICAgICAgIHR5cGU6IFwiUE9TVFwiLFxuICAgICAgICB1cmw6IFwic2VuZE1lc3NhZ2VcIixcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgXCJtZXNzYWdlXCI6IG1lc3NhZ2VcbiAgICAgICAgfSxcbiAgICAgICAgY2FjaGU6IGZhbHNlXG4gICAgfSk7XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2Fzc2V0cy9qcy9jaGF0LmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///42\n");
+eval("// var openpgp = window.openpgp;\n\n// var options = {\n// userIds: [{ name:'Marvin Borner', email:'test@test.de' }], // multiple user IDs\n// numBits: 4096, // RSA key size\n// passphrase: 'cool password of private key'\n// };\n\n// openpgp.generateKey(options).then(function(key) {\n// var privateKey = key.privateKeyArmored; // '-----BEGIN PGP PRIVATE KEY BLOCK ... '\n// var publicKey = key.publicKeyArmored; // '-----BEGIN PGP PUBLIC KEY BLOCK ... '\n\n// console.log(publicKey);\n// console.log(privateKey);\n// });\n\n// $.ajax({\n// type: \"POST\",\n// url: \"keys/public/1\",\n// data: {\n// \"key\": \"test_key_2\"\n// },\n// cache: false,\n// success: (results) => {\n// console.log(results);\n// }\n// });\n\n\nvar socket = io('http://127.0.0.1:8890', {\n transports: ['websocket']\n});\nsocket.on('message', function (data) {\n data = JSON.parse(data);\n $(\"#messages\").append(\"<p>\" + data.user + \" : \" + data.message + \"</p>\");\n});\n\n$('input.send').click(function (e) {\n e.preventDefault();\n sendMessage();\n});\n\nfunction sendMessage() {\n var message = $('input.message').val();\n $('input.message').val(\"\");\n $.ajax({\n type: \"POST\",\n url: \"sendMessage\",\n data: {\n \"message\": message\n },\n cache: false\n });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NoYXQuanM/NjE1NCJdLCJuYW1lcyI6WyJzb2NrZXQiLCJpbyIsInRyYW5zcG9ydHMiLCJvbiIsImRhdGEiLCJKU09OIiwicGFyc2UiLCIkIiwiYXBwZW5kIiwidXNlciIsIm1lc3NhZ2UiLCJjbGljayIsImUiLCJwcmV2ZW50RGVmYXVsdCIsInNlbmRNZXNzYWdlIiwidmFsIiwiYWpheCIsInR5cGUiLCJ1cmwiLCJjYWNoZSJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUlBLElBQUlBLFNBQVNDLEdBQUcsdUJBQUgsRUFBNEI7QUFDckNDLGdCQUFZLENBQUMsV0FBRDtBQUR5QixDQUE1QixDQUFiO0FBR0FGLE9BQU9HLEVBQVAsQ0FBVSxTQUFWLEVBQXFCLFVBQUNDLElBQUQsRUFBVTtBQUMzQkEsV0FBT0MsS0FBS0MsS0FBTCxDQUFXRixJQUFYLENBQVA7QUFDQUcsTUFBRSxXQUFGLEVBQWVDLE1BQWYsQ0FBc0IsUUFBUUosS0FBS0ssSUFBYixHQUFvQixLQUFwQixHQUE0QkwsS0FBS00sT0FBakMsR0FBMkMsTUFBakU7QUFDSCxDQUhEOztBQUtBSCxFQUFFLFlBQUYsRUFBZ0JJLEtBQWhCLENBQXNCLFVBQUNDLENBQUQsRUFBTztBQUN6QkEsTUFBRUMsY0FBRjtBQUNBQztBQUNILENBSEQ7O0FBS0EsU0FBU0EsV0FBVCxHQUF1QjtBQUNuQixRQUFJSixVQUFVSCxFQUFFLGVBQUYsRUFBbUJRLEdBQW5CLEVBQWQ7QUFDQVIsTUFBRSxlQUFGLEVBQW1CUSxHQUFuQixDQUF1QixFQUF2QjtBQUNBUixNQUFFUyxJQUFGLENBQU87QUFDSEMsY0FBTSxNQURIO0FBRUhDLGFBQUssYUFGRjtBQUdIZCxjQUFNO0FBQ0YsdUJBQVdNO0FBRFQsU0FISDtBQU1IUyxlQUFPO0FBTkosS0FBUDtBQVFIIiwiZmlsZSI6IjQyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gdmFyIG9wZW5wZ3AgPSB3aW5kb3cub3BlbnBncDtcblxuLy8gdmFyIG9wdGlvbnMgPSB7XG4vLyAgICAgdXNlcklkczogW3sgbmFtZTonTWFydmluIEJvcm5lcicsIGVtYWlsOid0ZXN0QHRlc3QuZGUnIH1dLCAvLyBtdWx0aXBsZSB1c2VyIElEc1xuLy8gICAgIG51bUJpdHM6IDQwOTYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSU0Ega2V5IHNpemVcbi8vICAgICBwYXNzcGhyYXNlOiAnY29vbCBwYXNzd29yZCBvZiBwcml2YXRlIGtleSdcbi8vIH07XG5cbi8vIG9wZW5wZ3AuZ2VuZXJhdGVLZXkob3B0aW9ucykudGhlbihmdW5jdGlvbihrZXkpIHtcbi8vICAgICB2YXIgcHJpdmF0ZUtleSA9IGtleS5wcml2YXRlS2V5QXJtb3JlZDsgLy8gJy0tLS0tQkVHSU4gUEdQIFBSSVZBVEUgS0VZIEJMT0NLIC4uLiAnXG4vLyAgICAgdmFyIHB1YmxpY0tleSA9IGtleS5wdWJsaWNLZXlBcm1vcmVkOyAgIC8vICctLS0tLUJFR0lOIFBHUCBQVUJMSUMgS0VZIEJMT0NLIC4uLiAnXG5cbi8vICAgICBjb25zb2xlLmxvZyhwdWJsaWNLZXkpO1xuLy8gICAgIGNvbnNvbGUubG9nKHByaXZhdGVLZXkpO1xuLy8gfSk7XG5cbi8vICQuYWpheCh7XG4vLyAgICAgdHlwZTogXCJQT1NUXCIsXG4vLyAgICAgdXJsOiBcImtleXMvcHVibGljLzFcIixcbi8vICAgICBkYXRhOiB7XG4vLyAgICAgICAgIFwia2V5XCI6IFwidGVzdF9rZXlfMlwiXG4vLyAgICAgfSxcbi8vICAgICBjYWNoZTogZmFsc2UsXG4vLyAgICAgc3VjY2VzczogKHJlc3VsdHMpID0+IHtcbi8vICAgICAgICAgY29uc29sZS5sb2cocmVzdWx0cyk7XG4vLyAgICAgfVxuLy8gfSk7XG5cblxuXG52YXIgc29ja2V0ID0gaW8oJ2h0dHA6Ly8xMjcuMC4wLjE6ODg5MCcsIHtcbiAgICB0cmFuc3BvcnRzOiBbJ3dlYnNvY2tldCddXG59KTtcbnNvY2tldC5vbignbWVzc2FnZScsIChkYXRhKSA9PiB7XG4gICAgZGF0YSA9IEpTT04ucGFyc2UoZGF0YSk7XG4gICAgJChcIiNtZXNzYWdlc1wiKS5hcHBlbmQoXCI8cD5cIiArIGRhdGEudXNlciArIFwiIDogXCIgKyBkYXRhLm1lc3NhZ2UgKyBcIjwvcD5cIik7XG59KTtcblxuJCgnaW5wdXQuc2VuZCcpLmNsaWNrKChlKSA9PiB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHNlbmRNZXNzYWdlKCk7XG59KTtcblxuZnVuY3Rpb24gc2VuZE1lc3NhZ2UoKSB7XG4gICAgdmFyIG1lc3NhZ2UgPSAkKCdpbnB1dC5tZXNzYWdlJykudmFsKCk7XG4gICAgJCgnaW5wdXQubWVzc2FnZScpLnZhbChcIlwiKTtcbiAgICAkLmFqYXgoe1xuICAgICAgICB0eXBlOiBcIlBPU1RcIixcbiAgICAgICAgdXJsOiBcInNlbmRNZXNzYWdlXCIsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIFwibWVzc2FnZVwiOiBtZXNzYWdlXG4gICAgICAgIH0sXG4gICAgICAgIGNhY2hlOiBmYWxzZVxuICAgIH0pO1xufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3Jlc291cmNlcy9hc3NldHMvanMvY2hhdC5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///42\n");
/***/ }),
/* 43 */
diff --git a/resources/views/confirmEmail.blade.php b/resources/views/confirmEmail.blade.php
new file mode 100644
index 0000000..1de32c2
--- /dev/null
+++ b/resources/views/confirmEmail.blade.php
@@ -0,0 +1,16 @@
+@extends('layouts.app') @section('content')
+
+<div class="container">
+ <div class="row">
+ <div class="col-md-8 col-md-offset-2">
+ <div class="panel panel-default">
+ <div class="panel-heading">Registration</div>
+ <div class="panel-body">
+ You have successfully registered. An email is sent to you for verification.
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+@endsection \ No newline at end of file
diff --git a/resources/views/email/verify.blade.php b/resources/views/email/verify.blade.php
new file mode 100644
index 0000000..25eda64
--- /dev/null
+++ b/resources/views/email/verify.blade.php
@@ -0,0 +1,3 @@
+<h1>Click the Link To Verify Your Email</h1>
+
+Click the following link to verify your email {{url('/verify/email/'.$email_token)}} \ No newline at end of file
diff --git a/resources/views/verificationSuccess.blade.php b/resources/views/verificationSuccess.blade.php
new file mode 100644
index 0000000..5cc48eb
--- /dev/null
+++ b/resources/views/verificationSuccess.blade.php
@@ -0,0 +1,17 @@
+@extends('layouts.app') @section('content')
+
+<div class="container">
+ <div class="row">
+ <div class="col-md-8 col-md-offset-2">
+ <div class="panel panel-default"></div>
+ <div class="panel-heading">Registration Confirmed</div>
+ <div class="panel-body">
+ Your Email is verified. Click here to
+ <a href="{{url('/login')}}">login</a>
+ </div>
+ </div>
+ </div>
+</div>
+</div>
+
+@endsection \ No newline at end of file
diff --git a/routes/web.php b/routes/web.php
index 0b980a1..78dc452 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -9,6 +9,10 @@
| contains the "web" middleware group. Now create something great!
|
*/
+
+// Route should not use authentication!
+Route::get('verify/email/{token}', 'Auth\RegisterController@verifyEmail');
+
Auth::routes();
Route::middleware('auth', 'throttle:30') // throttle to 30 per minute
->group(function () {