如何通过 angular2 和 nativescript 使用会话 cookie 支持自动登录
How to support automatic login using session cookies with angular2 and nativescript
我正在 Angular2
的 NativeScript
中实施一个 android/ios 应用程序。我想在重新启动和关闭应用程序时保留登录凭据信息。我读到 application-settings
是凭证令牌的首选存储机制,但是所有示例都对从 API 返回的字符串令牌进行操作。
我正在开发的身份验证 API 提供一个带有会话 ID 的 cookie,因为它也用于我们的网络界面。
我可以看出这个 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 存储在哪里?我可以将当前存储位置设置为持久化并在注销时删除吗?
我不确定我是否提出了正确的问题来解决我的问题,因此非常感谢任何指导。
[编辑]
我以为我找到了一种方法,至少可以从我的应用程序中检查会话信息。我已经看到我应该能够使用 `Interceptor.
将会话信息附加到所有请求
@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");
}
)
);
}
}
遗憾的是,响应实际上并不包含会话信息。为什么我能够发出经过身份验证的请求?
这个问题的解决方案是在通过 nativescript 调用传递 cookie 时模仿 headers。这是使用 HttpInterceptor
模式完成的。我有些困惑,因为 header 中的值是以 "lazy" 方式加载的。 Angular 对术语 "lazy" 的使用并不符合我对该术语的理解,但有效地表明您必须在 header 上使用 .get('target')
,而不是 ['target']
此 gist
中提供了我的解决方案的实现
这会传递比成功调用所需的信息多得多的信息,因为它会复制所有 cookie。保留 session 唯一需要的 cookie 是 rememberMe
和 JSESSIONID
,至少针对我们的 shiro
后端。
我正在 Angular2
的 NativeScript
中实施一个 android/ios 应用程序。我想在重新启动和关闭应用程序时保留登录凭据信息。我读到 application-settings
是凭证令牌的首选存储机制,但是所有示例都对从 API 返回的字符串令牌进行操作。
我正在开发的身份验证 API 提供一个带有会话 ID 的 cookie,因为它也用于我们的网络界面。
我可以看出这个 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 存储在哪里?我可以将当前存储位置设置为持久化并在注销时删除吗?
我不确定我是否提出了正确的问题来解决我的问题,因此非常感谢任何指导。
[编辑]
我以为我找到了一种方法,至少可以从我的应用程序中检查会话信息。我已经看到我应该能够使用 `Interceptor.
将会话信息附加到所有请求@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");
}
)
);
}
}
遗憾的是,响应实际上并不包含会话信息。为什么我能够发出经过身份验证的请求?
这个问题的解决方案是在通过 nativescript 调用传递 cookie 时模仿 headers。这是使用 HttpInterceptor
模式完成的。我有些困惑,因为 header 中的值是以 "lazy" 方式加载的。 Angular 对术语 "lazy" 的使用并不符合我对该术语的理解,但有效地表明您必须在 header 上使用 .get('target')
,而不是 ['target']
此 gist
中提供了我的解决方案的实现这会传递比成功调用所需的信息多得多的信息,因为它会复制所有 cookie。保留 session 唯一需要的 cookie 是 rememberMe
和 JSESSIONID
,至少针对我们的 shiro
后端。