LoopbackJS - токены для приглашений пользователей - PullRequest
0 голосов
/ 11 января 2019

Я использую loopback в качестве сервера API для моего приложения. Я создаю социальную сеть, где требуется приглашать пользователей по электронной почте. Чтобы связать приглашенного с приглашающим, я хочу, чтобы приглашающий создал «маркер запроса», связанный с его userId, который затем отправляется по электронной почте в следующем формате: domain.com/register?token=XXXXXX

.

Встроенная модель Access Token кажется идеально подходящей для этой цели в качестве базовой модели, поэтому идея заключается в создании новой модели «RequestToken», унаследованной от модели AccessToken, однако новая модель затем используется для целей аутентификации в качестве ну, чего я не хочу.

Ниже приведены мои конфигурационные файлы. Стоит отметить, что представленная ниже модель «Клиент» расширяет модель «Пользовательская» зацикливания.

/ сервер / модель-config.json:

"_meta": {
    "sources": [
      "loopback/common/models",
      "loopback/server/models",
      "../common/models",
      "./models"
    ],
    "mixins": [
      "loopback/common/mixins",
      "loopback/server/mixins",
      "../node_modules/loopback-ds-timestamp-mixin",
      "../common/mixins",
      "./mixins"
    ]
  },
  "User": {
    "dataSource": "db",
    "public": false
  },
  "AccessToken": {
    "dataSource": "db",
    "public": false,
    "relations": {
      "user": {
        "type": "belongsTo",
        "model": "Customer",
        "foreignKey": "userId"
      }
    }
  },
  "ACL": {
    "dataSource": "db",
    "public": false
  },
  "RoleMapping": {
    "dataSource": "db",
    "public": false,
    "options": {
      "strictObjectIDCoercion": true
    }
  },
  "Role": {
    "dataSource": "db",
    "public": false
  },
  "Email": {
    "dataSource": "mail",
    "public": false
  },
  "Customer": {
    "dataSource": "db",
    "public": true
  },
  "Friend": {
    "dataSource": "db",
    "public": true
  },
  "Memory": {
    "dataSource": "db",
    "public": true
  },
  "RequestToken": {
    "dataSource": "db",
    "public": true
  }
}

В разделе «Клиент» я также попытался включить:

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

общая / customer.json

    {
      "name": "Customer",
      "base": "User",
      "idInjection": true,
      "options": {
        "validateUpsert": true
      },
      "mixins": {
        "TimeStamp": true
      },
      "properties": {
        "firstName": {
          "type": "string",
          "required": true
        },
        "lastName": {
          "type": "string",
          "required": true
        },
        "dob": {
          "type": "date"
        },
        "country": {
          "type": "string"
        }
      },
      "validations": [],
      "relations": {
        "accessTokens": {
          "type": "hasMany",
          "model": "AccessToken",
          "foreignKey": "userId",
          "options": {
            "disableInclude": true
          }
        },
        "requestTokens": {
          "type": "hasMany",
          "model": "RequestToken",
          "foreignKey": "userId",
          "options": {
            "disableInclude": true
          }
        }
      },
      "acls": [
        {
          "accessType": "EXECUTE",
          "principalType": "ROLE",
          "principalId": "$owner",
          "permission": "ALLOW"
        },
        {
          "accessType": "*",
          "principalType": "ROLE",
          "principalId": "$everyone",
          "permission": "DENY"
        }
      ],
      "methods": {}
    }

общий / запрос token.json

{
  "name": "RequestToken",
  "base": "AccessToken",
  "idInjection": true,
  "options": {
    "validateUpsert": true
  },
  "properties": {},
  "validations": [],
  "relations": {
    "user": {
      "type": "belongsTo",
      "model": "Customer",
      "foreignKey": "ownerId"
    }
  },
  "acls": [],
  "methods": {}
}

Резюме: Как я могу создать новую модель «RequestToken», расширяющую модель «AccessToken» Loopbacks, но продолжая использовать встроенную модель AccessToken для аутентификации и т. Д.? Это вообще возможно? Как только я извлекаю строку '"base": "AccessToken"' из файла request-token.json, все методы аутентификации снова работают.

Заранее большое спасибо!

1 Ответ

0 голосов
/ 11 января 2019

Кажется, я нашел решение для этого. В файле server.js мне нужно было указать приложению использовать модель AccessToken.

server.js

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

Я добавил его сразу после

const app = loopback();

Документы ссылаются на него, чтобы использовать его для аутентификации с помощью файлов cookie в документах LB2. https://loopback.io/doc/en/lb2/Making-authenticated-requests.html Я использую Loopback3. В документах LB3 они больше не упоминают об этом, поэтому, если есть другое решение, с удовольствием изменим принятый ответ.

Приветствия

...