I want my laravel project have authentication firebase so I follow this tutorial: https://medium.com/@GaonLabs/laravel-firebase-authentication-complete-guide-7735a1f83a3d and at first, I got unresolved depedency error but fixed after I edit code as answer on Laravel Firebase authentication error, unresolved dependancy suggested.
I can register users into firebase authentication via in-build register page laravel, though I can't say the same about login session using laravel login page despite there's data about that users in firebase authentication. Firebase Authentication Page Settings-tab users
Though I can't pin point what was the error of my project. is it the env or something can't connect to local database or need some rework on login codes?
a lil bit differenciate between tutorial and my project
Models/Users.php
protected $fillable = [
'uid',
'role',
'name',
'email',
'username',
'password',
'address',
'phone',
];
public function getAuthIdentifierName() {
return 'uid';
}
public function getAuthIdentifier(){
return $this->uid;
}
Firebase/FirebaseUserProvider.php
public function retrieveById($identifier) {
$firebaseUser = $this->auth->getUser($identifier);
$user = new User([
'uid' => $firebaseUser->uid,
'email' => $firebaseUser->email,
'name' => $firebaseUser->displayName
]);
return $user;
}
RegisterController.php
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Http\Response;
use App\Models\User;
use Illuminate\Support\Facades\Auth;
use Illuminate\Foundation\Auth\RegistersUsers;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Illuminate\Http\Request;
use Kreait\Firebase\Contract\Auth as FirebaseAuth;
use Kreait\Firebase\Exception\FirebaseException;
use Illuminate\Validation\ValidationException;
use Session;
class RegisterController extends Controller {
use RegistersUsers;
protected $auth;
protected $redirectTo = RouteServiceProvider::HOME;
public function __construct(FirebaseAuth $auth) {
$this->middleware('guest');
$this->auth = $auth;
}
protected function validator(array $data) {
return Validator::make($data, [
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255'],
'password' => ['required', 'string', 'min:8', 'confirmed'],
]);
}
protected function register(Request $request) {
$this->validator($request->all())->validate();
$userProperties = [
'email' => $request->input('email'),
'emailVerified' => false,
'password' => $request->input('password'),
'displayName' => $request->input('name'),
'role' => $request->input('role'),
'address' => $request->input('address'),
//'phone' => $request->input('phone'),
'disabled' => false,
];
$createdUser = $this->auth->createUser($userProperties);
return redirect()->route('login');
}
protected function create(array $data)
{
return User::create([
'name' => $data['name'],
'role' => $data['role'],
'username' => $data['username'],
'email' => $data['email'],
'password' => Hash::make($data['password']),
'address' => $data['address'],
'phone' => $data['phone'],
]);
}
}
LoginController.php
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Http\Request;
use Kreait\Firebase\Contract\Auth as FirebaseAuth;
use Kreait\Firebase\Auth\SignInResult\SignInResult;
use Kreait\Firebase\Exception\FirebaseException;
use Illuminate\Validation\ValidationException;
use Session;
use Auth;
use App\Models\User;
class LoginController extends Controller {
use AuthenticatesUsers;
protected $auth;
protected $redirectTo = RouteServiceProvider::HOME;
public function __construct(FirebaseAuth $auth) {
$this->middleware('guest')->except('logout');
$this->auth = $auth;
}
protected function login(Request $request) {
$auth = app("firebase.auth");
$signInResult = $auth->signInWithEmailAndPassword(
$request["email"],
$request["password"]
);
$user = new User($signInResult->data());
//uid Session
$loginuid = $signInResult->firebaseUserId();
Session::put('uid',$loginuid);
$result = Auth::login($user);
return redirect($this->redirectPath());
/*try {
$auth = app("firebase.auth");
$signInResult = $auth->signInWithEmailAndPassword(
$request["email"],
$request["password"]
);
$user = new User($signInResult->data());
//uid Session
$loginuid = $signInResult->firebaseUserId();
Session::put('uid',$loginuid);
$result = Auth::login($user);
return redirect($this->redirectPath());
} catch (FirebaseException $e) {
throw ValidationException::withMessages([
$this->username() => [trans("auth.failed")],
]);
}*/
}
public function username() {
return 'email';
}
public function handleCallback(Request $request, $provider) {
$socialTokenId = $request->input('social-login-tokenId', '');
try {
$verifiedIdToken = $this->auth->verifyIdToken($socialTokenId);
$user = new User();
$user->displayName = $verifiedIdToken->getClaim('name');
$user->email = $verifiedIdToken->getClaim('email');
$user->localId = $verifiedIdToken->getClaim('user_id');
Auth::login($user);
return redirect($this->redirectPath());
} catch (\InvalidArgumentException $e) {
return redirect()->route('login');
} catch (InvalidToken $e) {
return redirect()->route('login');
}
}
}