【问题标题】:Access Token is not generating when extending User and Access Token Model - Loopback 3扩展用户和访问令牌模型时未生成访问令牌 - Loopback 3
【发布时间】:2019-09-27 03:09:42
【问题描述】:

我是环回的新手。因此,作为学习过程的一部分,开始创建示例 API。还将 User 模型扩展为 Customer,AccessToken 扩展为 CustomerAccessToken。但问题是当我们尝试登录已经使用 POST 请求发送的数据时,没有生成访问令牌。

使用凭据登录时的响应正文:

{
  "id": "oiMDjErGGVkeSMtnt1SfHzGuERZf6OCId5FUulvir6A04htUbIV656FOBlXn9vDS",
  "ttl": 1209600,
  "created": "2019-05-09T09:41:05.184Z",
  "userId": "5cd3f59594d45186b411bb02"
}

没有生成 accessToken。我已经删除了内置的 User 和 AccessToken 模型并使用了扩展模型。

model-config.json

{
  "CustomerAccessToken": {
    "dataSource": "db",
    "public": false
  }
  "Customer": {
    "dataSource": "db",
    "public": true
  }
}

customer.json

"relations": {
    "accessTokens": { 
      "type": "hasMany",
      "model": "CustomerAccessToken",
      "foreignKey": "userId",
      "options": {
        "disableInclude": true
      }
    }
  }

customerAccessToken.json

{
  "name": "CustomerAccessToken",
  "base": "AccessToken",
  "properties": {},
  "validations": [],
  "relations": {
    "user": {
      "type": "belongsTo",
      "model": "Customer",
      "foreignKey": "userId"
    }
  },
  "acls": [],
  "methods": {}
}

还有一个查询:当我们尝试扩展 User 和 AccessToken 模型时,登录功能是否有效,或者我是否需要在 customer.js 文件中编写登录功能才能使其正常工作。

任何帮助将不胜感激。

【问题讨论】:

  • 你不需要扩展 AccessToken,只需要扩展 User 模型。如果你需要扩展基本的 AccessToken 模型,你可以查看the docs 怎么做。
  • @akkonrad 感谢您的回复。我尝试了与文档相同的方法。但是当我尝试使用 GET 请求获取用户数据时,它显示 403 授权错误。有什么相同的建议吗?

标签: node.js loopbackjs strongloop loopback


【解决方案1】:

尝试使用 DEBUG 变量来获取有关错误的更多详细信息。从环回根调用

export DEBUG=loopback:security:access-context
npm start

以调试模式运行服务器。然后你可以检查到底发生了什么——调用了哪个方法以及为什么你无权访问。 可能是 ACL 设置:默认情况下,您无法在环回中获取用户数据,因此您可能需要将 ACL 规则添加到 Customer 实体。我建议为此使用loopback-cli - 它不太容易出错。然后选择要添加新规则的模型并按照分步说明进行操作。您可以阅读有关 ACL 的更多信息here

【讨论】:

    【解决方案2】:

    除非你想实现多个用户模型,否则不要使用CustomerAccessToken

    这是对我很有效的配置:

    model-config.json

    {
      "User": {
        "dataSource": "mysql",
        "public": false
      },
      "AccessToken": {
        "dataSource": "mysql",
        "public": false,
        "relations": {
          "Customer": {
            "type": "belongsTo",
            "model": "Customer",
            "foreignKey": "userId"
          }
        }
      },
      "Customer": {
        "dataSource": "mysql",
        "public": true
      }
    }

    server.js

    app.use(loopback.token({
      model: app.models.accessToken,
      currentUserLiteral: 'me'
    }))

    客户模型必须扩展用户模型:

    customer.json

    {
      "name": "Customer",
      "plural": "customers",
      "base": "User"
    }

    【讨论】:

      【解决方案3】:

      除了Antonio Trapanis 回复。如果你想使用自己的AccessToken模型必须在server.js中设置

      app.use(loopback.token({
        model: app.models.CustomerAccessToken,
      }));
      

      【讨论】:

        【解决方案4】:

        我按照本教程进行操作。 https://youtu.be/Jx39u8IssRg 通过用户控制器使用“用户”登录时,我在响应正文中收到了 Token。 我可以通过将标题中的“token”作为“Bearer Token”传递来达到待办事项模型的终点。我使用“postman”来完成待办事项 (我无法将接收到的令牌插入/附加到 loopback4 应用的待办事项请求中)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-06-10
          • 2012-03-30
          • 1970-01-01
          • 2013-01-10
          • 1970-01-01
          • 2013-08-22
          • 2020-08-11
          • 2015-09-27
          相关资源
          最近更新 更多