Токен JWT io.jsonwebtoken.ExpiredJwtException: срок действия JWT истекJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Токен JWT io.jsonwebtoken.ExpiredJwtException: срок действия JWT истек

Сообщение Anonymous »

У меня есть приложение Spring Boot (с Angular).
Мое приложение работает нормально локально, но когда я Dockerize свое приложение, выдается ошибка, когда мне нужно зарегистрировать нового пользователя: срок действия токена истек.
Вопрос, который предполагает, почему при запуске в IDE все работает хорошо и никаких проблем не отображается.
application.yml:
spring:
datasource:
url: ${SPRING_DATASOURCE_URL}
username: ${SPRING_DATASOURCE_USERNAME}
password: ${SPRING_DATASOURCE_PASSWORD}
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
hibernate:
ddl-auto: update
show-sql: true
properties:
hibernate:
dialect: org.hibernate.dialect.MySQLDialect

server:
port: 8083

application:
security:
jwt:
secret-key: ${JWT_SECRET_KEY}
expiration: 86400000000000000000
refresh-token:
expiration: 86400000000000000000

mail:
host: smtp.gmail.com
port: 587
username: ${MAIL_USERNAME}
password: ${MAIL_PASSWORD}
properties:
mail:
smtp:
auth: true
starttls.enable: true


docker-compose.yml:
version: '3.8'
services:
backend:
image: communicationbackend
ports:
- "8083:8083"
environment:
SPRING_DATASOURCE_URL: ${SPRING_DATASOURCE_URL}
SPRING_DATASOURCE_USERNAME: ${DB_USERNAME} # Correct variable name
SPRING_DATASOURCE_PASSWORD: ${DB_PASSWORD} # Correct variable name
JWT_SECRET_KEY: ${JWT_SECRET_KEY}
MAIL_USERNAME: ${MAIL_USERNAME}
MAIL_PASSWORD: ${MAIL_PASSWORD}
depends_on:
- db
networks:
- app-network
env_file:
- .env # Charge les variables d'environnement

frontend:
image: ramzi/frontend
ports:
- "82:80"
networks:
- app-network

db:
image: mysql:5.7
environment:
MYSQL_DATABASE: db-communication
MYSQL_ROOT_PASSWORD: root
MYSQL_USER: ${DB_USERNAME}
MYSQL_PASSWORD: ${DB_PASSWORD}
ports:
- "3307:3306"
volumes:
- db_data:/var/lib/mysql
networks:
- app-network
env_file:
- .env

volumes:
db_data:

networks:
app-network:

application.yml:
spring:
datasource:
url: ${SPRING_DATASOURCE_URL}
username: ${SPRING_DATASOURCE_USERNAME}
password: ${SPRING_DATASOURCE_PASSWORD}
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
hibernate:
ddl-auto: update
show-sql: true
properties:
hibernate:
dialect: org.hibernate.dialect.MySQLDialect

server:
port: 8083

application:
security:
jwt:
secret-key: ${JWT_SECRET_KEY}
expiration: 8640000000
refresh-token:
expiration: 864000000

mail:
host: smtp.gmail.com
port: 587
username: ${MAIL_USERNAME}
password: ${MAIL_PASSWORD}
properties:
mail:
smtp:
auth: true
starttls.enable: true

.env:
# Variables de la base de données
DB_USERNAME=communication
DB_PASSWORD=password
SPRING_DATASOURCE_URL=jdbc:mysql://db:3306/db-communication

# JWT secret
JWT_SECRET_KEY=IS/A4dZ9K2z5tQSV3eGK2i4RGNdiD7qbGGTNq9xUZqO4pqa8+BIan+scnhFPz15pSFWkTGve4YNxWHXt90U5Tg==

# Configurations de l'email
MAIL_USERNAME=****************
MAIL_PASSWORD=***************

Запускаю свои Docker-контейнеры, все работает. Я получаю доступ к своему интерфейсу, он открыт, когда мне нужно зарегистрироваться:
Failed to load resource: the server responded with a status of 403 ()
:8083/PlatformCommunication/v1/register:1
Failed to load resource: the server responded with a status of 403 ()

Как это исправить?
jwtservice:
@Service
public class JwtService {

@Value("${application.security.jwt.secret-key}")
private String secretKey; // Injecting the secret key from application.yml

@Value("${application.security.jwt.expiration}")
private long jwtExpiration;

@Value("${application.security.jwt.refresh-token.expiration}")
private long refreshExpiration;

public String extractUsername(String token) {
return extractClaim(token, Claims::getSubject);
}

public T extractClaim(String token, Function claimsResolver) {
final Claims claims = extractAllClaims(token);
return claimsResolver.apply(claims);
}

public String generateToken(UserDetails userDetails) {
return generateToken(new HashMap(), userDetails);
}

public String generateToken(
Map extraClaims,
UserDetails userDetails
) {
return buildToken(extraClaims, userDetails, jwtExpiration);
}

public String generateRefreshToken(
UserDetails userDetails
) {
return buildToken(new HashMap(), userDetails, refreshExpiration);
}

private String buildToken(
Map extraClaims,
UserDetails userDetails,
long expiration
) {
return Jwts
.builder()
.setClaims(extraClaims)
.setSubject(userDetails.getUsername())
.setIssuedAt(new Date(System.currentTimeMillis()))
.setExpiration(new Date(System.currentTimeMillis() + expiration))
.signWith(getSignInKey(), SignatureAlgorithm.HS256)
.compact();
}

public boolean isTokenValid(String token, UserDetails userDetails) {
final String username = extractUsername(token);
return (username.equals(userDetails.getUsername())) && !isTokenExpired(token);
}

public boolean isTokenExpired(String token) {
return extractExpiration(token).before(new Date());
}

public Date extractExpiration(String token) {
return extractClaim(token, Claims::getExpiration);
}

private Claims extractAllClaims(String token) {
return Jwts
.parserBuilder()
.setSigningKey(getSignInKey())
.build()
.parseClaimsJws(token)
.getBody();
}

private Key getSignInKey() {
byte[] keyBytes = Decoders.BASE64.decode(secretKey);
return Keys.hmacShaKeyFor(keyBytes);
}
}


Подробнее здесь: https://stackoverflow.com/questions/791 ... wt-expired
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»