在iOS上使用颤动中的标识服务器4调用AppAuth登出/结束会话终结点 [英] Calling AppAuth sign out / endsession endpoint using IdentityServer4 in Flutter on iOS

查看:26
本文介绍了在iOS上使用颤动中的标识服务器4调用AppAuth登出/结束会话终结点的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在Ffltter中使用flutter_appauth包来处理针对IdentityServer4的授权码流,但找不到在iOS中调用/endsession终结点的方法。

为了了解我正在尝试做什么,以下是我使用url_launcher包实现的工作Android:

    var signOutUrl = '${_endSessionUrl}?id_token_hint=${_idToken}&post_logout_redirect_uri=${AppConfig.oidcCallbackUri}';
    await launch(signOutUrl);

使用相同的代码,iOS只是报告了一个一般性的PlatformException,没有关于原因的更多细节,尽管该异常肯定与仅仅尝试启动URL完全绕过AppAuth有关。

this GitHub comment中的解决方案似乎在使用Okta时有效,但在使用IdentityServer4时,我收到了以下异常,该异常会立即终止颤动应用程序:

[DEVICE LOG] 2020-04-16 08:55:01.039163-0400  localhost Runner[18007]: (CoreFoundation) *** Terminating app due to uncaught exception 'Attempted to create a token exchange request from an authorization
response with no authorization code.', reason: 'Attempted to create a token exchange request from an authorization response with no authorization code.'

考虑到我的/endsession终结点没有返回授权响应,这似乎是有意义的。

在任何情况下,使用EndSession URL调用授权终结点的解决方案充其量都是一种黑客攻击,但这似乎是一种"被接受"的方法。

我能找到的关于使用AppAuth的所有文档都说,只需在应用程序中"忘记"令牌就可以实现注销,但由于浏览器保留身份验证Cookie,因此重新登录是自动进行的。用户没有机会选择其他帐户。

还值得注意的是,这并不是特定于Ffltter、flutter_appauth包或IdentityServer4的。This comment在原生AppAuth-iOS程序包上使用与上述相同的解决方案解决相同的问题。

绝对可以在iOS上注销(从而删除浏览器Cookie),但我完全不知道如何实现这一点。

推荐答案

当您调用授权和交换代码的方法时,需要添加一个额外的参数,名为&Quot;PromptValues&Quot;,值为‘Login’。这样,每次进行登录时,缓存中都没有值,并且总是请求新的登录。

我是从这篇文章openid/AppAuth-Android#215中得到这个解决方案的,其中有关于注销和删除浏览器历史记录和OpenID文档的评论

final AuthorizationTokenResponse result =
await appAuth.authorizeAndExchangeCode(
  AuthorizationTokenRequest(
    your_client_id,
    your_localhost,
    promptValues: ['login'],
    discoveryUrl:
    your_discovery_url,
    scopes: [your_scopes],
  ),
);

这篇关于在iOS上使用颤动中的标识服务器4调用AppAuth登出/结束会话终结点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆