| app/src/main/java/com/xw/yunwei/net/UserApi.kt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| app/src/main/java/com/xw/yunwei/net/UserRepository.kt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| app/src/main/java/com/xw/yunwei/net/interceptor/YiHuHeaderInterceptor.kt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| app/src/main/java/com/xw/yunwei/ui/user/login/LoginVM.kt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| common/src/main/java/com/xw/common/net/interceptor/HeaderInterceptor.kt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
app/src/main/java/com/xw/yunwei/net/UserApi.kt
@@ -15,6 +15,7 @@ import retrofit2.Call import retrofit2.http.Body import retrofit2.http.GET import retrofit2.http.Header import retrofit2.http.POST import retrofit2.http.Path import retrofit2.http.Query @@ -30,6 +31,14 @@ @POST("account/maintenance-app/base/v1/verificationCodeLogin") fun loginByCode(@Body body: RequestBody): Call<HttpResponse<LoginModel>> /*通过第三方token登录*/ @GET("account/ssoAuthSdk/appLogin") fun loginByThirdToken( @Query("deviceType") deviceType: Int, @Header("customHeader") customHeader: String = "1", @Header("Authorization") Authorization: String ): Call<HttpResponse<LoginModel>> /*获取手机验证码*/ @POST("account/maintenance-app/base/v1/getVerificationCode") fun getVerificationCode(@Body body: RequestBody): Call<HttpResponse<Any>> app/src/main/java/com/xw/yunwei/net/UserRepository.kt
@@ -15,6 +15,10 @@ suspend fun loginByCode(map: Map<String, Any?>) = api.loginByCode(getBody(map)).interceptAwait() /*通过第三方token登录*/ suspend fun loginByThirdToken(token: String) = api.loginByThirdToken(deviceType = 1, Authorization = token).interceptAwait() suspend fun modifierPsw(map: Map<String, Any?>) = api.modifierPsw(getBody(map)).interceptAwait() suspend fun read(id: Long) = api.read(id).interceptAwait() suspend fun getAppPermission() = api.getAppPermission().interceptAwait() app/src/main/java/com/xw/yunwei/net/interceptor/YiHuHeaderInterceptor.kt
@@ -9,10 +9,10 @@ import okhttp3.Response import okio.Buffer import java.nio.charset.StandardCharsets import java.util.Locale import javax.crypto.Mac import javax.crypto.SecretKey import javax.crypto.spec.SecretKeySpec //翼虎网络接口header拦截器 class YiHuHeaderInterceptor : Interceptor { @@ -20,7 +20,6 @@ override fun intercept(chain: Interceptor.Chain): Response { val original = chain.request() val publicHeader = mutableMapOf( "Content-Type" to "application/json", "XT-Client-Type" to "Android", "XT-DeviceId" to DeviceId.get(), "XT-Nonce" to System.currentTimeMillis().toString(), @@ -47,11 +46,9 @@ }.toMutableMap() map.putAll(publicHeader) val body = original.body when { body is FormBody -> { (0 until body.size).forEach { map[body.name(it)] = body.value(it) } if (body is FormBody) { (0 until body.size).forEach { map[body.name(it)] = body.value(it) } } //第1步,生成parameter @@ -76,40 +73,32 @@ Log.d(TAG, "intercept: strToSign:${strToSign}") // 第4步. 最终签名值 val sign = encryptHmacSHA256(strToSign) Log.d(TAG, "intercept: sign:${sign}") publicHeader["XT-Signature"] = sign publicHeader["Content-Type"] = "application/json" val request = original.newBuilder() publicHeader.forEach { (key, value) -> request.addHeader(key, value) } return chain.proceed(request.build()) } // 签名入口, data - 需要签名的字符串; secretKey - private fun encryptHmacSHA256(data: String): String { val encodedData = encryptHmac(data, BuildConfig.YIHU_APP_SECRET, "HmacSHA256") ?: return "" return byte2hexString(encodedData) } private fun encryptHmac(data: String, secret: String, algorithm: String?): ByteArray? { fun encryptHmacSHA256(data: String): String { try { val secretKey: SecretKey = SecretKeySpec(secret.toByteArray(StandardCharsets.UTF_8), algorithm) val mac = Mac.getInstance(secretKey.algorithm) mac.init(secretKey) return mac.doFinal(data.toByteArray(StandardCharsets.UTF_8)) } catch (e: Exception) { e.printStackTrace() } return null } private fun byte2hexString(bytes: ByteArray): String { val sign = StringBuilder() for (aByte in bytes) { val hex = Integer.toHexString(aByte.toInt() and 0xFF) if (hex.length == 1) { sign.append('0') val key: SecretKey = SecretKeySpec( BuildConfig.YIHU_APP_SECRET.toByteArray(StandardCharsets.UTF_8), "HmacSHA256" ) val mac = Mac.getInstance(key.algorithm) mac.init(key) val sig = mac.doFinal(data.toByteArray(StandardCharsets.UTF_8)) val hex = java.lang.StringBuilder(sig.size * 2) for (b in sig) { hex.append(Character.forDigit((b.toInt() shr 4) and 0xF, 16)) hex.append(Character.forDigit(b.toInt() and 0xF, 16)) } sign.append(hex.lowercase(Locale.getDefault())) return hex.toString() } catch (e: Exception) { throw RuntimeException(e) } return sign.toString() } } app/src/main/java/com/xw/yunwei/ui/user/login/LoginVM.kt
@@ -4,7 +4,6 @@ import android.os.CountDownTimer import android.view.View import androidx.lifecycle.MutableLiveData import com.amap.location.support.util.TextUtils import com.xw.common.Constants import com.xw.common.base.BaseViewModel import com.xw.common.utils.KeyPreferences @@ -13,7 +12,6 @@ import com.xw.yunwei.MyApp import com.xw.yunwei.R import com.xw.yunwei.model.AgreeInfo import com.xw.yunwei.model.YiHuLoginInfo import com.xw.yunwei.net.UserRepository import com.xw.yunwei.net.YiHuRepository import com.xw.yunwei.ui.MainActivity @@ -80,12 +78,7 @@ onCollect = { yiHuData -> yiHuData?.let { launchRequest(tips = "登录中...") { val map = mapOf( "phoneNumber" to phone.value, "verificationCode" to code.value, "deviceType" to 1 ) val data = userRepository.loginByCode(map) val data = userRepository.loginByThirdToken(yiHuData.access_token!!) data?.let { Constants.token = it.token?.access_token ?: "" MMKVManager.getInstance() common/src/main/java/com/xw/common/net/interceptor/HeaderInterceptor.kt
@@ -1,7 +1,5 @@ package com.xw.common.net.interceptor import android.os.Build import com.blankj.utilcode.util.DeviceUtils import com.xw.common.Constants.token import okhttp3.Interceptor import okhttp3.Response @@ -10,8 +8,14 @@ override fun intercept(chain: Interceptor.Chain): Response { val original = chain.request() val request = original.newBuilder() .header("Authorization", token) val request = if (original.header("customHeader") != "1") { original.newBuilder() .header("Authorization", token) .removeHeader("customHeader") } else { original.newBuilder() .removeHeader("customHeader") } return chain.proceed(request.build()) } }