代码之家  ›  专栏  ›  技术社区  ›  Patrick Kenny

如何清除Android上Ionic应用程序中的所有会话Cookie?

  •  0
  • Patrick Kenny  · 技术社区  · 4 年前

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

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

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

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

    即使我关闭应用程序并重新打开它,当我尝试登录时,它也在使用此会话cookie,但我无法找出会话cookie的存储位置(它不在cookie或本地存储下)。

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

    我如何清除这个幻影饼干,或者我如何至少看到饼干在哪里?

    这是我的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开发工具中,在 应用程序->曲奇饼 ,通常我只看到饼干 http://localhost 然而,如果我导航到我的应用程序中的一个页面,该页面有一个嵌入Drupal网站页面的iframe,那么我就会看到Drupal网站的会话cookie!所以至少我找到了幻影饼干。

    所以现在我的问题是, 如何删除会话cookie,或者更好的是,如何从一开始就防止会话cookie被保存?

    0 回复  |  直到 4 年前
        1
  •  1
  •   fanwu    4 年前

    如果我理解你的意思,你只需要清除所有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
  •  0
  •   Patrick Kenny    4 年前

    可以通过调用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);
    };