【问题标题】:How to logout with flutter_appauth?如何使用flutter_appauth注销?
【发布时间】:2021-03-23 13:09:13
【问题描述】:

我需要从flutter_appauth 中退出并按下按钮;

这个包没有任何注销方法。

这是我的获取令牌代码:

appAuth.authorizeAndExchangeCode(AuthorizationTokenRequest(
                clientID, redirectUrl,
                discoveryUrl: discoveryUrl,
                scopes: scopes,
                clientSecret: clientSecret

【问题讨论】:

  • 为什么你使用这个包,当开发者从他的 github 中删除这个 repo 时。
  • @MohammadMirshahbazi 我正在使用flutter_appauth。问题中固定的网址。 pub.dev/packages/flutter_appauth
  • 在您编辑此链接之前,我们会看到https://pub.dev/packages/flutter_auth/install
  • @MohammadMirshahbazi我知道,这是我的错误。我有flutter_appauth包的注销问题
  • 好的兄弟,我知道了,等我解决你的问题。

标签: flutter authentication openid-connect


【解决方案1】:

在那个包中,没有任何解决方案,但这个问题有两种解决方法:

  1. 这是你的浏览器,所以你可以清除浏览器的缓存:)

  2. 当您调用授权和交换代码的方法时,需要添加一个名为“promptValues”的附加参数,其值为“login”。这样,每次登录时,缓存中都没有值,它总是要求新的登录。

这样做:

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

【讨论】:

  • 我只需要一个注销功能。它不应该在每次登录时都请求登录信息!
  • 据我所知,不存在注销的方法,但是通过解决方案,您可以在每次登录时清除缓存,因此您因为缓存是干净的而注销,请尝试它的工作。
  • 如何清除缓存? flutter_appauth 使用它内置在 webview 中,我无法访问它。我还删除了 getTemporaryDirectory 目录,但没有任何效果。
  • 您是否将刷新令牌存储在机箱中的某个位置,以便让您的用户对其进行签名?
【解决方案2】:

这里有 2 个主要选项,作为第一步,我会看看您是否可以根据 Mohammad 的评论使第一个选项起作用:

选项 1:简单注销

只需从您的应用中删除所有存储的令牌。这样做的问题是它不会删除授权服务器会话 Cookie。因此,默认情况下,您不能强制另一个登录提示,例如以新用户身份登录。解决此问题的一种方法是在执行登录重定向时发送 prompt=login 作为参数。

选项 2:完全注销

完全注销涉及这两个操作,可能需要您深入了解 AppAuth 内部:

  • 从您的应用中删除存储的令牌
  • 通过结束会话请求重定向以删除授权服务器会话 cookie

这里有一些 sample Android code of mine 用于启动 Chrome 自定义选项卡以进行注销重定向。

还有其他潜在问题,例如由于缺少用户手势而导致退出后无法返回应用的间歇性 Chrome 白屏。

更多信息

我的博文有更多关于 AppAuth 集成的详细信息,以及您可以运行的代码示例,以防万一这些有用。我直接从 Kotlin / Swift 使用 AppAuth 库,而您需要处理 Flutter 插件的附加层:

【讨论】:

    【解决方案3】:

    2021 年更新: 只需使用url_launcher 像这样打开注销页面:

      if (await canLaunch(logoutUrl)) {
        await launch(logoutUrl);
      }
    
    • 记住:您必须在注销过程后重定向到自定义方案(您在 build.gradle 文件中添加)。

    我用一个技巧解决了注销问题! 我用注销链接打开浏览器。然后重定向到 [custom_url]。并通过 AppLink 返回应用。

    这就是我退出的方式:

    1. 关注 this tutorial 为您的应用创建 KeyStore

    2. 使用以下命令从[生成的密钥].jks 中获取证书指纹,SHA256

    keytool -list -v -keystore [生成的密钥].jks

    1. 创建一个包含以下内容的assetlinks.json 文件:
    
    
        [
          {
            "relation": [
              "delegate_permission/common.handle_all_urls"
            ],
            "target": {
              "namespace": "android_app",
              "package_name": "[app.package.name]",
              "sha256_cert_fingerprints": [
                "The Certificate fingerprints, SHA256 created in step 2."
              ]
            }
          }
        ]
    
    

    然后放在上面

    https://[custom_url]/.well-known/assetlinks.json

    1. 在清单中添加一个意图过滤器,如下所示:

    <application ...>
      <activity ...>
        <intent-filter android:autoVerify="true" tools:targetApi="m">
          <action android:name="android.intent.action.VIEW" />
    
          <category android:name="android.intent.category.DEFAULT" />
          <category android:name="android.intent.category.BROWSABLE" />
    
          <data 
             android:host="[custom_url]"
             android:scheme="https" />
        </intent-filter>
      </activity>
    </application>
    1. 最后,这是注销功能:
    
    
          Future logout() async {
            if (await canLaunch(_logoutUrl))
              await launch(_logoutUrl);
          }
    
    

    【讨论】:

      【解决方案4】:

      我创建了一个方法,通过像这样结束会话来处理注销用户:

      Future<bool> endSession(String idToken) async {
          //work like logout method
          try {
            await appAuth.endSession(EndSessionRequest(
                idTokenHint: idToken,
                issuer: _issuer,
                postLogoutRedirectUrl: _redirectUrl,
                allowInsecureConnections: _allowInsecureConnections));
          } catch (err) {
            print(err);
            return false;
          }
          return true;
        }
      
      • 如果您使用 keycloak,那么 _issuer 将类似于 http://localhost:8080/auth/realms/REALM-NAME
      • idToken 是您登录后收到的(在AuthorizationTokenResponse 内)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-20
        • 1970-01-01
        • 1970-01-01
        • 2021-07-30
        • 1970-01-01
        • 2018-01-14
        • 2011-07-05
        • 2016-04-07
        相关资源
        最近更新 更多