backend/src/main/java/dev/dinauer/maven/TokenIdentityProvider.java
2026-03-15 12:55:38 +01:00

57 lines
2.3 KiB
Java

package dev.dinauer.maven;
import dev.dinauer.maven.maven.token.TokenEntity;
import dev.dinauer.maven.maven.token.TokenRepo;
import io.quarkus.elytron.security.common.BcryptUtil;
import io.quarkus.security.AuthenticationFailedException;
import io.quarkus.security.identity.AuthenticationRequestContext;
import io.quarkus.security.identity.IdentityProvider;
import io.quarkus.security.identity.SecurityIdentity;
import io.quarkus.security.identity.request.TokenAuthenticationRequest;
import io.quarkus.security.identity.request.UsernamePasswordAuthenticationRequest;
import io.quarkus.security.runtime.QuarkusPrincipal;
import io.quarkus.security.runtime.QuarkusSecurityIdentity;
import io.smallrye.mutiny.Uni;
import io.smallrye.mutiny.infrastructure.Infrastructure;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.enterprise.context.control.ActivateRequestContext;
import jakarta.inject.Inject;
import java.time.LocalDate;
import java.util.Base64;
@ApplicationScoped
public class TokenIdentityProvider implements IdentityProvider<UsernamePasswordAuthenticationRequest>
{
@Inject
TokenRepo tokenRepo;
@Override
public Class<UsernamePasswordAuthenticationRequest> getRequestType()
{
return UsernamePasswordAuthenticationRequest.class;
}
@Override
@ActivateRequestContext
public Uni<SecurityIdentity> authenticate(UsernamePasswordAuthenticationRequest request, AuthenticationRequestContext authenticationRequestContext)
{
return Uni.createFrom().item(() -> {
String username = request.getUsername();
String password = new String(request.getPassword().getPassword());
for (TokenEntity token : tokenRepo.findByUserId(username))
{
if (BcryptUtil.matches(password, token.getToken()))
{
LocalDate now = LocalDate.now();
if (!now.isAfter(token.getExpiresAt()))
{
return (SecurityIdentity) QuarkusSecurityIdentity.builder().setPrincipal(new QuarkusPrincipal(token.getUserId())).build();
}
}
}
throw new AuthenticationFailedException();
}).runSubscriptionOn(Infrastructure.getDefaultWorkerPool());
}
}