fix SSO login flow: use two-phase login then authorize to bypass d1kt redirect bug
This commit is contained in:
@@ -130,6 +130,7 @@ class MainActivity : Activity() {
|
|||||||
private var showingPhoneBinding = false
|
private var showingPhoneBinding = false
|
||||||
private var ssoPendingToken: String? = null
|
private var ssoPendingToken: String? = null
|
||||||
private var ssoWebView: WebView? = null
|
private var ssoWebView: WebView? = null
|
||||||
|
private var ssoPhase = 0 // 0=login page, 1=authorize, 2=done
|
||||||
private var myContentList: LinearLayout? = null
|
private var myContentList: LinearLayout? = null
|
||||||
private var sentenceBoundaryRequestGeneration = 0
|
private var sentenceBoundaryRequestGeneration = 0
|
||||||
private var catalogVideos: List<TrainingVideoSummary> = emptyList()
|
private var catalogVideos: List<TrainingVideoSummary> = emptyList()
|
||||||
@@ -565,6 +566,8 @@ class MainActivity : Activity() {
|
|||||||
|
|
||||||
@Suppress("SetJavaScriptEnabled")
|
@Suppress("SetJavaScriptEnabled")
|
||||||
private fun createSsoWebView(): View {
|
private fun createSsoWebView(): View {
|
||||||
|
ssoPhase = 0
|
||||||
|
|
||||||
val authorizeUrl = Uri.parse(SSO_AUTHORIZE_URL).buildUpon()
|
val authorizeUrl = Uri.parse(SSO_AUTHORIZE_URL).buildUpon()
|
||||||
.appendQueryParameter("client_id", SSO_CLIENT_ID)
|
.appendQueryParameter("client_id", SSO_CLIENT_ID)
|
||||||
.appendQueryParameter("redirect_uri", SSO_REDIRECT_URI)
|
.appendQueryParameter("redirect_uri", SSO_REDIRECT_URI)
|
||||||
@@ -593,9 +596,18 @@ class MainActivity : Activity() {
|
|||||||
settings.javaScriptEnabled = true
|
settings.javaScriptEnabled = true
|
||||||
settings.domStorageEnabled = true
|
settings.domStorageEnabled = true
|
||||||
webViewClient = object : WebViewClient() {
|
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 {
|
override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean {
|
||||||
val url = request?.url ?: return false
|
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")
|
val code = url.getQueryParameter("code")
|
||||||
handleSsoCallback(code)
|
handleSsoCallback(code)
|
||||||
return true
|
return true
|
||||||
@@ -603,7 +615,8 @@ class MainActivity : Activity() {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
loadUrl(authorizeUrl)
|
// 阶段 1:直接打开第一课堂登录页(绕过授权接口的错误重定向)
|
||||||
|
loadUrl(SSO_LOGIN_URL)
|
||||||
}
|
}
|
||||||
container.addView(ssoWebView, LinearLayout.LayoutParams(
|
container.addView(ssoWebView, LinearLayout.LayoutParams(
|
||||||
ViewGroup.LayoutParams.MATCH_PARENT, 0, 1f
|
ViewGroup.LayoutParams.MATCH_PARENT, 0, 1f
|
||||||
@@ -2447,6 +2460,7 @@ class MainActivity : Activity() {
|
|||||||
const val ASSESSMENT_API_KEY = "fcf60fa10bc1c49e5ddb93d570bc54df5648e187b64096962498d57661c14220"
|
const val ASSESSMENT_API_KEY = "fcf60fa10bc1c49e5ddb93d570bc54df5648e187b64096962498d57661c14220"
|
||||||
|
|
||||||
// 第一课堂 OAuth2 SSO 配置
|
// 第一课堂 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_AUTHORIZE_URL = "https://d1kt.cn/api/oauth2/authorize"
|
||||||
const val SSO_TOKEN_URL = "https://d1kt.cn/api/oauth2/token"
|
const val SSO_TOKEN_URL = "https://d1kt.cn/api/oauth2/token"
|
||||||
const val SSO_CLIENT_ID = "oral-trainer-app"
|
const val SSO_CLIENT_ID = "oral-trainer-app"
|
||||||
|
|||||||
Reference in New Issue
Block a user