Signup SSO is not working,
I have created SSO Login via Laravel Passport which is working perfectly.
User clicks on login button it takes to SSO Server and user login there and comes back logged in the client application.
The problem is I cannot figure out way to create signup SSO same like login.
Following is SSO Controller in my client Application
<?php
namespace AppHttpControllersSSO;
use AppHttpControllersController;
use AppModelsUser;
use IlluminateHttpRequest;
use IlluminateSupportFacadesAuth;
use IlluminateSupportFacadesLog;
use IlluminateSupportStr;
use IlluminateSupportFacadesHttp;
use InvalidArgumentException;
use IlluminateSupportFacadesHash;
class SSOController extends Controller
{
public function getLogin(Request $request)
{
$request->session()->put("state", $state = Str::random(40));
$query = http_build_query([
"client_id" => config("auth.client_id"),
"redirect_uri" => config("auth.callback") ,
"response_type" => "code",
"scope" => config("auth.scopes"),
"state" => $state,
"prompt" => true,
"signup" => true,
]);
return redirect(config("auth.sso_host") . "/oauth/authorize?" . $query);
}
public function getCallback(Request $request)
{
$state = $request->session()->pull("state");
throw_unless(strlen($state) > 0 && $state == $request->state, InvalidArgumentException::class);
$response = Http::asForm()->post(
config("auth.sso_host") . "/oauth/token",
[
"grant_type" => "authorization_code",
"client_id" => config("auth.client_id"),
"client_secret" => config("auth.client_secret"),
"redirect_uri" => config("auth.callback") ,
"code" => $request->code
]
);
$request->session()->put($response->json());
return redirect(route("sso.connect"));
}
public function connectUser(Request $request)
{
$access_token = $request->session()->get("access_token");
$response = Http::withHeaders([
"Accept" => "application/json",
"Authorization" => "Bearer " . $access_token
])->get(config("auth.sso_host") . "/api/user");
$userArray = $response->json();
try {
$email = $userArray['email'];
} catch (Throwable $th) {
return redirect("login")->withError("Failed to get login information! Try again.");
}
$user = User::where("email", $email)->first();
if (!$user) {
$user = new User;
$user->email = $userArray['email'];
$user->password = Hash::make($userArray['email']);
$user->terms_accepted = $userArray['terms_accepted'];
$user->save();
}
Auth::login($user);
$user->session_id = session()->getId();
$user->save();
return redirect(route("main"));
}
public function checkUserType(Request $request)
{
$email = $request->query('email');
$user = User::where('email', $email)->first();
if ($user && Hash::check($email, $user->password)) {
return response()->json(['type' => 'sso']);
} else {
return response()->json(['type' => 'legacy']);
}
}
public function checkIfUserExists(Request $request)
{
$email = $request->query('email');
$response = Http::withHeaders([
'Accept' => 'application/json',
])->get(config('auth.sso_host') . '/api/check-email', ['email' => $email]);
if ($response->successful() && isset($response->json()['exists'])) {
return response()->json(['exists' => $response->json()['exists']]);
} else {
Log::error('API Request Failed', [
'status' => $response->status(),
'body' => $response->body()
]);
return response()->json(['exists' => false, 'error' => 'API request failed']);
}
}
}