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.
我正在尝试使用 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
:
manifestPlaceholders = [
'appAuthRedirectScheme': 'https'
]
存在一个已知问题,即 OAuth HTTPS 响应不会自动从 Chrome 自定义选项卡 return 到应用程序,除非先有用户手势,例如单击按钮。如果可能,显示 OAuth 同意屏幕作为对此的初始解决方案。
如果您想比较某些东西,请尝试 运行 我的演示应用程序,看看它是否能给您一些想法。请注意,最近我在使用 API 31 及更高版本的模拟器上看到了问题,但在我的 Google Pixel phone 上没有问题,它运行 Android 12.