我的任务是设置Google OAuth 2.0以获取授权码(不是令牌)以供以后使用。 不建议在 Google Cloud Console 中启用自定义 Uri 架构。 因此,为此我使用 App Links。
问题是我收到了redirect_uri_mismatch异常。
我做了什么:
使用我的调试指纹添加了 https://example.com/.well-known/assetlinks.json:
{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.mypackage.app",
"sha256_cert_fingerprints":
["FB:34:15:34:8F:6B:[...]"]
}
}]
添加意图过滤器:
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http" />
<data android:scheme="https" />
<data android:host="example.com" />
</intent-filter>
使用AppAuth-Android创建请求:
val serviceConfiguration = AuthorizationServiceConfiguration(
Uri.parse("https://accounts.google.com/o/oauth2/v2/auth"), // Authorization endpoint
Uri.parse("https://www.googleapis.com/oauth2/v4/token") // Token endpoint
)
val redirect = "https://example.com"
val authRequestBuilder = AuthorizationRequest.Builder(
serviceConfiguration, // the authorization service configuration
GOOGLE_CLIENT_ID, // the client ID
ResponseTypeValues.CODE, // the response_type value: we want a code
Uri.parse(redirect)) // the redirect URI to which the auth response is sent
val authRequest = authRequestBuilder
.setScope("openid email profile")
.setState(state)
.build()
val authService = AuthorizationService(this)
// An Intent that will handle the redirect result
val redirectIntent = Intent(this, SignUpActivity::class.java)
.setAction(redirect)
authService.performAuthorizationRequest(
authRequest,
PendingIntent.getActivity(this, 0, redirectIntent, PendingIntent.FLAG_IMMUTABLE)
)
我还按照 Android 文档所述测试了 App Link,它表明 App Link 有效(直接将我重定向到我的应用程序):
adb shell am start -a android.intent.action.VIEW \
-c android.intent.category.BROWSABLE \
-d "http://example.com"
在 Google Cloud Console 中,我的 Android 客户端 ID 页面如下所示(我不知道在这里要做什么):
你能帮我找到问题的根源吗?
对于 Android OAuth 客户端禁用自定义 uri 方案(根据建议,由于安全风险,您应该这样做),Google 的替代方案是使用他们的 SDK:
使用 Google Sign-In for Android SDK,它将 OAuth 2.0 响应直接传递到您的应用程序,无需重定向 URI。