mirror of
https://github.com/ysoftdevs/oauth-playground-server.git
synced 2026-04-26 18:38:36 +02:00
WIP webauthn - fix a security issue when anyone could register a new credential in existing user's name
This commit is contained in:
@@ -19,7 +19,7 @@ public record User(String login, String password, List<WebAuthnCredential> crede
|
|||||||
List<WebAuthnCredential> newCredentials;
|
List<WebAuthnCredential> newCredentials;
|
||||||
if (existing.isPresent()) {
|
if (existing.isPresent()) {
|
||||||
// TODO need to decide if immutable or not
|
// TODO need to decide if immutable or not
|
||||||
existing.get().counter++;
|
existing.get().counter = webAuthnCredential.counter;
|
||||||
newCredentials = credentials;
|
newCredentials = credentials;
|
||||||
} else {
|
} else {
|
||||||
newCredentials = new ArrayList<>(credentials);
|
newCredentials = new ArrayList<>(credentials);
|
||||||
|
|||||||
@@ -55,11 +55,23 @@ public class MyWebAuthnSetup implements WebAuthnUserProvider {
|
|||||||
@Override
|
@Override
|
||||||
public Uni<Void> updateOrStoreWebAuthnCredentials(Authenticator authenticator) {
|
public Uni<Void> updateOrStoreWebAuthnCredentials(Authenticator authenticator) {
|
||||||
WebAuthnCredential credential1 = new WebAuthnCredential(authenticator);
|
WebAuthnCredential credential1 = new WebAuthnCredential(authenticator);
|
||||||
usersRepo.getUser(authenticator.getUserName())
|
|
||||||
.ifPresentOrElse(
|
var existingUser = usersRepo.getUser(authenticator.getUserName());
|
||||||
user -> usersRepo.register(user.withAddedCredential(credential1)),
|
var existingCredential = existingUser.stream().flatMap(u -> u.credentials().stream())
|
||||||
() -> usersRepo.register(new User(authenticator.getUserName(), null, List.of(credential1)))
|
.filter(c -> authenticator.getCredID().equals(c.credID)).findAny();
|
||||||
);
|
|
||||||
return Uni.createFrom().nullItem();
|
if (existingUser.isPresent() && existingCredential.isPresent()) {
|
||||||
|
// returning user and credential -> update counter
|
||||||
|
usersRepo.register(existingUser.get().withAddedCredential(existingCredential.get()));
|
||||||
|
return Uni.createFrom().nullItem();
|
||||||
|
} else if (existingUser.isEmpty()) {
|
||||||
|
// new user -> register
|
||||||
|
usersRepo.register(new User(authenticator.getUserName(), null, List.of(credential1)));
|
||||||
|
return Uni.createFrom().nullItem();
|
||||||
|
} else {
|
||||||
|
// returning (or duplicate) user with new credential -> reject,
|
||||||
|
// as we do not provide a means to register additional credentials yet
|
||||||
|
return Uni.createFrom().failure(new Throwable("Duplicate user"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user