OpenProject 访问令牌(Access Tokens)完全指南:API、iCalendar、OAuth 与 RSS 令牌的创建、管理与安全实践
2026/9/17 12:39:30 网站建设 项目流程

OpenProject 访问令牌(Access Tokens)完全指南:API、iCalendar、OAuth 与 RSS 令牌的创建、管理与安全实践

【免费下载链接】openprojectOpenProject is the leading open source project management software for product, project and portfolio management. A powerful Jira alternative with agile planning, issue tracking, roadmaps, Gantt charts, time tracking, collaboration features, and more. Available on premises or in the cloud. ⭐ Star us on GitHub项目地址: https://gitcode.com/GitHub_Trending/op/openproject

OpenProject 的访问令牌(Access Tokens)是连接第三方应用与 OpenProject 实例的"钥匙",涵盖 REST API 集成、日历订阅、会议同步与 OAuth 授权等多种场景。本指南以 docs/user-guide/account-settings/access-tokens/README.md 为主线,结合仓库源码深入讲解 Provider tokens 与 Client tokens 两类令牌的完整生命周期,读完你即可独立完成令牌的创建、订阅、撤销与安全管理。

访问令牌概述:两个方向、两类令牌

在 OpenProject 中,访问令牌统一在账户设置(Account settings)→ Access tokens页面管理。访问令牌的核心作用是"授权外部应用访问 OpenProject 中的资源"。按照令牌的颁发方与连接方向,令牌被组织为两个标签页:

  • Provider tokens(服务方令牌):由 OpenProject 生成,用于让外部应用连接到 OpenProject,包括 API、iCalendar、iCalendar for meetings、OAuth、RSS 五类。
  • Client tokens(客户端令牌):由外部应用生成,用于让OpenProject 连接到外部应用,目前主要是 OAuth client tokens(例如文件存储集成场景)。

从源码看,该页面由 app/controllers/my/access_tokens_controller.rb 中的My::AccessTokensController驱动,所有操作均受before_action :require_login保护,且索引页通过@oauth_client_tokens = OAuthClientToken.includes(:oauth_client).where(user: @user)加载当前用户的客户端令牌(见该文件第 60-62 行)。

Provider tokens:让外部应用访问 OpenProject

API 令牌:通过 REST API 集成第三方应用

API 令牌允许第三方应用通过 OpenProject 的 REST API 与当前实例通信。若尚未创建过任何 API 令牌,该列表为空;要使用此功能,需先在管理 → API and webhooks(即 docs/system-admin-guide/api-and-webhooks/README.md)中启用 API REST Web 服务与 CORS 支持。

创建步骤:

  1. 点击+ API Token按钮;
  2. 在弹出的表单中为令牌命名;
  3. 点击Create按钮。

生成后,新令牌会立即展示在界面上。请注意:每个令牌只在创建时显示一次,务必立即复制并妥善保存。若丢失该信息,只能删除旧令牌并重新生成。

[!TIP] 建议每个令牌只用于单一用途(例如只给某一个应用使用),这样当某个集成需要删除令牌时,你能准确知道需要替换的是哪个应用的凭据。

从源码层面看,API 令牌的底层实现非常清晰:

  • 模型 app/models/token/api.rb 中Token::API < Token::Named,并通过prefix :opapi声明令牌前缀;
  • 令牌值由 app/models/token/base.rb 中的generate_token_value生成,格式为[prefix, SecureRandom.hex(32)].join("-"),即形如opapi-<64 位随机十六进制字符>
  • 创建操作经由 app/services/api_tokens/create_service.rb(APITokens::CreateService,对应Token::APIBaseServices::Create)完成,撤销则由 app/services/api_tokens/delete_service.rb(APITokens::DeleteService)执行;
  • 控制器 app/controllers/my/access_tokens_controller.rb 中的generate_api_keyrevoke_api_key分别调用上述两个服务,并以 Turbo Stream 形式即时刷新页面(第 98-134 行)。

iCalendar 令牌:在外部日历客户端中订阅工作包日历

iCalendar 令牌允许用户通过支持 iCalendar 格式的外部客户端(如 Thunderbird、Apple Calendar、Google Calendar 等)订阅 OpenProject 日历,实时查看工作包的最新信息。

  • 若你尚未订阅任何日历,此列表为空;
  • 一旦你订阅了某个日历,所有已订阅的日历都会出现在此列表中,日历名可点击并直接跳转到 OpenProject 中对应的日历;
  • 点击Delete图标可删除某个订阅,删除前会弹出确认警告。删除该令牌后,所有使用该令牌的外部客户端都将无法再访问 OpenProject 中的对应信息,同时界面会提示该令牌及 iCal URL 已失效。

值得说明的是,iCalendar 令牌(app/models/token/ical.rb 中的Token::ICal)采用prefix :opical,并通过has_one :ical_token_query_assignment一个令牌严格绑定到一个 query(即一个已保存的日历视图),同时覆写single_value?返回false:每当用户为一个新的日历生成 iCal URL 时都会创建新令牌,而已有的令牌与 URL 会持续保持有效,直到用户主动删除(该模型第 58-64 行的注释明确说明了这一设计意图)。

iCalendar for meetings 令牌:订阅全部会议日历

会议 iCalendar 令牌允许用户在外部日历客户端中订阅自己的全部会议,并实时获取会议的最新信息。与工作包日历一样,若尚无订阅则列表为空。

订阅方式有两种:

  1. 直接在账户设置中点击Subscribe to calendar按钮;
  2. 在会议模块中发起订阅。

订阅流程:

  1. 点击订阅按钮后,为订阅令牌命名;
  2. 点击Create subscription
  3. 界面上展示新生成的令牌。

[!IMPORTANT] 该令牌同样仅在生成时显示一次,务必复制并妥善保存。

会议 iCal 令牌的模型位于 modules/meeting/app/models/token/ical_meeting.rb:Token::ICalMeeting < Token::Named,其display_value会基于明文令牌构造完整的ical_feed_meetings_urlformat: :ics)——也就是说,在账户设置中展示给用户的就是可直接填入外部日历的订阅 URL。删除操作与工作包 iCal 令牌一致,在账户设置中点击对应令牌旁的Delete图标即可移除。

OAuth 令牌:第三方应用授权连接

OAuth 令牌允许第三方应用(例如 Nextcloud,集成方法参见 Nextcloud 集成指南)连接当前 OpenProject 实例。OAuth 应用需要在管理 → Authentication(docs/system-admin-guide/authentication/README.md)中预先创建。

与 API/RSS 令牌不同,OAuth 令牌不是直接在 OpenProject 中创建的

  1. 授权流程由外部应用发起;
  2. 在配置过程中,你被重定向到 OpenProject 确认访问权限;
  3. 确认后返回外部应用,完成连接。

如果尚未启用任何第三方应用集成,此列表为空,可联系管理员协助配置。一旦存在集成,其令牌会显示在此处,你可以随时点击Delete图标撤销访问。撤销后,外部应用以你的名义发起 API 调用的权限将立即失效;若日后需要继续使用该集成,必须重新授权。

RSS 令牌:在外部 RSS 阅读器中跟踪最新动态

RSS 令牌允许用户通过外部 RSS 阅读器跟进当前 OpenProject 实例的最新变更。每个用户只能持有一个活跃的 RSS 令牌。

创建方式:点击RSS token按钮,系统随即创建令牌并弹出消息展示令牌内容。

[!IMPORTANT] RSS 访问令牌同样仅在创建后立即显示一次,请务必复制保存。

创建成功后,页面会显示令牌详情,并可通过Delete图标删除。

源码层面的"唯一性"约束来自 app/models/token/base.rb:Token::Basesingle_value?默认返回true,并在before_save :delete_previous_token中删除同一用户、同一类型的所有旧令牌(第 110-119 行),这正是"同一类型只能有一个 RSS 令牌"的实现基础。与 API/ICal 令牌不同,app/models/token/rss.rb 中的Token::RSS < Token::Base直接以明文形式保存value并原样返回。

Client tokens:让 OpenProject 连接外部应用

OAuth Client tokens(客户端 OAuth 令牌)

Client tokens 由外部应用生成,用于让当前 OpenProject 实例连接到这些外部应用。若尚未将账户与实例已启用的任何集成关联,此列表为空;点击Delete图标即可删除对应令牌。

典型场景是文件存储集成:例如接入 Nextcloud、OneDrive 或 SharePoint 后,OpenProject 需要代表你访问外部文件存储,此时会用到客户端令牌。底层模型为 app/models/oauth_client_token.rb 中的OAuthClientToken,它同时关联useroauth_client,要求access_token必填,且当expires_in存在时refresh_token也必须存在,并对同一用户的同一 OAuth 客户端强制唯一(validates :user, uniqueness: { scope: :oauth_client })。控制器的remove_oauth_client_token操作(app/controllers/my/access_tokens_controller.rb 第 64-73 行)负责执行撤销并返回相应提示。

令牌安全机制与生命周期管理

综合以上五类 Provider 令牌与 Client 令牌,OpenProject 的访问令牌体系有以下值得注意的安全设计:

1. 令牌仅在创建时明文可见。API、iCalendar for meetings、RSS 三类令牌都遵循"只显示一次"原则。从源码看,这是刻意设计:Token::HashedToken(app/models/token/hashed_token.rb)在创建时于内存中保留plain_value供一次性展示,随后仅将哈希值持久化(initialize_valuesself.value = hash_function(@plain_value)),display_value在无明文时返回占位符文本。

2. 令牌以哈希形式存储。除 RSS 令牌外,API、iCalendar 等令牌在数据库中存储的是 HMAC-SHA256 摘要(OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new("SHA256"), Setting.hashed_token_pepper, input))。验证用户输入时使用ActiveSupport::SecurityUtils.secure_compare进行恒定时间比较,防止时序侧信道攻击;同时保留了基于secret_key_base的旧版哈希(legacy_hash_function)以便平滑升级旧令牌(第 61-92 行)。这意味着即使数据库泄露,攻击者也无法直接获得可用的明文令牌。

3. 撤销即时生效。无论是删除 API 令牌、iCal 订阅、OAuth 授权还是 RSS 令牌,删除操作都会立即破坏对应外部应用/客户端的访问能力。

4. 每令牌单一用途。官方文档明确建议每个令牌仅用于单一应用,以便需要撤销时能精确定位受影响的集成。

管理员侧配置:API 与 OAuth 的启用前提

普通用户能否使用上述令牌,取决于管理员的全局配置:

  • API 令牌:需在Administration → API and webhooks(docs/system-admin-guide/api-and-webhooks/README.md)中启用"允许用户创建个人 API 令牌"(对应源码中的Setting.api_tokens_enabled?,参见 app/controllers/my/access_tokens_controller.rb 第 175 行);同时可配置 API 响应的最大页大小、是否允许对只读属性写入(便于数据导入),以及是否开启CORS(需填写允许的 Origin 值列表,因为 OpenProject 的受保护资源不能对所有来源使用*)。
  • OAuth 应用:在Administration → Authentication中创建 OAuth 应用后,第三方应用才能发起授权流程。
  • RSS / iCalendar 相关开关:控制器中的has_tokens?方法会综合判断Setting.feeds_enabled?Setting.api_tokens_enabled?以及用户是否已有 iCal 令牌来决定页面的可用状态;iCalendar for meetings 区块的展示还受Setting.ical_enabled?控制(见 app/components/my/access_token/api_tokens_section_component.rb)。

常见问题速查

  • 丢失了令牌值怎么办?令牌只在创建时显示一次,丢失后无法找回,请删除旧令牌并重新生成,同时更新所有使用旧令牌的外部应用。
  • 为什么我的 API 令牌列表是空的?可能尚未创建任何 API 令牌,或管理员未在"API and webhooks"设置中启用个人 API 令牌功能。
  • 撤销 OAuth 授权后会发生什么?外部应用立即失去以你名义调用 API 的权限,如需继续使用该集成需重新完成授权流程。
  • iCal 订阅删除后订阅源还可用吗?不可用。删除令牌会使对应的 iCal URL 立即失效,所有使用该 URL 的外部客户端都会失去访问权限。
  • RSS 令牌可以创建多个吗?不可以。系统设计上每个用户同一类型令牌仅保留一个(Token::Base#single_value?delete_previous_token),创建新 RSS 令牌会替换旧令牌。

掌握以上内容,你就能在 OpenProject 中安全、精准地管理各类访问令牌,顺畅完成 API 集成、日历订阅、会议同步与 OAuth 授权等典型场景。

【免费下载链接】openprojectOpenProject is the leading open source project management software for product, project and portfolio management. A powerful Jira alternative with agile planning, issue tracking, roadmaps, Gantt charts, time tracking, collaboration features, and more. Available on premises or in the cloud. ⭐ Star us on GitHub项目地址: https://gitcode.com/GitHub_Trending/op/openproject

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询