在未提供身份验证时从 Loopback 获取限制响应

Getting a limit response from Loopback, when no authentication is provided

我在文档中找不到执行此操作的方法,我也在 Stack Overflow 上进行了调查。我想在用户登录之前向用户展示我的 JSON 来自 API 响应的有限视图。

例如,我有一本电子书想在线销售。我希望他们在未登录时只看到本书的预览 link (epubFile.notAuthoried),在登录时看到完整的 link (epubFile.authorized)。两个 link 都在相同的 table.

中表示
[
  {
    "title": "string",
    "subTitle": "string",
    "isPublished": true,
    "publicationDate": "2017-10-20T11:07:31.258Z",
    "epubFile": {
      "notAuthorized": "filename-noauth.epub"
      "authorized": "filename-auth.epub"
    }
    "id": "string",
    "createdOn": "2017-10-20T11:07:31.258Z",
    "updatedOn": "2017-10-20T11:07:31.258Z"
  }
]

甚至可以从回送中的 API 端点过滤掉字段吗? 还是我需要构建一个新的自定义 API 端点?

首先,您必须将 findfindById 方法的权限设置为 $everyone,以便授权和未授权用户都可以调用它们

{     
  "name": "eBook",
   "base": "PersistedModel",
   [...]
   "acls": [
     "accessType": "READ",
     "principalType": "ROLE",
     "principalId": "$everyone",
     "permission": "ALLOW",
     "property":["find", "findById]
    ]
}

接下来,您必须连接到远程方法并根据用户是否登录修改响应

const previewProperites = ['title', 'subTitle', etc...]
Ebook.afterRemote('find', (ctx, ebooks, next) => {
  // pseudo code
  if(!ctx.options.accessToken){
    // no user logged in, only keep preview properties
    ebooks.forEach(book => {
      // get the properties of the book
      var eBookProperties = Object.keys(book.__data);

      eBookProperties.forEach(bookProp =>{
        if(!previewProperties.some(pProp => pProp === bookProp)){
          // ebook property not in preview list, so remove it
          delete book.__data[bookProp]; // .__data is where loopback keeps its actual data
        }
      });
    });
  }
  next();
}