【发布时间】:2020-05-18 09:17:19
【问题描述】:
我正在使用 AppAuth 库 (net.openid:appauth:0.7.1) 在 chrome 自定义选项卡中对用户进行身份验证。
我有两个应用程序,比如说,App-A 和 App-B。 App-A 有一个活动(App-A-MainActivity),它启动一个 App-B 的活动(App-B-MainActivity)。 App-B-MainActivity 有一个按钮,用于启动自定义选项卡以对我的 OIDC 端点进行身份验证。身份验证成功后,我们需要在 App-B-MainActivity 中获取 authCode,即在 onActivityResult 覆盖的方法中。
工作:
在这种情况下,我直接启动 App-B-MainActivity,而不是通过 App-A 启动。在自定义选项卡中成功进行身份验证后,它被重定向到 App-B-MainActivity 并且我能够在应用程序 App-B 的 onActivityResult 覆盖方法中获得所需的 authCode。
不工作:
在此,我从 App-A-MainActivity 启动 App-B-MainActivity。在自定义选项卡中成功验证后,它不会被重定向到 App-B-MainActivity,因此我无法在应用程序 App-B 的 onActivityResult 覆盖方法中获得所需的 authCode。
那么,我在第二种情况下是否缺少任何东西,或者我在AuthorizationService 中提供的context(applicationContext) 有什么相关的吗?
请帮助我解决这个问题。
这是我的AuthApp 代码,用于启动自定义选项卡以进行身份验证(在 Kotlin 中):
val authenticate_button = findViewById<Button>(R.id.authenticate_button)
authenticate_button.setOnClickListener {
val authServiceConfig = AuthorizationServiceConfiguration(
Uri.parse(COGNITO_AUTH_ENDPOINT),
Uri.parse(COGNITO_TOKEN_ENDPOINT)
)
val authRequestBuilder = AuthorizationRequest.Builder(
authServiceConfig, CLIENT_ID,
ResponseTypeValues.CODE, Uri.parse(REDIRECT_URI)
)
val authRequest = authRequestBuilder.setScope("openid").build()
val appAuthConfig = AppAuthConfiguration.Builder().setBrowserMatcher(
BrowserWhitelist(VersionedBrowserMatcher.CHROME_CUSTOM_TAB)
).build()
val authService = AuthorizationService(applicationContext, appAuthConfig)
startActivityForResult(authIntent, RC_AUTH)
}
重写onActivityResult方法:
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == RC_AUTH && data != null) {
val resp = AuthorizationResponse.fromIntent(data)
if (resp != null && resp.authorizationCode != null) {
// auth code
val authCode = resp.authorizationCode
...
}
}
}
【问题讨论】:
标签: android kotlin openid chrome-custom-tabs