如何访问"当前登录用户"在远程方法?

时间:2016-09-23 10:51:33

标签: node.js loopbackjs

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

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

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

...

所有这些都有关于访问contextreq对象的问题。三天后,我决定切换到afterRemote远程钩子并在该阶段添加所有者或作者。 但是这个解决方案出了问题。

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

这是我的问题

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

  2. 在生产模式下,应用程序需要发送access_token GET变量或它应该在标题中以Authorization发送?

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

  4. 这些事情会随着时间而改变吗?因大多数用户因app.getCurrentContext()

  5. 的弃用而遇到此问题

2 个答案:

答案 0 :(得分:1)

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

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

  
      
  1. 在生产模式下,应用程序需要发送access_token   GET变量或它应该在标题中以Authorization发送?
  2.   

我认为首选Authorization标头,就像你在GET变量中发送它一样,它在日志中可见,并且有权访问日志的人可以访问会话(除非你信任所有人)除此之外,将它放在GET变量中也没关系。虽然我认为loopback客户端SDK(Angular,Android,iOS)默认都通过Authorization标头发送,所以你可能需要配置它们(可能不可能)。

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

由于数据库驱动程序连接池,或者上下文请求丢失(ctx.req)并且它们为空,有时上下文丢失。 假设定义了ctx.req(因为有时它不是),那么可能这意味着用户没有记录它,或者它的访问令牌不是有效的(在数据库中是否过期)。它也可能是一个错误(可能是您配置错误),这对您来说也意味着您将验证问题。

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

app.getCurrentContext使用风险很大,除非您没有其他解决方案,否则我不建议。如果您使用它并且它可以正常工作,它可能会在数据库驱动程序更改时停止工作,或者在某些您尚未对其进行测试的情况下停止工作,它可能无效。

答案 1 :(得分:1)

在更新的文档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中,出于兼容性原因,默认情况下禁用此功能。要启用,请在模型JSON文件中添加" injectOptionsFromRemoteContext":true。

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