如何使用带有angular2和nativescript

时间:2019-04-25 00:24:25

标签: android nativescript session-cookies angular2-nativescript

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

我正在开发的身份验证API正在为cookie提供会话ID,因为它也用于我们的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");
                }
            )
        );
    }
}

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

1 个答案:

答案 0 :(得分:0)

该问题的解决方案是模拟通过本地脚本调用传递的cookie的标头。这是使用HttpInterceptor模式完成的。我有些困惑,因为标头中的值是以“惰性”方式加载的。 Angular对术语“惰性”的使用并不代表我对术语的理解,而是有效地体现出来,因为您必须在标题上使用.get('target')而不是['target']

gist

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

与成功呼叫所需的信息相比,它传递的信息要多得多,因为它会复制所有cookie。保存的会话所需的唯一cookie是rememberMeJSESSIONID,至少针对我们的shiro后端。