【问题标题】:How to clear all session cookies in an Ionic app on Android?如何清除 Android 上 Ionic 应用程序中的所有会话 cookie?
【发布时间】:2021-07-29 13:16:34
【问题描述】:

我在 Android 上的 Ionic 5 React 应用程序中遇到了一个奇怪的问题。该应用程序登录到 Drupal 8 后端并获取 JWT 令牌以进行身份​​验证。

但是,在最近对我的应用和 Drupal 进行了一些更改之后,该应用现在也获得了一个会话 cookie(Drupal 会话 cookie)。这通常没问题,但是当我退出应用程序时,即使我看到会话 cookie 已从 Cookies: http://localhost in Chrome on my dev machine 中删除,当我尝试重新登录应用,应用正在使用 Drupal 会话 cookie,导致错误:{"message":"This route can only be accessed by anonymous users."}

显然,当我已经登录时,我不应该尝试登录。

但我的问题是——这个“幽灵”饼干在哪里?登录应用程序后,在Chrome开发工具中,我可以在Application->Cookies->http://localhost看到会话cookie,但是当我在应用程序中注销时,这个cookie被删除。我检查了存储下的所有其他选项,那里也没有 cookie。

即使我关闭应用程序并重新打开它,当我尝试登录时,它仍在使用此会话 cookie,但我无法确定该会话 cookie 的存储位置(它不在 Cookies 或 Local 下存储)。

我可以通过卸载应用程序然后重新安装来“重置”所有内容。这将允许我登录一次,并获得一个会话 cookie(出现在 Application -> Cookies-> http://localhost 中)。但是当我退出应用程序并尝试重新登录时,我发现 axios 仍然有我的会话 cookie(退出时已从 Chrome 开发工具中清除),因此登录失败 This route can only be accessed by anonymous users)。

我怎样才能清除这个幻像 cookie,或者我怎样才能至少看到 cookie 在哪里?

这是我的 Ionic 应用程序的登录代码:

export const login = async (email: string, password: string): Promise<void> => (
  axios.post(`${baseUrl}/user/login?_format=json`, {
    mail: email,
    pass: password,
  }, {
    withCredentials: true,
  }).then((response) => {
    if (response.data.access_token) {
      storageSet(jwtTokenName, response.data.access_token);
    } else {
      Promise.reject(Error('Could not fetch JWT token.'));
    }
  }));

更新

Ionic 从http://localhost 托管应用程序。在我桌面上的 Chrome 开发工具中,在 Application -> Cookies 下,通常我只能看到 http://localhost 的 cookie。但是,如果我导航到我的应用程序中的一个页面,该页面有一个 iframe,该 iframe 嵌入了我的 Drupal 站点的页面,然后我会看到 Drupal 站点的会话 cookie!所以至少我找到了幻影饼干。

所以现在我的问题是,我如何删除会话 cookie,或者更好的是,我首先如何防止会话 cookie 被保存?

【问题讨论】:

    标签: android ionic-framework axios session-cookies ionic5


    【解决方案1】:

    如果我理解你,你只需要清除所有 cookie

    在 Android 的 Ionic 项目中,我们使用了cordova-plugin-cookiemaster

    Angular 示例:

    import {Injectable} from '@angular/core';    
    declare var cookieMaster;
    
    @Injectable({
        providedIn: 'root'
    })
    
    export class AuthService {
    
        public removeUser(): void {
            cookieMaster.clearCookies(() => {}, () => {
                alert('Error');
            });
        }
    }
    

    【讨论】:

      【解决方案2】:

      可以通过调用 Drupal 注销端点来清除 drupal 会话 cookie。

      但是,我什至不想在我的应用程序中使用 Drupal 会话 cookie;这就是我设置 JWT 身份验证的原因。所以现在我将寻找一种方法来防止应用首先获取会话 cookie。

      export const logout = async (): Promise<boolean> => {
        await storageRemove(jwtTokenName);
        // Android needs to have Drupal logout called because Android gets a session cookie.
        // iOS does not have a session cookie so there is no need to call Drupal logout.
        // if (isPlatform('desktop') || (isPlatform('mobileweb')) || isPlatformAndroid()) {
        if (!isPlatformIOS()) {
          await axios.get(`${baseUrl}/user/logout?_format=json`, {
            withCredentials: true,
          });
        }
        return Promise.resolve(true);
      };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-07
        • 2015-07-31
        • 2011-10-11
        • 2021-07-26
        • 2015-09-07
        • 1970-01-01
        相关资源
        最近更新 更多