diff --git a/android/sample-app/src/main/java/cn/learningpad/oraltrainer/sample/MainActivity.kt b/android/sample-app/src/main/java/cn/learningpad/oraltrainer/sample/MainActivity.kt index 9f1f2e6..b180a2b 100644 --- a/android/sample-app/src/main/java/cn/learningpad/oraltrainer/sample/MainActivity.kt +++ b/android/sample-app/src/main/java/cn/learningpad/oraltrainer/sample/MainActivity.kt @@ -130,6 +130,7 @@ class MainActivity : Activity() { private var showingPhoneBinding = false private var ssoPendingToken: String? = null private var ssoWebView: WebView? = null + private var ssoPhase = 0 // 0=login page, 1=authorize, 2=done private var myContentList: LinearLayout? = null private var sentenceBoundaryRequestGeneration = 0 private var catalogVideos: List = emptyList() @@ -565,6 +566,8 @@ class MainActivity : Activity() { @Suppress("SetJavaScriptEnabled") private fun createSsoWebView(): View { + ssoPhase = 0 + val authorizeUrl = Uri.parse(SSO_AUTHORIZE_URL).buildUpon() .appendQueryParameter("client_id", SSO_CLIENT_ID) .appendQueryParameter("redirect_uri", SSO_REDIRECT_URI) @@ -593,9 +596,18 @@ class MainActivity : Activity() { settings.javaScriptEnabled = true settings.domStorageEnabled = true webViewClient = object : WebViewClient() { + override fun onPageFinished(view: WebView?, url: String?) { + super.onPageFinished(view, url) + if (ssoPhase == 0 && url != null && !url.contains("/login")) { + // 用户已登录(离开了登录页),现在加载授权页 + ssoPhase = 1 + view?.post { view.loadUrl(authorizeUrl) } + } + } + override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean { val url = request?.url ?: return false - if (url.toString().startsWith(SSO_REDIRECT_URI)) { + if (ssoPhase >= 1 && url.toString().startsWith(SSO_REDIRECT_URI)) { val code = url.getQueryParameter("code") handleSsoCallback(code) return true @@ -603,7 +615,8 @@ class MainActivity : Activity() { return false } } - loadUrl(authorizeUrl) + // 阶段 1:直接打开第一课堂登录页(绕过授权接口的错误重定向) + loadUrl(SSO_LOGIN_URL) } container.addView(ssoWebView, LinearLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, 0, 1f @@ -2447,6 +2460,7 @@ class MainActivity : Activity() { const val ASSESSMENT_API_KEY = "fcf60fa10bc1c49e5ddb93d570bc54df5648e187b64096962498d57661c14220" // 第一课堂 OAuth2 SSO 配置 + const val SSO_LOGIN_URL = "https://d1kt.cn/login" const val SSO_AUTHORIZE_URL = "https://d1kt.cn/api/oauth2/authorize" const val SSO_TOKEN_URL = "https://d1kt.cn/api/oauth2/token" const val SSO_CLIENT_ID = "oral-trainer-app"