OAuth2 重定向 URI 无效

OAuth2 Redirect URI not valid

我正在尝试使用 AppAuth 通过 OAuth2 向 OpenStreetMap 进行身份验证。通过自定义选项卡,我可以检索授权代码,但重定向 URI 不会打开我的应用程序,但会在自定义选项卡中显示 Address Not Found 错误。正如您所看到的,我正在尝试解决这个问题,我使用 app.example.com 作为主机名,虽然包名是 com.example.app,但即使我在重定向中使用包名作为主机名URI(并在清单、gradle、osm 等中更改它),它仍然不起作用,但会导致 Invalid Redirect URI 错误。所以我会假设重定向 URI 的某些内容不太正确,但我无法弄清楚它是什么。

我也不能使用自定义方案,如 OSM only accepts https redirect URIs

MainActivity.java:

private static final String CLIENT_ID = ...;
private static final String REDIRECT_URI = "https://app.example.com/oauth2redirect";
...
AuthorizationRequest.Builder builder = new AuthorizationRequest.Builder(
            authorizationServiceConfiguration,
            CLIENT_ID,
            ResponseTypeValues.CODE,
            Uri.parse(REDIRECT_URI));
builder.setScopes("write_api", "read_prefs");

AuthorizationRequest request = builder.build();
Intent authorizationIntent = authorizationService.getAuthorizationRequestIntent(request);
startActivityForResult(authorizationIntent, REQUEST_CODE);

Manifest.xml:

 <activity
        android:name=".MainActivity"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>

        <intent-filter>
            <action android:name="com.example.app.HANDLE_AUTHORIZATION_RESPONSE" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>

    <activity android:name="net.openid.appauth.RedirectUriReceiverActivity"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.VIEW"/>
            <category android:name="android.intent.category.DEFAULT"/>
            <category android:name="android.intent.category.BROWSABLE"/>

            <data android:scheme="https"
                android:host="app.example.com"
                android:pathPrefix="/oauth2redirect"/>
        </intent-filter>
 </activity>

build.gradle

android {
...

defaultConfig {
    applicationId "com.example.app"
    ...
    manifestPlaceholders = [
            appAuthRedirectScheme: 'app.example.com'
    ]
}

在 OSM 中,我已将重定向 URI 设置为 https://app.example.com/oauth2redirect

奇怪的是,它昨天能用一次,但从今天起就不行了。我恢复了所有更改,重置了应用程序,删除了所有数据并重新启动了我的 phone,但无法使其再次运行。

我尽量显示尽可能少的代码,如果您需要更多信息来解决这个问题,请告诉我。

编辑:我刚刚注意到它适用于 Pixel 5 API 30 虚拟设备,但不适用于我的真实设备(小米 Poco X3 Pro API 30)或 Nexus 6 API 30个虚拟设备。我很困惑

使用 HTTP 重定向 URI 需要在 build.gradle 文件中进行这些设置,并且还需要通过托管 assetlinks.json file:

注册应用 link
manifestPlaceholders = [
    'appAuthRedirectScheme': 'https'
]

存在一个已知问题,即 OAuth HTTPS 响应不会自动从 Chrome 自定义选项卡 return 到应用程序,除非先有用户手势,例如单击按钮。如果可能,显示 OAuth 同意屏幕作为对此的初始解决方案。

如果您想比较某些东西,请尝试 运行 我的演示应用程序,看看它是否能给您一些想法。请注意,最近我在使用 API 31 及更高版本的模拟器上看到了问题,但在我的 Google Pixel phone 上没有问题,它运行 Android 12.