package com.vincent.rsf.openApi.service.impl;
|
|
import com.vincent.rsf.openApi.security.service.AppAuthService;
|
import com.vincent.rsf.openApi.service.TokenService;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
import org.springframework.util.StringUtils;
|
|
import java.util.Map;
|
import java.util.UUID;
|
import java.util.concurrent.ConcurrentHashMap;
|
|
@Slf4j
|
@Service
|
public class TokenServiceImpl implements TokenService {
|
|
private static final long EXPIRE_MS = 60 * 60 * 1000L;
|
|
@Autowired
|
private AppAuthService appAuthService;
|
|
private final Map<String, Long> tokenExpire = new ConcurrentHashMap<>();
|
|
@Override
|
public String issueToken(String appId, String appSecret) {
|
if (!StringUtils.hasText(appId) || !StringUtils.hasText(appSecret)) {
|
return null;
|
}
|
if (!appAuthService.validateApp(appId, appSecret)) {
|
return null;
|
}
|
String token = UUID.randomUUID().toString().replace("-", "");
|
tokenExpire.put(token, System.currentTimeMillis() + EXPIRE_MS);
|
evictExpired();
|
return token;
|
}
|
|
@Override
|
public boolean validateToken(String token) {
|
if (!StringUtils.hasText(token)) {
|
return false;
|
}
|
Long expire = tokenExpire.get(token);
|
if (expire == null || System.currentTimeMillis() > expire) {
|
tokenExpire.remove(token);
|
return false;
|
}
|
return true;
|
}
|
|
private void evictExpired() {
|
long now = System.currentTimeMillis();
|
tokenExpire.entrySet().removeIf(e -> e.getValue() < now);
|
}
|
}
|