首页 > 解决方案 > LoopbackJS - 用户邀请的令牌

问题描述

我使用环回作为我的应用程序的 API 服务器。我正在建立一个类似社交的网络,需要通过电子邮件邀请用户。为了将受邀者与邀请者相关联,我希望邀请者创建一个与其 userId 关联的“请求令牌”,然后通过电子邮件以如下格式发送:domain.com/register?token=XXXXXX

内置的 Access Token 模型似乎非常适合此目的作为使用的基本模型,因此我们的想法是创建一个从 AccessToken 模型继承的新模型“RequestToken”,但是,新模型随后也用于身份验证目的,这我不想要。

以下是我的配置文件。值得一提的是,下面看到的“客户”模型正在扩展环回“用户”模型。

/server/model-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": {}
    }

common/request-token.json

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

摘要:如何创建一个新的“RequestToken”模型,扩展 Loopbacks“AccessToken”模型,但继续使用内置的 AccessToken 模型进行身份验证等?有可能吗?一旦我'"base": "AccessToken"'从 request-token.json 文件中取出该行,所有身份验证方法都会再次起作用。

提前非常感谢!

标签: authenticationmodelloopbackjs

解决方案


看来我找到了解决方案。在 server.js 中,我需要告诉应用程序使用 AccessToken 模型。

服务器.js

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

我刚刚添加了它

const app = loopback();

文档引用它以通过 LB2 文档中的 cookie 使用它进行身份验证。 https://loopback.io/doc/en/lb2/Making-authenticated-requests.html 我正在使用 Loopback3。在 LB3 文档中,他们不再提及这种方式,因此如果有其他解决方案,很乐意更改接受的答案。

干杯


推荐阅读