如何在远程方法中访问 "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
...
他们都遇到了访问 context
或 req
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 变量。
这是我的问题:
此变量 (ctx.req.query.access_token
) 是否始终可用或
只是因为 loopback-explorer 发送 access_token 作为 GET
变量?
在生产模式下,应用程序是否需要发送 access_token
作为
GET 变量或者它应该在 header?
中作为 Authorization
发送
为什么 ctx.req.accessToken
未定义?
这些东西会随着时间改变吗?由于 app.getCurrentContext()
的弃用,导致大多数用户遇到此问题
- 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 应该可用并且您可以使用它。
- 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 发送它,所以你可能必须配置它们(也许不可能) .
- Why
ctx.req.accessToken
is undefined?
有时由于数据库 driver 的连接池,上下文丢失,或者上下文请求丢失 (ctx.req) 并且它们为空。
假设 ctx.req 已定义(因为有时未定义),那么这可能意味着用户未登录,或者它的访问令牌无效(已过期或不在数据库中)。它也可能是一个错误(可能是你这边的配置错误),这对你来说也意味着你会遇到身份验证问题。
- 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
最近在我的一个应用程序中,我需要访问当前 logged-in 用户数据以保存在另一个模型中(比如一本书的作者或一本书的所有者)。在我的谷歌搜索中,我遇到了这些参考资料,但其中 none 很有用。
https://github.com/strongloop/loopback/issues/1495
https://docs.strongloop.com/display/public/LB/Using+current+context
...
他们都遇到了访问 context
或 req
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 变量。
这是我的问题:
此变量 (
ctx.req.query.access_token
) 是否始终可用或 只是因为 loopback-explorer 发送 access_token 作为GET
变量?在生产模式下,应用程序是否需要发送
access_token
作为 GET 变量或者它应该在 header? 中作为 为什么
ctx.req.accessToken
未定义?这些东西会随着时间改变吗?由于
app.getCurrentContext()
的弃用,导致大多数用户遇到此问题
Authorization
发送
- Is this variable (
ctx.req.query.access_token
) always available or it's just because loopback-explorer send access_token asGET
variable?
好吧,如果您的应用程序始终发送查询字符串,那么您将始终可以使用它,但它也会在 header、cookie 或请求 body 中发送,但是我不建议使用它,因为如果用户登录并且访问令牌有效并且 ctx.req.accessToken 应该可用并且您可以使用它。
- In production mode do applications need to send
access_token
as GET variable or it should be sent asAuthorization
in the header?
我认为授权 header 是首选,就好像您在 GET 变量中发送它一样,它会在日志中可见,并且有权访问日志的人可以访问 session(好吧,除非你相信每个人),除此之外,将它放在 GET 变量中很好。虽然我相信环回客户端 SDKs(Angular、Android、iOS) 默认情况下都通过授权 header 发送它,所以你可能必须配置它们(也许不可能) .
- Why
ctx.req.accessToken
is undefined?
有时由于数据库 driver 的连接池,上下文丢失,或者上下文请求丢失 (ctx.req) 并且它们为空。 假设 ctx.req 已定义(因为有时未定义),那么这可能意味着用户未登录,或者它的访问令牌无效(已过期或不在数据库中)。它也可能是一个错误(可能是你这边的配置错误),这对你来说也意味着你会遇到身份验证问题。
- 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