菜单

身份验证和用户端点

相关源文件

此页面介绍了 RealWorld API 中的认证系统和与用户相关的端点。它涵盖了用户如何注册、登录、检索和更新其个人资料信息,以及如何在整个系统中处理认证。有关文章相关端点的信息,请参阅 文章端点

概述

RealWorld API 使用 JSON Web Tokens (JWT) 进行认证。用户注册或登录后,API 会提供一个令牌,该令牌必须包含在后续请求中才能访问受保护的资源。与用户相关的端点允许创建、检索和更新用户信息,以及管理用户关系(关注/取消关注)。

身份验证流程

下图说明了 RealWorld API 中的认证流程

来源

用户数据模型

用户数据模型在数据库模式中定义

来源

认证端点

用户注册

创建一个新用户并返回一个包含认证令牌的用户对象。

端点POST /api/users

请求体:

响应 (201 Created)

实现细节:

  • 验证是否提供了电子邮件、用户名和密码
  • 检查电子邮件和用户名的唯一性
  • 使用 bcrypt 和 10 的 salt 因子对密码进行哈希处理
  • 在数据库中创建用户记录
  • 生成包含用户 ID 的 JWT 令牌
  • 返回用户信息和令牌

来源

用户登录

认证现有用户并返回包含令牌的用户信息。

端点POST /api/users/login

请求体:

响应 (200 OK)

实现细节:

  • 验证是否提供了电子邮件和密码
  • 按电子邮件查找用户
  • 使用 bcrypt 比较提供的密码和存储的哈希密码
  • 生成包含用户 ID 的 JWT 令牌
  • 返回用户信息和令牌

来源

获取当前用户

检索当前认证用户的个人资料信息。

端点GET /api/user

:

  • Authorization: Token <jwt-token>

响应 (200 OK)

实现细节:

  • 需要在标头中包含认证令牌
  • 使用 JWT 验证令牌
  • 使用令牌中的用户 ID 从数据库中检索用户信息
  • 返回用户信息

来源

更新用户

更新当前认证用户的个人资料信息。

端点PUT /api/user

:

  • Authorization: Token <jwt-token>

请求体:

响应 (200 OK)

实现细节:

  • 需要在标头中包含认证令牌
  • 使用 JWT 验证令牌
  • 必须提供至少一个字段(电子邮件、用户名、密码、个人简介、头像)
  • 如果更新密码,它将在存储前进行哈希处理
  • 返回更新后的用户信息

来源

用户个人资料端点

获取用户个人资料

通过用户名检索用户个人资料。

端点GET /api/profiles/{username}

:

  • Authorization: Token <jwt-token> (可选)

响应 (200 OK)

实现细节:

  • 用户名在 URL 路径中是必需的
  • 身份验证是可选的
  • 如果已认证,则包含当前用户是否关注了所请求的个人资料
  • 返回个人资料信息

来源

关注用户

通过用户名关注用户。

端点POST /api/profiles/{username}/follow

:

  • Authorization: Token <jwt-token>

响应 (200 OK)

实现细节:

  • 需要身份验证
  • 用户名在 URL 路径中是必需的
  • 在已认证用户和目标用户之间创建关注关系
  • 返回目标用户的个人资料,并将关注设置为 true

来源

取消关注用户

通过用户名取消关注用户。

端点DELETE /api/profiles/{username}/follow

:

  • Authorization: Token <jwt-token>

响应 (200 OK)

实现细节:

  • 需要身份验证
  • 用户名在 URL 路径中是必需的
  • 移除已认证用户和目标用户之间的关注关系
  • 返回目标用户的个人资料,并将关注设置为 false

来源

身份验证实现

JWT 令牌格式

RealWorld API 使用 JSON Web Tokens (JWT) 进行身份验证。

身份验证中间件

API 使用一个名为 useCheckAuth 的中间件函数来保护需要身份验证的端点

  1. Authorization 标头中提取令牌(格式: Token <jwt-token>Bearer <jwt-token>
  2. 使用 JWT 密钥验证令牌
  3. 如果有效,将用户信息添加到请求上下文(通过 event.context.user
  4. 如果无效,则返回 401 Unauthorized 或 403 Forbidden 响应

此中间件有两种模式可用

  • required:身份验证是强制性的,如果未提供将返回错误
  • optional:身份验证是可选的(用于已认证时表现不同的端点)

来源

错误处理

身份验证端点可能返回以下错误

状态码描述原因
401未授权缺少身份验证令牌
403禁止无效的身份验证令牌
422不可处理的实体验证错误(例如,缺少字段、电子邮件/用户名重复)

错误响应遵循此格式

也可能返回特定的字段错误

来源

测试认证端点

RealWorld API 包含一个用于测试认证端点的 Postman 集合。该集合包含测试脚本,用于验证来自认证端点的响应。

来源