我正在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");
}
)
);
}
}
不幸的是,响应实际上并不包含会话信息。为什么我可以发出经过身份验证的请求?
答案 0 :(得分:0)
该问题的解决方案是模拟通过本地脚本调用传递的cookie的标头。这是使用HttpInterceptor
模式完成的。我有些困惑,因为标头中的值是以“惰性”方式加载的。 Angular对术语“惰性”的使用并不代表我对术语的理解,而是有效地体现出来,因为您必须在标题上使用.get('target')
而不是['target']
此gist
中提供了我的解决方案的实现与成功呼叫所需的信息相比,它传递的信息要多得多,因为它会复制所有cookie。保存的会话所需的唯一cookie是rememberMe
和JSESSIONID
,至少针对我们的shiro
后端。