You've already forked lubo_comment_query
webauthn登录逻辑调整
This commit is contained in:
@ -2,6 +2,7 @@
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\User;
|
||||
use App\WebAuthn\Repository\PublicKeyCredentialSourceRepositoryImpl;
|
||||
use App\WebAuthn\WebAuthnService;
|
||||
use Cose\Algorithm\Manager;
|
||||
@ -32,11 +33,6 @@ use Webauthn\TokenBinding\IgnoreTokenBindingHandler;
|
||||
|
||||
class UserWebAuthnController extends BaseController
|
||||
{
|
||||
public function webauthn_login(Request $request)
|
||||
{
|
||||
return view("user.webauthn.login");
|
||||
}
|
||||
|
||||
public function register_options(Request $request): PublicKeyCredentialCreationOptions
|
||||
{
|
||||
$userEntity = new PublicKeyCredentialUserEntity(
|
||||
@ -49,17 +45,44 @@ class UserWebAuthnController extends BaseController
|
||||
return WebAuthnService::createRequestOptions($userEntity, $challenge);
|
||||
}
|
||||
|
||||
public function login_options(Request $request): PublicKeyCredentialRequestOptions
|
||||
public function login_options(Request $request)
|
||||
{
|
||||
$challenge = random_bytes(32);
|
||||
$request->session()->put("webauthn_login_challenge", $challenge);
|
||||
$username = $request->post("username", "");
|
||||
if ($username) {
|
||||
$query = User::query();
|
||||
if (str_contains($username, "@")) {
|
||||
$query->where("email", "=", $username);
|
||||
} else {
|
||||
$query->where("name", "=", $username);
|
||||
}
|
||||
$user = $query->first();
|
||||
if ($user) {
|
||||
$userHandle = (string) $user->id;
|
||||
} else {
|
||||
return new Response([
|
||||
"success" => false,
|
||||
"code" => 401,
|
||||
"message" => "无此用户"
|
||||
], 401);
|
||||
}
|
||||
} else {
|
||||
$userHandle = "0";
|
||||
}
|
||||
$request->session()->put("webauthn_login_user", $userHandle);
|
||||
$publicKeyCredentialRequestOptions = new PublicKeyCredentialRequestOptions(
|
||||
$challenge
|
||||
);
|
||||
$publicKeyCredentialRequestOptions->setUserVerification(
|
||||
PublicKeyCredentialRequestOptions::USER_VERIFICATION_REQUIREMENT_REQUIRED
|
||||
);
|
||||
$publicKeyCredentialRequestOptions->allowCredentials([]);
|
||||
$publicKeyCredentialSources = WebAuthnService::getPublicKeyCredentialSourceRepository()->findAllForUserEntity(
|
||||
new PublicKeyCredentialUserEntity("", $userHandle, "")
|
||||
);
|
||||
array_map(function ($source) use ($publicKeyCredentialRequestOptions) {
|
||||
$publicKeyCredentialRequestOptions->allowCredential($source->getPublicKeyCredentialDescriptor());
|
||||
} ,$publicKeyCredentialSources);
|
||||
return $publicKeyCredentialRequestOptions;
|
||||
}
|
||||
|
||||
@ -120,7 +143,24 @@ class UserWebAuthnController extends BaseController
|
||||
$publicKeyCredentialRequestOptions = new PublicKeyCredentialRequestOptions(
|
||||
$request->session()->remove("webauthn_login_challenge")
|
||||
);
|
||||
$publicKeyCredentialSources = WebAuthnService::getPublicKeyCredentialSourceRepository()->findAllForUserEntity(
|
||||
new PublicKeyCredentialUserEntity("", "0", "")
|
||||
);
|
||||
$publicKeyCredential = WebAuthnService::getPublicKeyCredentialLoader()->loadArray($request->json()->all());
|
||||
$userHandle = null;
|
||||
foreach ($publicKeyCredentialSources as $source) {
|
||||
if ($source->getPublicKeyCredentialId() === $publicKeyCredential->getRawId()) {
|
||||
$userHandle = $source->getUserHandle();
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ($userHandle === null) {
|
||||
return new Response([
|
||||
"success" => false,
|
||||
"code" => 401,
|
||||
"message" => "无此密钥"
|
||||
], 401);
|
||||
}
|
||||
$authenticatorAssertionResponse = $publicKeyCredential->getResponse();
|
||||
if (!$authenticatorAssertionResponse instanceof AuthenticatorAssertionResponse) {
|
||||
//e.g. process here with a redirection to the public key login/MFA page.
|
||||
@ -136,7 +176,7 @@ class UserWebAuthnController extends BaseController
|
||||
$authenticatorAssertionResponse,
|
||||
$publicKeyCredentialRequestOptions,
|
||||
ServerRequest::fromGlobals(),
|
||||
$authenticatorAssertionResponse->getUserHandle(),
|
||||
$userHandle,
|
||||
["localhost"]
|
||||
);
|
||||
} catch (\Throwable $e) {
|
||||
|
Reference in New Issue
Block a user