沙钢智慧能源系统后端代码
dengzedong
2024-12-06 3216ed3fb2d9dc9cf61da21bda3175e66ec46426
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
135
136
137
138
139
140
141
142
143
144
145
package com.iailab.module.shasteel.util.token;
 
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;
import org.springframework.util.Base64Utils;
import org.springframework.util.ObjectUtils;
import org.springframework.web.client.RestTemplate;
 
import java.nio.charset.StandardCharsets;
import java.util.Map;
 
/**
 * @author PanZhibao
 * @Description
 * @createTime 2024年11月21日
 */
@Slf4j
@Component
public class IailabClient {
 
    /**
     * 平台地址
     */
    @Value("${iailab.token.base-url}")
    private String BASE_URL;
 
    /**
     * 租户编号
     */
    @Value("${iailab.token.tenant-id}")
    private String TENANT_ID;
 
    /**
     * 客户端信息
     */
    @Value("${iailab.token.client-id}")
    private String CLIENT_ID;
    @Value("${iailab.token.client-secret}")
    private String CLIENT_SECRET;
    @Value("${iailab.token.username}")
    private String USERNAME;
    @Value("${iailab.token.password}")
    private String PASSWORD;
    private static final String GRAND_TYPE = "password";
    private static final String SCOPE = "user.read user.write";
 
 
    private static final RestTemplate restTemplate = new RestTemplate();
 
    // 鉴权token
    private String accessToken;
    // 刷新token
    private String refreshToken;
    // 鉴权token过期时间
    private Long expireTime;
 
    /**
     * 用户名密码方式获取平台token
     */
    private synchronized void authenticate() {
        log.info("获取平台token");
        // 1.1 构建请求头
        HttpHeaders headers = new HttpHeaders();
        addClientHeader(headers);
        // 1.2 构建authenticate请求URL
        String authenticateUrl = BASE_URL + "/oauth2/token?"
                // 密码模式的参数
                + "grant_type=" + GRAND_TYPE
                + "&username=" + USERNAME
                + "&password=" + PASSWORD
                + "&scope=" + SCOPE;
        // 2. 执行请求
        ResponseEntity<Map<String, Object>> exchange = restTemplate.exchange(
                authenticateUrl,
                HttpMethod.POST,
                new org.springframework.http.HttpEntity<>(headers),
                new ParameterizedTypeReference<Map<String, Object>>() {
                });
        Assert.isTrue(exchange.getStatusCode().is2xxSuccessful(), "响应必须是 200 成功");
        log.info(exchange.toString());
        Map<String, Object> authMap = exchange.getBody();
        accessToken = authMap.get("access_token").toString();
        refreshToken = authMap.get("refresh_token").toString();
        expireTime = Long.valueOf(authMap.get("expires_time").toString());
    }
 
    private synchronized void refreshToken() {
        log.info("刷新token");
        // 1.1 构建请求头
        HttpHeaders headers = new HttpHeaders();
        addClientHeader(headers);
        // 1.2 构建authenticate请求URL
        String authenticateUrl = BASE_URL + "/system/auth/client-refresh-token?refreshToken=" + refreshToken
                + "&clientId=" + CLIENT_ID;
        // 2. 执行请求
        ResponseEntity<Map<String, Object>> exchange = restTemplate.exchange(
                authenticateUrl,
                HttpMethod.POST,
                new org.springframework.http.HttpEntity<>(headers),
                new ParameterizedTypeReference<Map<String, Object>>() {
                });
        Assert.isTrue(exchange.getStatusCode().is2xxSuccessful(), "响应必须是 200 成功");
        Map<String, Object> authMap = exchange.getBody();
        //刷新token过期,重新获取token
        if (!ObjectUtils.isEmpty(authMap.get("code"))) {
            Integer code = Integer.valueOf(authMap.get("code").toString());
            if (code == 401) {
                authenticate();
            }
        } else {
            accessToken = authMap.get("access_token").toString();
            expireTime = Long.valueOf(authMap.get("expires_time").toString());
        }
    }
 
    private void addClientHeader(HttpHeaders headers) {
        // client 拼接,需要 BASE64 编码
        String client = CLIENT_ID + ":" + CLIENT_SECRET;
        client = Base64Utils.encodeToString(client.getBytes(StandardCharsets.UTF_8));
        headers.add("Authorization", "Basic " + client);
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
        headers.set("tenant-id", getTenantId().toString());
    }
 
    public String getToken() {
        //第一次请求或者token过期,需要重新获取token
        if(ObjectUtils.isEmpty(accessToken)) {
            authenticate();
        } else if (expireTime < System.currentTimeMillis() / 1000) {
            refreshToken();
        }
        
        return accessToken;
    }
    public Long getTenantId() {
        return Long.valueOf(TENANT_ID);
    }
}