Laravel login flow - laravel

When using default auth scaffold from Laravel, at register the password is hashed with bcrypt in RegisterController.php under create function
protected function create(array $data)
{
return User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => bcrypt($data['password']),
]);
}
I would like to know where is the function that hashes the user input for password at login? It must be somewhere built inside vendor folder but i can't find it.
So when the user want's to login he enters the plain text password and this plain text gets hashed again with bcrypt and then compared with saved and hashed password in DB. But where does laravel make this? In which function?

Laravel never decrypts your password
Bcrypt passwords in Laravel are never decrypted, the password entered by the user just gets compared to the already hashed password stored in the database.
Update:
If you are authenticating using Eloquents User Model;
vendor/laravel/ framework/src/Illuminate/Auth/EloquentUserProvider.php
public function validateCredentials(UserContract $user, array $credentials)
{
$plain = $credentials['password'];
return $this->hasher->check($plain, $user->getAuthPassword());
}
If you are authenticating the Database driver;
vendor/laravel/ framework//src/Illuminate/Auth/DatabaseUserProvider.php
public function validateCredentials(UserContract $user, array $credentials)
{
$plain = $credentials['password'];
return $this->hasher->check($plain, $user->getAuthPassword());
}

bcrypt is the function that turns it into hash. It is a one way hash algo and can't be decrypted. The password that user sends in plain text, convert that using bcrypt and then compare in db.

Related

How to trigger password reset without a notification in Laravel Breeze?

Using Laravel 9 with Breeze I want when a user with a specific role has been created, he should receive a custom welcome mail with a link to a view, where he needs to set a password
How can I just trigger the password reset without the default forgot password mail, but get the token that I can use in my custom mail for the link?
Create a random string of 35 characters.
Create an entry in the password_resets table comprising the user's email address, a hashed (bcrypt()) version of the token just created, and the current timestamp
Send the user an email with a link leading to /reset-password/{$token}
Example, assuming $user is the new user account;
$token = Str::random(35);
DB::table('password_resets')->insert([
'email' => $user->email,
'token' => bcrypt($token),
'created_at' => now(),
]);
$user->notify(new WelcomeNewUser($token));
and then in the notification class;
public $token;
public function __construct($token)
{
$this->token = $token;
}
//
public function toMail($notifiable)
{
return (new MailMessage)
->line('You have been invited to use our application')
->action('Set a password', url(route('password.reset',['token'=>$this->token])))
->line('Thank you for using our application!');
}

Laravel make manual password reset

I am working in laravel,
I am stuck in reset password manually,
I verify the mail is exist in database or not if mail is exist than it will redirect to reset password page.
When user type the password and submit the form, at that time password is not update in mongoDb database.
here's my function...
class ForgotPasswordController extends Controller
{
public function confirmPassword(Request $request, $email)
{
$this->validate($request, [
'password' => 'required|string|min:6'
]);
$admin = AdminAuth::find($email);
$admin->password = $request->get('password');
$admin->save();
return view('auth.login');
}
}
Try
$admin->password = Hash::make($request->get('password'));
More details here. And remember: never save users passwords explicit in db.

remove validation from email parameter in laravel 5.6. I am using authenticate() method

I am trying to authenticate the using using ajax and laravel 5.6 authenticate() method. If I pass 'email' and 'password' parameters then it works fine but If I change the email parameter to user_email then it gives me validation that "Email field is required".
So I need help to authenticate the user using different parameters (like user_email etc.) instead of email and password.
Here is the code file path app\Http\Controllers\AUth\LoginController.php
protected function authenticate(Request $request, $user){
if(!request->ajax()){
return response()->json([
'auth' => auth()->check(),
'user' => $user,
'intented' => $this->redirectPath()
]);
}
}
Thank you
Paste this on your login controller
public function username()
{
return 'user_email';
}

Laravel authentication using mobile number

I'm currently using Laravel 5.5, as you know Laravel by default offers authentication by email, but in my case I want to change its behaviour and allow the user to login using the mobile number. so Where would I have to do the modifications?
From the docs:
By default, Laravel uses the email field for authentication. If you would like to customize this, you may define a username method on your LoginController:
public function username()
{
return 'mobile_number';
}
https://laravel.com/docs/5.5/authentication#included-authenticating
LoginController
public function username()
{
return 'mobile';
}
also can validate
protected function validateLogin(Request $request)
{
$this->validate($request, [
$this->username() => 'required|string',
'password' => 'required|string',
]);
}

Use Plain Password in laravel 5 Authentication instead of bcrypt

i was using laravel bcrypt authentication in a back end application but client asked plain password authentication so that he can see the password of each user as administrator. My whole app logic is on laravel inbuilt authentication method an bcrypt hashing. how can i replace it to authenticate with plain password mach stored in database instead of storing hash ?
class AuthController extends Controller
{
use AuthenticatesAndRegistersUsers, ThrottlesLogins;
public function __construct()
{
$this->middleware('guest', ['except' => ['getLogout', 'getLogin']]);
}
public function postLogin()
{
$data = \Request::all();
$rules = [
'email' => 'required|email|max:255|exists:users',
'password' => 'required|exists:users'
];
$validator = \Validator::make($data, $rules);
if ($validator->fails()) {
//login data not exist in db
return redirect('/login')->withErrors($validator)->withInput();
} else {
$email = Request::input('email');
$pass = Request::input('password');
//in my table users, status must be 1 to login into app
$matchWhere = ['login' => $email, 'password' => $pass, 'status' => 1];
$count = \App\User::where($matchWhere)->count();
if ($count == 1) {
$user = \App\User::where($matchWhere)->first();
Auth::loginUsingId($user->id);
return redirect()->intended('/');
} else {
//not status active or password or email is wrong
$validator->errors()->add('Unauthorized', 'Not accepted in community yet');
return redirect('/login')->withErrors($validator)->withInput();
}
}
}
public function getLogin()
{
if (Auth::check()) {
return redirect()->intended('/');
} else {
return view('auth.login');
}
}
public function getLogout()
{
Auth::logout();
return redirect()->intended('/login');
}
}
If you are now using Laravel 5^, you can do that by searching for the class Illuminate/Auth/EloquentUserProvider and do some minor tweaks in there.
For e.g. find the public function retrieveByCredentials() and validateCredentials(). In the second function, you can see that the laravel is checking the hashed passwords to be fed into Auth::attempt() method. Just change it to plain checking and you are done.
public function retrieveByCredentials(array $credentials)
{
if (empty($credentials)) {
return;
}
// First we will add each credential element to the query as a where clause.
// Then we can execute the query and, if we found a user, return it in a
// Eloquent User "model" that will be utilized by the Guard instances.
$query = $this->createModel()->newQuery();
foreach ($credentials as $key => $value) {
if (! Str::contains($key, 'password')) {
$query->where($key, $value);
}
}
return $query->first();
}
/**
* Validate a user against the given credentials.
*
* #param \Illuminate\Contracts\Auth\Authenticatable $user
* #param array $credentials
* #return bool
*/
public function validateCredentials(UserContract $user, array $credentials)
{
$plain = $credentials['password'];
return $this->hasher->check($plain, $user->getAuthPassword());
}
Change $this->hasher->check to normal check and you will be done. :)
In laravel 4 you could have rewritten the HASH module . This stackoverflow thread explains how to use SHA1 instead of bycrypt [ check the accepted answer and comments ] .
You can make use of the method explained here and save your password without hashing .
Well, that really compromises your client's website security.
Storing plain passwords in the DB is not recommended at all. If someone gained access to the database his/her site will be really vulnerable, anyone with a copy of the database would have easy access to all kind of accounts. I insist you should create a reset/change password functionality instead of storing plain passwords in the DB.
Anyway, you could just get the plain password with
$password = Input::get('password');
And I guess you could authenticate users with
if (Auth::attempt(array('password' => $password)))
{
return Redirect::route('home');
}
Wow, these are all so complicated, it's as simple as.
if ($user = User::where('email', request()->email)->where('password', request()->password)->first()) {
Auth::login($user);
return redirect()->to('/');
}
Though I do agree that in a production environment you should not do this. But I can see for some applications if the users are aware the passwords are stored in plain text it may be ok.

Resources