如何访问远程方法中的“当前login用户”?

最近在我的一个应用程序中,我需要访问当前login的用户数据以保存在另一个模型(如书籍的作者或书的所有者)。 在我的谷歌search中,我遇到了这些引用,但没有一个是有用的。

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

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

他们都有关于访问contextreq对象的这个问题。 三天后,我决定切换到远程远程挂钩,并添加该阶段的所有者或作者。 但是这个解决scheme有些问题。

在strongloop的文档( https://docs.strongloop.com/display/public/LB/Remote+hooks )中,有一个variablesctx.req.accessToken ,它保存了当前login的用户访问令牌。 但在应用程序中这个variables是未定义的。 相反,我在ctx.req.query.access_token中find了ctx.req.query.access_token ,它是当前发送给服务器的access_tokenvariables。

这是我的问题

  1. 这个variables( ctx.req.query.access_token )总是可用,或者它只是因为loopback-explorer发送access_token作为GETvariables?

  2. 在生产模式下,应用程序是否需要将access_token作为GETvariables发送,还是应该作为标题中的Authorization发送?

  3. 为什么ctx.req.accessToken是未定义的?

  4. 这些事情会随着时间而改变吗? 导致大多数用户由于app.getCurrentContext()弃用而遇到此问题

  1. 这个variables( ctx.req.query.access_token )总是可用,或者只是因为loopback-explorer发送access_token作为GETvariables?

那么如果您的应用程序总是发送查询string,那么它将始终可用于您,但它也发送在头或cookie或在请求正文中,但我不build议使用它,因为如果用户login并且访问令牌有效,并且ctx.req.accessToken应该可用,您可以使用它。

  1. 在生产模式下,应用程序是否需要将access_token作为GETvariables发送,还是应该作为标题中的Authorization发送?

我相信授权标头是首选,就好像你发送一个GETvariables,好吧,它会在日志中可见,有人访问日志可以访问会话(除非你信任每个人),除此之外它是罚款让它在一个GETvariables。 虽然我相信回送客户端SDK(Angular,Android,iOS)都默认通过授权标题发送,所以你可能需要configuration它们(也许不可能)。

  1. 为什么ctx.req.accessToken是未定义的?

有时由于数据库驱动程序连接池或上下文请求丢失(ctx.req)而丢失上下文,它们为空。 假设ctx.req被定义(因为有时不是),那么可能意味着用户没有logging它,或者它的访问令牌是无效的(数据库中已经过期或者没有)。 也可能是一个错误(也许configuration错误),这也意味着你会authentication问题。

  1. 这些事情会随着时间而改变吗? 导致大多数用户由于app.getCurrentContext()弃用而遇到此问题

app.getCurrentContext是有风险的使用,我不build议,除非你没有其他的解决scheme。 如果你使用它,它可能会停止工作,如果数据库驱动程序更改或在一些你没有testing过的情况下,它可能无法正常工作。

在更新的文档中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 } 

但它说

在LoopBack 2.x中,由于兼容性原因,此function在默认情况下被禁用。 要启用,请将“injectOptionsFromRemoteContext”:true添加到您的模型JSON文件中。

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