# æ件æå¡å¨ä½¿ç¨
## åå¤
- éç¨äºæå¡ç«¯è·åæ件æå¡å¨ä¸çæ件
- ä»æ件æå¡å¨è·ååé
ç clientIdï¼ä»¥å访é®æéçå¯é¥ï¼keyï¼
## ä¸ä¼
- éè¦å
·ææ件ä¸ä¼ æé
- éè¿ HTTP åè®®ä¸ä¼ æ件
- URL å°åï¼http(s)://\/attachments/upload/byform/{clientId}/{token}/{encrypt}
- clientIdï¼æ件æå¡å¨åé
ç»ç»ç«¯ç clientId
- tokenï¼ä»¤çï¼ä½¿ç¨ key ä½ä¸º secretï¼çæç TOTPï¼6 ä½æ°åï¼
- encryptï¼æ件æ¯å¦å å¯åå¨ï¼0 - ä¸å å¯ï¼ 1 - å å¯
## ä¸è½½
- éè¦å
·ææ件ä¸è½½æé
- ä½¿ç¨ HTTP åè®®ä¸è½½æ件
- URLå°åï¼http(s)://\/attachments/download/{fileId};c={clientId};t={tokenId}
- clientIdï¼æ件æå¡å¨åé
ç»ç»ç«¯ç clientId
- tokenï¼ä»¤çï¼ä½¿ç¨ key 对 fileId è¿è¡ HmacSHA1 计ç®ï¼å°å¾å°çå¼ä½ä¸º secretï¼çæç TOTPï¼6 ä½æ°åï¼
- fileIdï¼è¦è®¿é®çæ件ï¼å¦é访é®å¤ä¸ªæ件ï¼å¯ç¨","éå¼ fileIdï¼æ件å°å缩æZipæ ¼å¼è¿å
- è®¡ç® token ç Java 代ç 示ä¾å¦ä¸ï¼
```Java
byte[] fileIdInBytes = fileId.getBytes(Charset.forName("UTF-8"));
byte[] keyInBytes = Base64.getDecoder().decode(keyBase64);
SecretKey secretKey = new SecretKeySpec(keyInBytes, "HmacSHA1");
Mac mac = Mac.getInstance("HmacSHA1");
mac.init(secretKey);
byte[] hmacInBytes = mac.doFinal(fileIdInBytes);
// hmacInBytes ä½ä¸º secretï¼çæ TOTP
```
## TOTP计ç®
- TOTPï¼Time-based One Time Passwordï¼ï¼å³åºäºæ¶é´çä¸æ¬¡æ§å¯ç
- TOTP ç计ç®æ¹æ³éµå¾ª [RCF6238](https://tools.ietf.org/html/rfc6238)
- TOTP çæçå¯ç 为 6 ä½æ°åï¼æ¥é¿ä¸º 30 ç§ï¼æ¯ 30 ç§çæä¸ä¸ªå¯ç ï¼ï¼ææçªå£ä¸º 3ï¼å³ä¸æ¬¡æ§å¯ç 90 ç§å
ææ
- Java è¯è¨å¯ä½¿ç¨ä¾èµ com.warrenstrange:googleauth:1.2.0ï¼ææ´é«çå
¼å®¹çæ¬