添加身份验证

我们构建了一个新的Feathers应用程序.下一步是 创建服务.

生成身份验证

要为您的应用程序添加身份验证,我们可以运行

feathers generate authentication

首先询问我们想要使用哪些身份验证提供程序.在本指南中,我们仅介绍本地身份验证.它应该默认选中.按enter键.

接下来,我们必须定义我们将用于存储用户信息的服务.只需确认默认的 users,然后确认默认的NeDB数据库:

Final Configuration

最终配置

注解

有关Feathers身份验证的详细信息,请参阅 认证.

创建用户并登录

我们刚刚创建了 users 服务并启用了本地身份验证.重新启动应用程序时,我们现在可以使用 emailpassword 创建一个新用户,类似于我们对消息所做的操作.然后将登录信息处理成JWT(JSON Web令牌). (有关更多信息,请参阅 JSON Web Tokens 是如何工作的).

创建用户

我们将使用以下数据创建一个新用户:

{
  "email": "feathers@example.com",
  "password": "secret"
}

生成的用户服务会自动安全地在数据库中散列密码,并将其从响应中排除. (密码永远不应该传回给客户).有几种方法可以创建新用户,例如,通过CURL:

curl 'http://localhost:3030/users/' -H 'Content-Type: application/json' --data-binary '{ "email": "feathers@example.com", "password": "secret" }'

使用REST客户端,例如 Postman 使用此按钮:

Run in Postman

注解

创建具有相同电子邮件地址的用户只能使用一次,然后失败,因为它已存在于数据库中.这是对NeDB实施的限制;它可能必须在使用其他数据库时手动实现.

获得一个令牌

要创建JWT,我们现在可以使用所需的策略(local)将登录信息发布到 authentication 服务:

{
  "strategy": "local",
  "email": "feathers@example.com",
  "password": "secret"
}

通过CURL:

curl 'http://localhost:3030/authentication/' -H 'Content-Type: application/json' --data-binary '{ "strategy": "local", "email": "feathers@example.com", "password": "secret" }'

使用REST客户端,例如 Postman:

Run in Postman

然后,可以使用返回的令牌对此特定用户进行身份验证,方法是将其添加到新HTTP请求的 Authorization 标头中.由于我们在创建前端时也会在客户端上使用Feathers,因此我们不必担心手动创建和使用本指南的令牌.有关验证REST API调用的更多信息,请参阅 认证.

保护消息服务

让我们将消息服务限制为经过身份验证的用户.如果我们在生成其他服务 之前 运行了 feathers generate authentication, 那么 feathers generate service 会询问服务是否应该仅限于经过身份验证的用户.但是,由于我们首先创建了消息服务,所以我们现在必须手动更新 src/services/messages/messages.hooks.js,如下所示:

const { authenticate } = require('@feathersjs/authentication').hooks;

module.exports = {
  before: {
    all: [ authenticate('jwt') ],
    find: [],
    get: [],
    create: [],
    update: [],
    patch: [],
    remove: []
  },

  after: {
    all: [],
    find: [],
    get: [],
    create: [],
    update: [],
    patch: [],
    remove: []
  },

  error: {
    all: [],
    find: [],
    get: [],
    create: [],
    update: [],
    patch: [],
    remove: []
  }
};

这样,只有拥有有效JWT的用户才能访问该服务.这也会自动为经过身份验证的用户设置 params.user.

保护实时事件

上面介绍的 authenticate 钩子限制了 access 到服务方法,以及经过身份验证的用户.我们还需要确保 实时API 仅发送给允许查看它们的连接 - 例如,当用户加入特定聊天室或一对一消息时.

Feathers使用 channels 来实现这一目标.生成器已将它们设置在 src/channels.js 中. (看看生成的文件中的注释和 事件频道 以更好地了解频道).

默认设置 src/channels.js 设置为将 all 事件发送给所有 authenticated 用户,这是我们将用于聊天应用程序的内容.

下一步是什么?

在本章中,我们初始化了身份验证,创建了一个用户和JWT.我们保护了邮件服务,并确保只有经过身份验证的用户才能获得实时更新.我们现在可以将该用户信息用于 处理数据.