Micronaut config not issuing a JWT refresh token

Viewed 496

I have the following config in my application.yml. According to the specs this should issue a refresh token besides the access token in the JWT response, but I get just the access token and not the refresh one.

Am I missing something?

token:
  jwt:
    signatures:
      secret:
        generator:
          refresh-token:
            secret: "${JWT_GENERATOR_SIGNATURE_SECRET:pleaseChangeThisSecretForANewOne}"  
          secret: "${JWT_GENERATOR_SIGNATURE_SECRET:pleaseChangeThisSecretForANewOne}"     
2 Answers

You are probably missing an implementation of RefreshTokenPersistence.

I'd suggest you to read this section of micronaut's security docs: https://micronaut-projects.github.io/micronaut-security/latest/guide/#refresh

Here is a very very naive implementation of the persistence unit. Please do not forget to add @Singleton to your implementation. I was missing exactly that, which was the reason why micronaut did not generate a refresh token at first in my own project.

import io.micronaut.security.authentication.UserDetails;
import io.micronaut.security.token.event.RefreshTokenGeneratedEvent;
import io.micronaut.security.token.refresh.RefreshTokenPersistence;
import io.reactivex.BackpressureStrategy;
import io.reactivex.Flowable;
import org.reactivestreams.Publisher;

import javax.inject.Singleton;
import java.util.HashMap;
import java.util.Map;

@Singleton
public class MyRefreshTokenPersistence implements RefreshTokenPersistence {

    private final Map<String, UserDetails> storage = new HashMap<>();

    @Override
    public void persistToken(RefreshTokenGeneratedEvent event) {
        storage.put(event.getRefreshToken(), event.getUserDetails());
    }

    @Override
    public Publisher<UserDetails> getUserDetails(String refreshToken) {
        return Flowable.create(emitter -> {
            final UserDetails userDetails = storage.get(refreshToken);
            if ( userDetails != null ) {
                emitter.onNext(userDetails);
                emitter.onComplete();
            } else {
                emitter.onError(new IllegalArgumentException("refresh token unknown"));
            }
        }, BackpressureStrategy.BUFFER);
    }
}

I found this issue with Micronaut v3.1.4. It needs a class that implements RefreshTokenPersistence. This worked for me.

import io.micronaut.security.authentication.Authentication;
import io.micronaut.security.token.event.RefreshTokenGeneratedEvent;
import io.micronaut.security.token.refresh.RefreshTokenPersistence;
import jakarta.inject.Singleton;
import org.reactivestreams.Publisher;

@Singleton
public class CustomRefreshTokenPersistence implements RefreshTokenPersistence {

    @Override
    public void persistToken(final RefreshTokenGeneratedEvent event) {
   
    }

    @Override
    public Publisher<Authentication> getAuthentication(final String refreshToken) {
        return null;
    }
}
Related