首页 > 解决方案 > 如何使用带有 angular2 和 nativescript 的会话 cookie 支持自动登录

问题描述

我正在实现一个 android/ios 应用NativeScript程序Angular2。我想在重新启动和关闭应用程序时保留登录凭据信息。我已经读过这application-settings是凭证令牌的首选存储机制,但是所有示例都对从 API 返回的字符串令牌进行操作。

我正在开发的身份验证 API 提供了一个带有会话 ID 的 cookie,因为它也用于我们的 Web 界面。

我可以说这个 cookie 是临时存储的,因为我能够在登录后对 API 执行授权请求,但是不知道这个内容被存储在哪里以及如何使其持久化,正在进行的调用简化了这个:

    import { HttpClient } from "@angular/common/http";

    private http: HttpClient

    login(url, data) {
        this.http.post(url, data, {withCredentials: true})
            .then((result) => console.log(JSON.stringify(result)))
    }

我看到这post(...)可能太高级了,无法检索会话/cookie信息。我希望将生成的 cookie 放入存储系统,并在早期启动服务构造函数中重新加载它应该允许我退出应用程序并再次启动它。

第一个问题,我是不是想错了?在 nativescript 应用程序中使用这种身份验证方式是否有意义?我从@manoj 的评论中看到,其中一些过程可能不受支持,但我不确定我最初的问题措辞是否有助于他们的回答。

第二个问题,我应该打另一个电话吗?当前的 cookie 商店在哪里?我可以将当​​前存储位置设置为持久并在注销时删除吗?

我不确定我是否提出了正确的问题来解决我的问题,因此非常感谢任何指导。

[编辑]

我以为我已经找到了一种方法,至少可以从我的应用程序中检查会话信息。我已经看到我应该能够使用“拦截器”将会话信息附加到所有请求。

@Injectable()
export class LogInterceptorService implements HttpInterceptor {
private logger: Logger;
constructor(loggerService: LoggerService) {
        this.logger = loggerService.getLogger(this.constructor.name);
    }

    intercept(
        req: HttpRequest<any>,
        next: HttpHandler
    ): Observable<HttpEvent<any>> {
        this.logger.debug("ABC -> XYZ");
        if (this.logger.isDebugEnabled()) {
            this.logger.debug(JSON.stringify(req));
        }
        return next.handle(req).pipe(
            tap(
                response => {
                    this.logger.debug("XYZ -> ABC");
                    this.logger.debug(
                        `Oh boy we got an answer :: ${JSON.stringify(response)}`
                    );
                },
                error => {
                    this.logger.debug("XYZ -> ABC");
                    this.logger.debug("Something might be burning back there");
                }
            )
        );
    }
}

不幸的是,响应实际上并不包含会话信息。为什么我能够发出经过身份验证的请求?

标签: androidnativescriptsession-cookiesangular2-nativescript

解决方案


这个问题的解决方案是在通过 nativescript 调用传递 cookie 时模仿它们的标头。这是使用HttpInterceptor模式完成的。我有些困惑,因为标题中的值是以“惰性”方式加载的。Angular 对“懒惰”一词的使用并不符合我对这个词的理解,但有效地体现为您必须.get('target')在标题上使用,而不是['target']

此要点中提供了我的解决方案的实现

这传递的信息比成功调用所需的信息多得多,因为它复制了所有 cookie。保留会话唯一需要的 cookie 是rememberMeJSESSIONID,至少在我们的shiro后端是这样。


推荐阅读