环回无法使用PUT请求更新用户/客户

时间:2017-09-27 11:26:31

标签: authorization loopbackjs put

我有一个Customer模型,它扩展了内置用户模型。但是,即使提供了正确的access_token,PUT对Update客户的请求也根本不起作用。

我使用登录端点以用户身份登录并获得了access_token。 PUT请求更新客户属性:

PUT  http://localhost:3000/api/customers/59cb873ab21a902ab0afece1

根据我的理解,所有者应该能够更新自己的记录,但它不断抛出以下错误:

{
    "error": {
        "statusCode": 401,
        "name": "Error",
        "message": "Authorization Required"
    }
}

此外,当我尝试使用相同的access_token删除时,它可以正常工作。

DELETE  http://localhost:3000/api/customers/59cb873ab21a902ab0afece1

customer.json文件如下所示:

{
  "name": "customer",
  "plural": "customers",
  "base": "User",
  "idInjection": true,
  "options": {
    "validateUpsert": true
  },
  "properties": {
    "realm": null,
    "emailVerified": null,
    "name": {
      "type": "string"
    },
    "username": {
      "type": "string"
    },
    "cellnumber": {
      "type": "string"
    },
    "status": {
      "type": "string"
    }
  },
  "validations": [],
  "relations": {
    "accessTokens": {
      "type": "hasMany",
      "model": "accessToken",
      "foreignKey": "userId"
    }
  },
  "acls": [
  ],
  "methods": {},
  "replaceOnPUT": false
}

我哪里错了?我该如何解决这个问题?

由于

2 个答案:

答案 0 :(得分:0)

您可以尝试提供USER,ACL,如下例所示,

"acls": [
    {
      "accessType": "EXECUTE",
      "principalType": "ROLE",
      "principalId": "$authenticated",
      "permission": "ALLOW"
    }, {
      "accessType": "*",
      "principalType": "ROLE",
      "principalId": "$everyone",
      "permission": "DENY"
    }
  ]
希望这会奏效。

答案 1 :(得分:0)

用户模型的默认ACL要求对除POST请求之外的每个请求进行身份验证 - 因此它不是问题。

要在此模型上发出GET,PUT / PATCH或DELETE请求,您需要登录并在请求中使用令牌。

案例中的例子:

  • POST一位新客户,例如: { "username": "stack_user", "email": "test@stackoverflow.com", "password":"stackoverflow" }; 在POST http://localhost:3000/api/customers/
  • 使用电子邮件和密码登录:{ "email": "test@stackoverflow.com", "password":"stackoverflow" }; 在POST http://localhost:3000/api/customers/login

=>你会收到如下回复:

{
  "id": "jazSRZYbjJai3JeCYpb6u4nYsRGWbaQk5SK3nQPkMoNeUdrAYK3kYwaXECrfj6Vk",
  "ttl": 1209600,
  "created": "2017-09-29T11:44:16.111Z",
  "userId": "59cb873ab21a902ab0afece1"
}

其中 id 是access_token。

  • PUT http://localhost:3000/api/customers/59cb873ab21a902ab0afece1?access_token=jazSRZYbjJai3JeCYpb6u4nYsRGWbaQk5SK3nQPkMoNeUdrAYK3kYwaXECrfj6Vk
  • 使用它

它应该有用。

如果没有,您可以尝试删除此行:

"replaceOnPUT": false

然后再试一次?