flutter_appauth:正确的 redirect_uri 是什么?

flutter_appauth: What's the correct redirect_uri?

如果我这里有什么不对的地方请指正。我有一个 IdentityServer4(这是 .NET 的 OIDC 实现),客户端定义如下:

new Client
{
    ClientId = "flutterclient",
    AllowedGrantTypes = GrantTypes.Code,
    ClientSecrets = new List<Secret> { new Secret("fluttersecret".Sha256()) },
    AllowedScopes = new List<string>
    {
        IdentityServerConstants.StandardScopes.OpenId,
        IdentityServerConstants.StandardScopes.Profile,
    },
    RedirectUris = { "com.example.flutter_client://oidccallback" },  // Is this correct?
    AllowOfflineAccess = true,
}

我目前只是在模拟器上试用,我可以在 phone 上访问位于 https://10.0.2.2:5001/.well-known/openid-configuration 的发现文档,所以我确信模拟器能够与我的对话国内流离失所者。

现在,我不太确定我需要在 flutter_appauth 中输入什么参数:

// The flutter's code, trying to sign in
final AuthorizationTokenResponse result = await _appAuth.authorizeAndExchangeCode(
  AuthorizationTokenRequest(
    'flutterclient',
    '????',    // What should I put here as redirect URI?
    clientSecret: 'fluttersecret',
    serviceConfiguration: AuthorizationServiceConfiguration('https://10.0.2.2:5001/connect/authorize', 'https://10.0.2.2:5001/connect/token'),
    scopes: <String>['openid', 'profile'],
    preferEphemeralSession: false,
  ),
);

// The gradle's definition
defaultConfig {
    applicationId "com.example.flutter_client"
    minSdkVersion 18
    targetSdkVersion 28
    versionCode flutterVersionCode.toInteger()
    versionName flutterVersionName
    manifestPlaceholders = [
        'appAuthRedirectScheme': '10.0.2.2:5001'  // Is this correct?
    ]
}

尤其是 AuthorizationTokenRequest 的 'redirect_uri' 参数,我试过 'https://10.0.2.2:5001:/oauthredirect', '10.0.2.2:5001:/oauthredirect' 每次 IDP 都会告诉我我有一个格式错误 redirect_uri。什么是正确的?我的其他参数是否正确?

'appAuthRedirectScheme'由开发者自己定义。一旦定义,只需在 IS4 的 Client.RedirectUris.

上使用相同的值
  1. 确保您的 applicationId 和 appAuthRedirectScheme 不包含“_”或大写字符。
  2. 请确保您的应用程序包名称在身份服务器中相同 com.appname.xyz://login-callback ,注意 ://login-callback
  3. 在 appAuthRedirectScheme 中只放 applicationId 而没有://login-callback。

代码的其他部分保持不变。