From d723fee177238df0dbab80eb788876ebd154927d Mon Sep 17 00:00:00 2001
From: hxb <hxb@hdlchina.com.cn>
Date: 星期四, 24 十月 2024 11:55:46 +0800
Subject: [PATCH] Update HDLLoginInterceptor.java

---
 HDLLinkPMSdk/src/main/java/com/hdl/linkpm/sdk/core/interceptor/HDLLoginInterceptor.java |  199 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 199 insertions(+), 0 deletions(-)

diff --git a/HDLLinkPMSdk/src/main/java/com/hdl/linkpm/sdk/core/interceptor/HDLLoginInterceptor.java b/HDLLinkPMSdk/src/main/java/com/hdl/linkpm/sdk/core/interceptor/HDLLoginInterceptor.java
new file mode 100644
index 0000000..f3a5b53
--- /dev/null
+++ b/HDLLinkPMSdk/src/main/java/com/hdl/linkpm/sdk/core/interceptor/HDLLoginInterceptor.java
@@ -0,0 +1,199 @@
+package com.hdl.linkpm.sdk.core.interceptor;
+
+import android.text.TextUtils;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import com.google.gson.reflect.TypeToken;
+import com.hdl.hdlhttp.HxHttpConfig;
+import com.hdl.linkpm.sdk.core.api.HDLCloudUserApi;
+import com.hdl.linkpm.sdk.core.code.HDLCloudCode;
+import com.hdl.linkpm.sdk.core.response.BaseInfo;
+import com.hdl.linkpm.sdk.user.HDLLinkPMUser;
+import com.hdl.linkpm.sdk.user.bean.HDLLoginBean;
+import com.hdl.linkpm.sdk.utils.HDLGsonUtils;
+import com.hdl.linkpm.sdk.utils.HDLSDKLog;
+
+import java.io.IOException;
+import java.nio.charset.Charset;
+
+import okhttp3.Headers;
+import okhttp3.Interceptor;
+import okhttp3.MediaType;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.RequestBody;
+import okhttp3.Response;
+import okhttp3.ResponseBody;
+import okio.Buffer;
+import okio.BufferedSource;
+
+/**
+ * Created by Tong on 2021/11/2.
+ */
+public class HDLLoginInterceptor implements Interceptor {
+
+    private String TAG =HDLLoginInterceptor.class.getName();
+    @NonNull
+    @Override
+    public Response intercept(@NonNull Chain chain) throws IOException {
+        Request request = chain.request();
+        if (!isRefreshTokenHeader(request.headers())) {
+            String token = HDLLinkPMUser.getInstance().getAccessToken();
+            HDLSDKLog.i(TAG, "褰撳墠璇锋眰token锛�"+token);
+            if (!TextUtils.isEmpty(token)) {
+                Request processRequest = addToken(request, token);
+                Response processResponse = chain.proceed(processRequest);
+                return disposeToken(chain, processRequest, processResponse);
+            }
+        }
+        return chain.proceed(request);
+    }
+
+    @NonNull
+    private Response disposeToken(Chain chain, Request request, Response response) {
+        try {
+            HDLSDKLog.i(TAG, "鍝嶅簲Code锛�"+response.code());
+//            ResponseBody responseBody2 = response.body();
+//            BufferedSource source2 = responseBody2.source();
+//            source2.request(Long.MAX_VALUE);
+//            Buffer buffer2 = source2.getBuffer().clone();
+//            String respString2 = buffer2.readString(Charset.defaultCharset());
+            //http鏍囧噯鐘舵�佺爜
+            if (401 == response.code() || 402 == response.code() || 403 == response.code()) {
+                final String token = refreshToken();
+                if (!TextUtils.isEmpty(token)) {
+                    return chain.proceed(addToken(request, token));
+                }
+
+            } else if (response.isSuccessful()) {
+                ResponseBody responseBody = response.body();
+                if (responseBody != null) {
+                    BufferedSource source = responseBody.source();
+                    source.request(Long.MAX_VALUE);
+                    Buffer buffer = source.getBuffer().clone();
+                    String respString = buffer.readString(Charset.defaultCharset());
+                    JsonObject object = JsonParser.parseString(respString).getAsJsonObject();
+                    int code = object.get("code").getAsInt();
+                    //1.鍒ゆ柇token鏄惁杩囨湡鏄惁闇�瑕佸埛鏂皌oken
+                    if (isTokenTimeoutByCode(code)) {
+                        final String token = refreshToken();
+                        if (!TextUtils.isEmpty(token)) {
+                            return chain.proceed(addToken(request, token));
+                        }
+                    }
+                    //2.鍒ゆ柇Token鏄惁閿欒 鍙戦�佺櫥鍑哄鐞嗛�氱煡
+                    if (isTokenNeedReLoginByCode(code)) {
+                        //3.娓呯┖鐧诲綍淇℃伅骞跺彂鍑洪噸鏂扮櫥褰曢�氱煡
+                        HDLLinkPMUser.getInstance().logout(0);
+                    }
+                }
+
+            }
+
+        } catch (Exception e) {
+            Log.d("HDL===>", "disposeToken: 澶辫触," + e);
+        }
+        return response;
+    }
+
+    /**
+     * 鏍规嵁code鍒ゆ柇token鏄惁澶辨晥 闇�瑕佸埛鏂伴噸鏂皌oken
+     *
+     * @param code 涓氬姟code
+     * @return ture 澶辨晥
+     */
+    private boolean isTokenTimeoutByCode(int code) {
+        return HDLCloudCode.TOKEN_TIMEOUT == code;
+    }
+
+    /**
+     * 鏍规嵁code鍒ゆ柇token鏄惁澶辨晥 闇�瑕侀噸鏂扮櫥褰曠殑
+     *
+     * @param code 涓氬姟code
+     * @return ture 澶辨晥
+     */
+    private boolean isTokenNeedReLoginByCode(int code) {
+        return HDLCloudCode.RE_LOGIN == code
+                || HDLCloudCode.TOKEN_NOT_STANDARD == code
+                || HDLCloudCode.NO_TOKEN == code
+                || HDLCloudCode.CODE_TOKEN_ERROR_10006 == code
+                || HDLCloudCode.CODE_TOKEN_ERROR_10009 == code;
+    }
+
+
+    /**
+     * 鏄惁瀛樺湪鍒锋柊澶�
+     */
+    private boolean isRefreshTokenHeader(Headers headers) {
+        String signHeader = headers.get(HDLSmartHeader.REFRESH_TOKEN_HEADER);
+        return !TextUtils.isEmpty(signHeader);
+    }
+
+    private Request addToken(Request request, String token) {
+        return request.newBuilder()
+                .removeHeader("Authorization")
+                .build()
+                .newBuilder()
+                .method(request.method(), request.body())
+                .addHeader("Authorization", token)
+                .build();
+    }
+
+    /**
+     * 鎷︽埅鍣‥ncryptInterceptor浼氬鐞嗗姞瀵�
+     *
+     * @return token
+     */
+    private String refreshToken() {
+        final String cacheRefreshToken = HDLLinkPMUser.getInstance().getRefreshToken();
+        HDLSDKLog.i(TAG, "鍒锋柊Token,褰撳墠鍒锋柊Token鏄細"+cacheRefreshToken);
+        final String regionUrl = HDLCloudUserApi.getRequestUrl(HDLCloudUserApi.POST_LOGIN);
+        final OkHttpClient client = HxHttpConfig.getInstance().getClient();
+        Request.Builder builder = new Request.Builder();
+
+        final JsonObject json = new JsonObject();
+        json.addProperty("refreshToken", cacheRefreshToken);
+        json.addProperty("grantType", "refresh_token");
+
+        final RequestBody requestBody = RequestBody.create(json.toString(), MediaType.parse("application/json;charset=UTF-8"));
+        builder.post(requestBody);
+        builder.url(regionUrl);
+        builder.addHeader(HDLSmartHeader.REFRESH_TOKEN_HEADER, "0");
+        try {
+            Response response = client.newCall(builder.build()).execute();
+            if (response.isSuccessful()) {
+                ResponseBody responseBody = response.body();
+                if (responseBody != null) {
+                    BufferedSource source = responseBody.source();
+                    source.request(Long.MAX_VALUE);
+                    Buffer buffer = source.getBuffer().clone();
+                    String respString = buffer.readString(Charset.defaultCharset());
+                    BaseInfo<HDLLoginBean> baseInfo = HDLGsonUtils.fromJson(respString, new TypeToken<BaseInfo<HDLLoginBean>>() {
+                    }.getType());
+                    if (baseInfo != null) {
+                        HDLSDKLog.i(TAG, "鑾峰彇鍒板埛鏂癟oken鐨勬暟鎹紝鐘舵�佺爜锛�"+baseInfo.getCode());
+                        if (baseInfo.getCode() == HDLCloudCode.SUCCEED) {
+                            if (baseInfo.getData() != null) {
+                                HDLLoginBean loginBean = baseInfo.getData();
+                                HDLLinkPMUser.getInstance().updateRefreshToken(loginBean);
+                                return loginBean.getHeaderPrefix() + loginBean.getAccessToken();
+                            }
+                        } else {
+                            //refreshToken涔熻繃鏈熺殑璇濓紝鍒欏彂鍑虹櫥鍑哄鐞嗛�氱煡锛岄噸鏂扮櫥褰�
+                            //娓呯┖鐧诲綍淇℃伅骞跺彂鍑洪噸鏂扮櫥褰曢�氱煡
+                            HDLLinkPMUser.getInstance().logout(0);
+                        }
+                    }
+                }
+            }
+        } catch (Exception ignored) {
+            Log.d("HDL===>", "refreshToken: 澶辫触");
+        }
+        return "";
+    }
+}

--
Gitblit v1.8.0