【问题标题】:how to handle the access token in loopback如何处理环回中的访问令牌
【发布时间】:2017-01-27 15:35:24
【问题描述】:

这是我添加的启动脚本代码

module.exports = function enableAuthentication(server) {
  //enable authentication
  server.enableAuth();
}; 

在邮递员工具中,我尝试在标题中为用户/注销 api 设置如下授权(注意:我通过扩展 User 模型创建了 user 模型),

authorization LqAHkjJV4JQ7oiW6QrYPeDoJszqUXSSUi7NwTHivKV0jyNK3VSyIyFxon72NfPzZ

但我收到以下错误,

{"error":{"name":"Error","status":500,"message":"could not find accessToken","stack":"Error: could not find accessToken\n at D:\\zauth\\node_modules\\loopback\\common\\models\\user.js:302:12\n at D:\\zauth\\node_modules\\loopback-datasource-juggler\\lib\\dao.js:2056:62\n at D:\\zauth\\node_modules\\loopback-datasource-juggler\\lib\\dao.js:1984:11\n at D:\\zauth\\node_modules\\loopback-datasource-juggler\\node_modules\\async\\lib\\async.js:396:17\n at async.each (D:\\zauth\\node_modules\\loopback-datasource-juggler\\node_modules\\async\\lib\\async.js:153:20)\n at _asyncMap (D:\\zauth\\node_modules\\loopback-datasource-juggler\\node_modules\\async\\lib\\async.js:390:13)\n at Object.map (D:\\zauth\\node_modules\\loopback-datasource-juggler\\node_modules\\async\\lib\\async.js:361:23)\n at allCb (D:\\zauth\\node_modules\\loopback-datasource-juggler\\lib\\dao.js:1912:15)\n at D:\\zauth\\node_modules\\loopback-datasource-juggler\\lib\\connectors\\memory.js:472:7\n at _combinedTickCallback (internal/process/next_tick.js:67:7)\n at process._tickDomainCallback (internal/process/next_tick.js:122:9)"}}

我也试过了,

http://localhost:3000/api/users/logout?access_token=LqAHkjJV4JQ7oiW6QrYPeDoJszqUXSSUi7NwTHivKV0jyNK3VSyIyFxon72NfPzZ

它没有醒来,同样的错误

我必须知道如何传递访问令牌@kamal0808

【问题讨论】:

  • 帮助获取解决方案@kamal0808
  • 您需要先了解错误。让我们一一分解。进入你的数据库,查看AccessToken集合中是否存在访问令牌?

标签: loopbackjs


【解决方案1】:

您需要为应用程序的每个 API 请求设置 ACL(访问控制级别)。

这是 ACL 的文档链接: https://loopback.io/doc/en/lb2/Controlling-data-access.html

对于您的代码,您需要在 Users.json 文件的 ACLs 数组中获取以下对象:

{
   "accessType": "EXECUTE"
   "principalType": "ROLE",
   "principalId": "$authenticated",
   "permission": "ALLOW",
   "property": "find"
}

$authenticated 指任何可以登录的人。您也可以为用户创建自定义角色。

【讨论】:

  • 好的,假设我已经创建了一个自定义模型(用户)扩展内置(用户模型),一旦我调用登录 api 后将获取访问令牌。我的问题是如何传递该访问令牌授权标头,以便我调用所有其他方法,例如(GET 用户)。我已经尝试在 PostMan 工具中通过在标题选项卡中设置 GET 用户,例如,密钥作为授权,值作为(我登录后获得的访问令牌),但我仍然获得授权所需的错误是我必须为用户设置 ACL,如 $authenticated自定义模型获取用户 api ?????
  • 您需要在环回中启用认证服务。尝试为此设置启动脚本。阅读loopback.io/doc/en/lb3/…。它会自动发送带有访问令牌的请求。
  • @user7369339 您是否尝试设置启动脚本?您的问题处于什么状态?
  • module.exports = function enableAuthentication(server) { // 启用身份验证 server.enableAuth(); };
  • @user7369339 尝试在middleware.json"initial:before" 下设置"loopback#token": {}
【解决方案2】:

内置 User 模型的默认 ACL 不允许列出用户:

您可以在此处查看完整配置: https://loopback.io/doc/en/lb3/Managing-users.html#default-access-controls

上面的 ACL 拒绝所有人的所有操作,然后选择性地允许:

  • 任何人都可以创建新用户(用户实例)。
  • 任何人都可以登录、注销、确认身份和重置自己的密码。
  • 用户对自己的用户记录(实例)执行 deleteById、findById 和 updateAttributes。

你不能直接修改内置的用户模型,所以你需要扩展它。

登录成功后如何传递访问令牌? 你有两种方法可以做到这一点:

您应该使用 HTTP 标头,因为使用查询参数不够安全(它们没有被 SSL 协议加密,并且可能保留在浏览器或其他客户端历史记录中)。

查看文档了解更多信息:https://loopback.io/doc/en/lb3/Making-authenticated-requests.html

【讨论】:

  • 好的,假设我已经创建了一个自定义模型(用户)扩展内置(用户模型),一旦我调用登录 api 后将获取访问令牌。我的问题是如何传递该访问令牌授权标头,以便我调用所有其他方法,例如(GET 用户)。
  • 我已经尝试在 PostMan 工具中通过在标题选项卡中设置 GET 用户,例如,密钥作为授权,值作为(我登录后获得的访问令牌),但我仍然获得授权需要错误
  • 我是否必须为用户自定义模型设置 ACL,如 $authenticated 才能获取用户 api ?????
  • 我已经更新了我的问题。如果您想获取用户详细信息,您只能查询您自己成功登录的用户 ID(请参阅用户的默认 ACL:findById 操作仅适用于 $owner)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-22
  • 1970-01-01
  • 2013-01-03
  • 1970-01-01
  • 2016-01-14
  • 2017-12-03
相关资源
最近更新 更多