Bläddra i källkod

feat: 完成登录

DoggyZhang 4 månader sedan
förälder
incheckning
eccaf66d0b

+ 21 - 11
frame/network/build.gradle

@@ -10,9 +10,9 @@ ext {
     VERSION = '6.0.12'
 }
 
-if (project.FRAME_DEBUG != "true") {
-    apply from: "../../publish.gradle"
-}
+//if (project.FRAME_DEBUG != "true") {
+//    apply from: "../../publish.gradle"
+//}
 
 android {
     namespace 'com.adealink.frame.network'
@@ -56,14 +56,24 @@ dependencies {
     implementation libs.conscrypt
 
     //frame
-    compileOnly project(":external:retrofit")
-    compileOnly project(":frame:zero")
-    compileOnly project(":frame:base")
-    compileOnly project(":frame:data")
-    compileOnly project(":frame:coroutine")
-    compileOnly project(":frame:util")
-    compileOnly project(":frame:statistics")
-    compileOnly project(":frame:storage")
+    api platform(libs.frame.bom)
+    api libs.frame.retrofit
+    api libs.frame.zero
+    api libs.frame.base
+    api libs.frame.data
+    api libs.frame.coroutine
+    api libs.frame.util
+    api libs.frame.statistics
+    api libs.frame.storage
+
+//    compileOnly project(":external:retrofit")
+//    compileOnly project(":frame:zero")
+//    compileOnly project(":frame:base")
+//    compileOnly project(":frame:data")
+//    compileOnly project(":frame:coroutine")
+//    compileOnly project(":frame:util")
+//    compileOnly project(":frame:statistics")
+//    compileOnly project(":frame:storage")
 
     //test
     testImplementation libs.junit

+ 2 - 0
frame/network/src/main/java/com/adealink/frame/network/INetworkConfig.kt

@@ -25,6 +25,8 @@ interface INetworkConfig : INetControlListener, IAntiBanConfig {
 
     val loggedIn: Boolean
 
+    val signKey: String
+
     val token: String
 
     val languageCode: String

+ 2 - 5
frame/network/src/main/java/com/adealink/frame/network/data/Error.kt

@@ -2,11 +2,8 @@ package com.adealink.frame.network.data
 
 import com.adealink.frame.base.IError
 
-/**
- * Created by sunxiaodong on 2021/3/26.
- */
-
-const val SERVICE_SUCCESS = 200
+// TODO: 错误码要重新定义
+const val SERVICE_SUCCESS = 0
 
 //1000-1500:客户端,1501-1999:web
 const val C_ERROR_SOCKET_MSG_SEND_TIMEOUT = 1000

+ 82 - 27
frame/network/src/main/java/com/adealink/frame/network/http/interceptor/HttpCommonHeaderInterceptor.kt

@@ -1,30 +1,45 @@
 package com.adealink.frame.network.http.interceptor
 
-import com.adealink.frame.base.AppBase
 import com.adealink.frame.network.NetworkService
 import com.adealink.frame.network.ext.safeAdd
+import com.adealink.frame.util.getDeviceName
+import com.adealink.frame.util.md5
 import okhttp3.Headers
 import okhttp3.Interceptor
 import okhttp3.Request
+import okhttp3.RequestBody
 import okhttp3.Response
-import java.util.UUID
+import okio.Buffer
+import java.nio.charset.StandardCharsets
+import kotlin.random.Random
 
 const val KEY_TOKEN = "token"
 const val KEY_LANGUAGE_CODE = "language_code"
 const val KEY_LANG_COUNTRY_CODE = "lang_country_code"
-const val KEY_PACKAGE_NAME = "package_name"
-const val KEY_VERSION_CODE = "version_code"
+const val KEY_PACKAGE_NAME = "app"
+const val KEY_VERSION_CODE = "version"
 const val KEY_COUNTRY_CODE = "country_code"
 const val KEY_REGION = "region"
 const val KEY_DEVICE_ID = "device_id"
 const val KEY_NEW_DEVICE_ID = "new_device_id"
 const val KEY_X_PROTOCOL_ENCODE = "x-protocol-encode"
-const val KEY_DEVICE = "device" //设备类型: Android, iOS
-const val KEY_PLATFORM = "platform"
+const val KEY_DEVICE = "device" ////设备型号 string(256) ,示例值(xiaomi)
+const val KEY_PLATFORM = "platform" //平台(1=Android,2=Apple,3=H5,4=pc浏览器)
 const val KEY_FROM_PAGE = "from_page" //请求来自于哪一个页面
 const val KEY_CHANNEL = "channel"
-const val KEY_REQ_ID = "req_id"
+const val KEY_REQ_ID = "id"
 const val KEY_APP_NAME = "app_name"
+const val KEY_UDID = "udid"
+const val KEY_API = "api"
+
+const val KEY_NETWORK = "network" //网络类型.eg: 4g,5g,wifi,示例值(wifi)
+
+const val KEY_TIME = "time"
+
+const val KEY_CONTENT_TYPE = "Content-Type"
+const val ACCEPT_LANGUAGE = "Accept-Language"
+const val KEY_SIGN = "sign"
+
 
 class HttpCommonHeaderInterceptor : Interceptor {
     override fun intercept(chain: Interceptor.Chain): Response {
@@ -32,31 +47,71 @@ class HttpCommonHeaderInterceptor : Interceptor {
         val requestBuilder: Request.Builder = request.newBuilder()
         val headerBuilder: Headers.Builder = request.headers.newBuilder()
         val config = NetworkService.innerService.config
+
+        val currentTs = System.currentTimeMillis()
+        val deviceName = getDeviceName()
+        val headers = mutableMapOf<String, String>()
+
         if (config.loggedIn) {
-            headerBuilder
-                .safeAdd(KEY_TOKEN, config.token)
-                .safeAdd(KEY_DEVICE_ID, config.deviceId)
-                .safeAdd(KEY_NEW_DEVICE_ID, config.newDeviceId)
+            headers[KEY_TOKEN] = config.token
         }
-        headerBuilder
-            .safeAdd(KEY_PACKAGE_NAME, config.packageName)
-            .safeAdd(KEY_VERSION_CODE, config.versionCode)
-            .safeAdd(KEY_LANGUAGE_CODE, config.languageCode)
-            .safeAdd(KEY_LANG_COUNTRY_CODE, config.langCountryCode)
-            .safeAdd(KEY_COUNTRY_CODE, config.countryCode)
-            .safeAdd(KEY_REGION, config.userRegion)
-            .safeAdd(KEY_DEVICE, "Android")
-            .safeAdd(KEY_PLATFORM, "android")
-            .safeAdd(KEY_CHANNEL, config.channel)
-            .safeAdd(KEY_FROM_PAGE, config.currActivityName)
-            .safeAdd(KEY_REQ_ID, UUID.randomUUID().toString())
-            .safeAdd(KEY_APP_NAME, AppBase.appName)
-
-        config.getExtraHeaders()?.onEach {
-            headerBuilder.safeAdd(it.key, it.value)
+
+        headers[KEY_REQ_ID] = "$currentTs/${Random(100).nextInt()}/${deviceName}".md5()
+        headers[KEY_UDID] = config.deviceId
+        headers[KEY_PACKAGE_NAME] = config.packageName
+        headers[KEY_DEVICE] = deviceName
+        headers[KEY_PLATFORM] = "1"
+        headers[KEY_CHANNEL] = "official"
+        headers[KEY_API] = "1"
+        headers[KEY_VERSION_CODE] = config.versionCode
+        headers[KEY_NETWORK] = "5g"
+        headers[KEY_TIME] = currentTs.toString()
+        headers[KEY_CONTENT_TYPE] = "application/json"
+        headers[ACCEPT_LANGUAGE] = config.languageCode
+        headers.putAll(config.getExtraHeaders() ?: emptyMap())
+
+        val bodyString = getBodyString(request.body)
+        headers[KEY_SIGN] = getHeaderSign(headers, bodyString)
+        for ((key, value) in headers) {
+            headerBuilder.safeAdd(key, value)
         }
         requestBuilder.headers(headerBuilder.build())
         request = requestBuilder.build()
         return chain.proceed(request)
     }
+
+    /**
+     * 签名,签名算法:
+     * MD5(id+udid+app+device+platform+channel+api+version+network+time+token+secret[后端约定的密钥], body[请求体数据]) ,示例值(md5)
+     */
+    private fun getHeaderSign(headers: Map<String, String>, requestBody: String): String {
+        val mBuilder = StringBuilder()
+        mBuilder.append(headers[KEY_REQ_ID] ?: "")
+        mBuilder.append(headers[KEY_UDID] ?: "")
+        mBuilder.append(headers[KEY_PACKAGE_NAME] ?: "")
+        mBuilder.append(headers[KEY_DEVICE] ?: "")
+        mBuilder.append(headers[KEY_PLATFORM] ?: "")
+        mBuilder.append(headers[KEY_CHANNEL] ?: "")
+        mBuilder.append(headers[KEY_API] ?: "")
+        mBuilder.append(headers[KEY_VERSION_CODE] ?: "")
+        mBuilder.append(headers[KEY_NETWORK] ?: "")
+        mBuilder.append(headers[KEY_TIME] ?: "")
+        mBuilder.append(headers[KEY_TOKEN] ?: "")
+        mBuilder.append(NetworkService.innerService.config.signKey)
+        mBuilder.append(requestBody)
+        return mBuilder.toString().md5()
+    }
+
+    private fun getBodyString(requestBody: RequestBody?): String {
+        return requestBody?.let {
+            val buffer = Buffer()
+            it.writeTo(buffer)
+            var charset = StandardCharsets.UTF_8
+            val contentType = it.contentType()
+            if (contentType != null) {
+                charset = contentType.charset(charset)
+            }
+            buffer.readString(charset)
+        } ?: ""
+    }
 }