P15GEN2\59518
2024-05-29 d4210c7c4b04abde20037ea8aa0f54ef8a2649aa
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package foundation.icall.callout;
 
import java.util.Date;
 
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.RSA;
import foundation.action.ActionContext;
import foundation.dao.bizlogic.ResponseType;
import foundation.icall.ICall;
import foundation.util.Util;
 
 
public class WeaverSource extends HttpServerSource {
    
    private static WeaverSource instance;
    private static int TimeOutMinute = 3;
    private static String monitorId = "OAWeaverSource";
    public Date lastTime;
    private String secrit;
    private String spk;
    private String secret;
    private String token;
    
    private WeaverSource() {
        
    }
    
    public static synchronized WeaverSource getInstance() {
        if (instance == null) {
            instance = new WeaverSource();
        }
        
        return instance;
    }
 
    @Override
    public void login(ActionContext context, ICall iCall) throws Exception {
        if (!tokenExpired()) {
            return;
        }
        
        //1. 获取 SECRIT 与 SPK 
        getSecritAndSPK();
        
        //2. 根据 SECRIT 生成 secret
        createSecret();
        
        //3. 获取 token
        getToken();
    }
 
    @Override
    public void logout(ActionContext context, ICall iCall) throws Exception {
        
    }
 
    @Override
    public ICallRequest createRequest(String url) {
        ICallRequest request = new ICallRequest(meta.getString("url") + url);
 
        request.addHeader("appid", meta.getString("appid"));
        request.addHeader("userid", "JMXQXwgBWWfNHuoIsLJXIfkK5bEEEi7GxTJHsB8yX/ahRHATKsDZl265NvQedxHo8W8coSZQd1BRCnd69hp5UZIss17Rf0U0oGmJqKzMqKlE2gejV9R1a/NJkKiTHXjkPd2wu4U/92eHusLbokwo4sxS8Upw5uJDiYNOFk6RKwGU5O4oreKRSdxPwbBSy3c93BYZO2kNxTdnHyWvA4K+mZ/k79+qqAVVVJjpX9TIvHfMaUkO7Zb2Qs73VuC36MsB8u73cw0v93INaYuhMy5Sx2/4VsNqJ7WFGCFTYw/Z/zcp2FyzUeVSRPBYjWDwwVnhxrExfF7GXp/rg9n4IcImdA==");
        request.addHeader("token", token);
        request.addHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
        
        return request;
    }
    
    private boolean tokenExpired() {
        if (Util.isEmpty(token)) {
            return true;
        }
        
        Date now = new Date();
        boolean result = now.getTime() - lastTime.getTime() >= TimeOutMinute * 60 * 1000;
        
        logger.info("是否重新获取token:{}, 上次获取token时间:{}, 本次获取token时间:{}", result, lastTime, now);
        
        return result;
    }
 
    private void getSecritAndSPK() throws Exception {
        //1. 创建请求
        ICallRequest request = new ICallRequest(meta.getString("url") + "api/ec/dev/auth/regist");
        
        request.addHeader("appid", meta.getString("appid"));
        request.addHeader("cpk", meta.getString("cpk"));
 
        request.addFormData("loginid", meta.getString("loginId"));
        request.addFormData("userpassword", meta.getString("userPassword"));
        
        //2. 获取 response
        JSONResponse response = post(request, ResponseType.JSON);
        
        if (response == null || response.hasErrors()) {
            return;
        }
        
        secrit = response.getString("secrit");
        spk = response.getString("spk");
    }
 
    private void createSecret() throws Exception {
        if (Util.isEmpty(spk) || Util.isEmpty(secrit)) {
            logger.error("weaver source can not create secret, for empty spk or secrit");
            return;
        }
        
        RSA rsa = new RSA(null, spk);
        secret = rsa.encryptBase64(secrit, KeyType.PublicKey);
    }
 
    private void getToken() throws Exception {
        //1. 创建请求
        ICallRequest request = new ICallRequest(meta.getString("url") + "api/ec/dev/auth/applytoken");
        
        request.addHeader("appid", meta.getString("appid"));
        request.addHeader("secret", secret);
 
        //2. 获取 response
        JSONResponse body = post(request, ResponseType.JSON);
        
        if (body == null) {
            return;
        }
        
        token = body.getString("token");
        lastTime = new Date();
    }
 
    public String getName() {
        return meta.getName();
    }
}