nebular - 自定义 NbAuthStrategy 从异步调用中获取结果
问题描述
我正在创建自己的身份验证方法。我扩展了 NbAuthStrategy 并实现了方法验证,如下所示
@Injectable()
export class MyAuthStrategy extends NbAuthStrategy {
...
authenticate(user: UserData): Observable<NbAuthResult> {
...
this.userService.getUser(userId, function(user: IUser) {
console.log("called back" + user); ////// ?????
});
...
}
...
}
该方法应该返回一个 Observable 对象。
当我进行内存身份验证时,它工作得很好,没有问题。
当我尝试通过异步调用在 AWS Lambda 上进行身份验证时,问题就出现了。由于响应是异步的,我无法返回 Observable,因此我发现这种身份验证机制仅适用于内存或同步调用。
在异步调用上完成验证时如何进行身份验证?
解决方案
我在这里提供的帮助下得到了他的帮助https://github.com/akveo/nebular/issues/2388
基本上:
- 从 AWS Lambda 向用户返回一个 Promise
- 将其包装为异步等待方法,以便返回另一个 Promise
- 将 Promise 转换为 Observable
- 管道/映射 Observable 以返回 Observable 对象
验证(用户:UserData):可观察的< NbAuthResult > {
const userPromise: Promise<IUser> = this.userPromiseService.getUserPromise(user.schema, user.username);
const userObservableDeferred3: Observable<NbAuthResult> = defer(() => userPromise)
.pipe(
map((res) => {
return new NbAuthResult(
true,
null,
'/pages/user-account',
'Welcome',
);
}),
);
return userObservableDeferred3;
}
async getUserPromise(schema: string, username: string): Promise< IUser > {
// invoke lambda
const params = {
...
};
const result = await (this.getAWSLambda().invoke(params).promise());
// get resulting user
const payload = result.Payload;
const arrayss = JSON.parse(payload);
const array = JSON.parse(arrayss);
const item = array[0];
return < IUser >item;
}
推荐阅读
- javascript - 有没有办法使用 display:none 来动画内容过滤?
- java - 如何修复返回 null 的 Jsoup 查询
- windows - 通过 AutoHotKey 确定光标所在的监视器。监控底值错误
- numpy - 定制“内产品”/“外产品”
- regex - 修改 Python 正则表达式以在 grep 中工作
- sql - 选择绑定到最大列的列
- node.js - 使用 chai-http 响应解决承诺
- python - Python中有没有简单的方法来配对数组中的相邻元素?
- java - 如何将 QueueLinearFloodFiller 算法应用于 android App
- r - 申请结果不一致