Explorar el Código

引入 jwt, 对 oss-store 的请求需要进行认证和授权

reghao hace 2 años
padre
commit
71c0282d01

+ 31 - 0
dfs-store/src/main/java/cn/reghao/dfs/store/rpc/OssServerServiceImpl.java

@@ -0,0 +1,31 @@
+package cn.reghao.dfs.store.rpc;
+
+import cn.reghao.dfs.store.util.JwtUtil;
+import cn.reghao.oss.api.constant.UploadChannel;
+import cn.reghao.oss.api.dto.OssPayload;
+import cn.reghao.oss.api.dto.ServerInfo;
+import cn.reghao.oss.api.iface.OssServerService;
+import org.apache.dubbo.config.annotation.DubboService;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author reghao
+ * @date 2023-08-01 14:54:23
+ */
+@DubboService
+@Service
+public class OssServerServiceImpl implements OssServerService {
+    @Override
+    public ServerInfo getServerInfo(long userId, int channelId) {
+        String action = "upload";
+        long expireAt = System.currentTimeMillis() + 3600*1000;
+        // String signKey = RandomString.getSalt(64);
+        String signKey = "oss.reghao.cn";
+        OssPayload ossPayload = new OssPayload(action, channelId, userId);
+        String token = JwtUtil.createToken(ossPayload, expireAt, signKey);
+
+        String ossUrl = "https://oss.reghao.cn/";
+        long maxSize = UploadChannel.getUploadChannel(channelId).getMaxSize();
+        return new ServerInfo(ossUrl, channelId, maxSize, token);
+    }
+}

+ 0 - 23
dfs-store/src/main/java/cn/reghao/dfs/store/rpc/TokenServiceImpl.java

@@ -1,23 +0,0 @@
-package cn.reghao.dfs.store.rpc;
-
-import cn.reghao.oss.api.iface.TokenService;
-import org.apache.dubbo.config.annotation.DubboService;
-import org.springframework.stereotype.Service;
-
-/**
- * @author reghao
- * @date 2023-08-01 14:54:23
- */
-@DubboService
-@Service
-public class TokenServiceImpl implements TokenService {
-    @Override
-    public String getToken() {
-        return null;
-    }
-
-    @Override
-    public String getToken(long userId) {
-        return null;
-    }
-}

+ 43 - 0
dfs-store/src/main/java/cn/reghao/dfs/store/util/JwtUtil.java

@@ -0,0 +1,43 @@
+package cn.reghao.dfs.store.util;
+
+import cn.reghao.oss.api.dto.OssPayload;
+import io.jsonwebtoken.Claims;
+import io.jsonwebtoken.Jwts;
+import io.jsonwebtoken.SignatureAlgorithm;
+
+import java.util.Date;
+
+/**
+ * JWT 令牌
+ *
+ * @author reghao
+ * @date 2023-08-23 09:10:58
+ */
+public class JwtUtil {
+    public static String createToken(OssPayload ossPayload, long expireAt, String signKey) {
+        return Jwts.builder()
+                .claim("action", ossPayload.getAction())
+                .claim("channelId", ossPayload.getChannelId())
+                .setSubject(String.valueOf(ossPayload.getUserId()))
+                .setExpiration(new Date(expireAt))
+                .signWith(SignatureAlgorithm.HS256, signKey)
+                .compact();
+    }
+
+    public static OssPayload getOssPayload(String token, String signKey) {
+        Claims claims = Jwts.parser().setSigningKey(signKey).parseClaimsJws(token).getBody();
+        String action = (String) claims.get("action");
+        int channelId = (Integer) claims.get("channelId");
+        String userIdStr = claims.getSubject();
+        return new OssPayload(action, channelId, Long.parseLong(userIdStr));
+    }
+
+    public static OssPayload getOssPayload(String token) {
+        String signKey = "oss.reghao.cn";
+        Claims claims = Jwts.parser().setSigningKey(signKey).parseClaimsJws(token).getBody();
+        String action = (String) claims.get("action");
+        int channelId = (Integer) claims.get("channelId");
+        String userIdStr = claims.getSubject();
+        return new OssPayload(action, channelId, Long.parseLong(userIdStr));
+    }
+}

+ 20 - 0
oss-api/src/main/java/cn/reghao/oss/api/dto/OssPayload.java

@@ -0,0 +1,20 @@
+package cn.reghao.oss.api.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.io.Serializable;
+
+/**
+ * @author reghao
+ * @date 2023-08-23 10:26:01
+ */
+@AllArgsConstructor
+@Getter
+public class OssPayload implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private String action;
+    private int channelId;
+    private Long userId;
+}

+ 21 - 0
oss-api/src/main/java/cn/reghao/oss/api/dto/ServerInfo.java

@@ -0,0 +1,21 @@
+package cn.reghao.oss.api.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.io.Serializable;
+
+/**
+ * @author reghao
+ * @date 2023-08-23 11:41:55
+ */
+@AllArgsConstructor
+@Getter
+public class ServerInfo implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private String ossUrl;
+    private int channelId;
+    private long maxSize;
+    private String token;
+}

+ 11 - 0
oss-api/src/main/java/cn/reghao/oss/api/iface/OssServerService.java

@@ -0,0 +1,11 @@
+package cn.reghao.oss.api.iface;
+
+import cn.reghao.oss.api.dto.ServerInfo;
+
+/**
+ * @author reghao
+ * @date 2023-08-01 14:51:50
+ */
+public interface OssServerService {
+    ServerInfo getServerInfo(long userId, int channelId);
+}

+ 0 - 10
oss-api/src/main/java/cn/reghao/oss/api/iface/TokenService.java

@@ -1,10 +0,0 @@
-package cn.reghao.oss.api.iface;
-
-/**
- * @author reghao
- * @date 2023-08-01 14:51:50
- */
-public interface TokenService {
-    String getToken();
-    String getToken(long userId);
-}