如何在远程方法中访问 "current logged-in user"?

How to access "current logged-in user" in remote methods?

最近在我的一个应用程序中,我需要访问当前 logged-in 用户数据以保存在另一个模型中(比如一本书的作者或一本书的所有者)。在我的谷歌搜索中,我遇到了这些参考资料,但其中 none 很有用。

https://github.com/strongloop/loopback/issues/1495

https://docs.strongloop.com/display/public/LB/Using+current+context

...

他们都遇到了访问 contextreq object 的问题。三天后,我决定切换到 afterRemote 远程挂钩并在该阶段添加所有者或作者。 但是这个解决方案有问题。

在 strongloop 的文档 (https://docs.strongloop.com/display/public/LB/Remote+hooks) 中有一个变量 ctx.req.accessToken 保存当前 logged-in 用户访问令牌。但是在应用程序中这个变量是未定义的。 相反,我在 ctx.req.query.access_token 中找到了 accessToken,目前发送到服务器的是 access_token 变量。

这是我的问题

  1. 此变量 (ctx.req.query.access_token) 是否始终可用或 只是因为 loopback-explorer 发送 access_token 作为 GET 变量?

  2. 在生产模式下,应用程序是否需要发送 access_token 作为 GET 变量或者它应该在 header?

  3. 中作为 Authorization 发送
  4. 为什么 ctx.req.accessToken 未定义?

  5. 这些东西会随着时间改变吗?由于 app.getCurrentContext()

  6. 的弃用,导致大多数用户遇到此问题
  1. Is this variable (ctx.req.query.access_token) always available or it's just because loopback-explorer send access_token as GET variable?

好吧,如果您的应用程序始终发送查询字符串,那么您将始终可以使用它,但它也会在 header、cookie 或请求 body 中发送,但是我不建议使用它,因为如果用户登录并且访问令牌有效并且 ctx.req.accessToken 应该可用并且您可以使用它。

  1. In production mode do applications need to send access_token as GET variable or it should be sent as Authorization in the header?

我认为授权 header 是首选,就好像您在 GET 变量中发送它一样,它会在日志中可见,并且有权访问日志的人可以访问 session(好吧,除非你相信每个人),除此之外,将它放在 GET 变量中很好。虽然我相信环回客户端 SDKs(Angular、Android、iOS) 默认情况下都通过授权 header 发送它,所以你可能必须配置它们(也许不可能) .

  1. Why ctx.req.accessToken is undefined?

有时由于数据库 driver 的连接池,上下文丢失,或者上下文请求丢失 (ctx.req) 并且它们为空。 假设 ctx.req 已定义(因为有时未定义),那么这可能意味着用户未登录,或者它的访问令牌无效(已过期或不在数据库中)。它也可能是一个错误(可能是你这边的配置错误),这对你来说也意味着你会遇到身份验证问题。

  1. Could these things change over time? cause most of users encounter this problem due to deprecation of app.getCurrentContext()

app.getCurrentContext 使用有风险,除非您没有其他解决方案,否则我不建议使用。如果您使用它并且它有效,如果数据库 driver 更改或在某些您尚未测试的极端情况下,它可能会停止工作。

在更新的文档中 https://loopback.io/doc/en/lb3/Using-current-context.html

将其添加到您的远程处理元数据中

"accepts": [
    {"arg": "options", "type": "object", "http": "optionsFromRequest"}
  ]

然后

MyModel.methodName = function(options) {
   const token = options && options.accessToken;
   const userId = token.userId
}

但是它说

In LoopBack 2.x, this feature is disabled by default for compatibility reasons. To enable, add "injectOptionsFromRemoteContext": true to your model JSON file.

所以在您的 model.json 文件中添加 "injectOptionsFromRemoteContext": true