ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

如何让第三方应用通过 Bytebase 内置 OAuth2 授权服务器的授权码流程登录

如何让第三方应用通过 Bytebase 内置 OAuth2 授权服务器的授权码流程登录 如何让第三方应用通过 Bytebase 内置 OAuth2 授权服务器的授权码流程登录【免费下载链接】bytebaseDatabase governance built for humans and agents — controlling changes and access across every major database.项目地址: https://gitcode.com/GitHub_Trending/by/bytebaseBytebase 后端内置了一个 OAuth2 授权服务器实现位于 backend/api/oauth2/支持 RFC 7591 动态客户端注册和 RFC 7636 PKCE。如果你的第三方应用需要让用户通过 Bytebase 账户完成登录并拿到一个可调用的访问令牌本文给出完整的授权码authorization code流程发现端点、客户端注册、浏览器授权、令牌换取、刷新与吊销。适用前提你有一个可访问的 Bytebase 部署并能确定它的对外基础 URL下文记为BASE例如https://bytebase.example.com需替换为你实际部署的地址执行授权的用户拥有 Bytebase 账户能在浏览器中完成登录和同意consent应用的回调地址属于 Bytebase 允许的 redirect URI 白名单见“注册客户端”一节的限制。一个需要提前明确的边界该服务器签发的每一个授权grant都绑定 MCP 资源。授权时resource参数缺省会被规范化为{BASE}/mcp访问令牌的 audience 也就是这个资源因此令牌面向的是用户同意的那个 MCP 端点而不是通用的 Bytebase API 凭证。端点总览先读取发现元数据授权服务器按 RFC 8414 暴露发现端点客户端应先从这里读取实际端点地址而不是硬编码curl -s $BASE/.well-known/oauth-authorization-server返回的元数据字段及固定取值来自 discovery.go字段值issuer部署的对外基础 URLauthorization_endpoint{BASE}/api/oauth2/authorizetoken_endpoint{BASE}/api/oauth2/tokenregistration_endpoint{BASE}/api/oauth2/registerrevocation_endpoint{BASE}/api/oauth2/revokeresponse_types_supported[code]仅支持授权码grant_types_supported[authorization_code, refresh_token]code_challenge_methods_supported[S256]PKCE 仅此一种方法token_endpoint_auth_methods_supported[none]仅支持公有客户端另有 RFC 9728 保护资源元数据端点GET /.well-known/oauth-protected-resource返回该资源的resource、authorization_servers和bearer_methods_supported: [header]。如果部署未配置对外 URL发现端点会返回 503 与OAuth2 discovery is unavailable此时需要先补齐部署的对外地址配置流程无法继续。第一步动态注册客户端向注册端点发送 RFC 7591 客户端元数据。该端点不需要认证客户端本身与 workspace 无关workspace 在用户同意时才绑定curl -s -X POST $BASE/api/oauth2/register \ -H Content-Type: application/json \ -d { client_name: my-third-party-app, redirect_uris: [http://localhost:8080/callback], grant_types: [authorization_code, refresh_token], token_endpoint_auth_method: none }参数约束来自 register.goclient_name必填最长 200 字符redirect_uris必填最多 5 条每条最长 2048 字符grant_types缺省为[authorization_code]允许的取值只有authorization_code和refresh_tokentoken_endpoint_auth_method缺省为none且只接受none动态注册只创建公有客户端。redirect URI 白名单是主要限制只接受以下三类其他一律以400 invalid_redirect_uri拒绝http:///https://的 localhost 地址localhost、127.0.0.1、::1固定供应商的托管回调如claude.ai/api/mcp/auth_callback、chatgpt.com/connector/oauth/...、vscode.dev/redirect、antigravity.google/oauth-callback、www.cursor.com/agents/mcp/oauth/callback等精确 hostpath应用自定义 schemecursor://、vscode://、vscode-insiders://、jetbrains://gateway/...。成功时返回201响应体包含服务端生成的client_id前缀bb_oauth_及回显的元数据。保存好client_id后续授权、换令牌、刷新都用它。请求体不合法时返回400错误码为invalid_client_metadata字段问题或invalid_redirect_uri回调不在白名单。第二步发起授权并处理 PKCE授权端点强制要求 PKCE且只支持 S256。先在应用侧生成code_verifier43–128 字符的随机串再计算code_challenge BASE64URL(SHA256(code_verifier))无填充。然后把用户在浏览器中导向授权端点GET来自 authorize.go$BASE/api/oauth2/authorize ?response_typecode client_idbb_oauth_xxx redirect_urihttp://localhost:8080/callback state你生成的随机状态 code_challengeS256 挑战值 code_challenge_methodS256参数规则response_type必须是code否则返回400 unsupported_response_typeclient_id、redirect_uri必填redirect_uri必须与注册值完全一致否则400 invalid_redirect_uricode_challenge缺失返回400 invalid_requestcode_challenge_method不是S256同样拒绝——注意这两类错误不是直接返回 JSON而是把错误重定向回你的redirect_uri带error、error_description、state客户端要在回调里处理state可选原样带回用于防 CSRFresource可选省略时规范化为{BASE}/mcp显式提供时只接受裸源{BASE}或{BASE}/mcp两种写法其他值报invalid_targetscope可选请求的 scope 集合会被归一化为其中最高的一档grant 只绑定单一模式出现未知 token 直接报400 invalid_scope。服务端校验通过后会 302 到前端同意页/oauth2/consent?...。未登录时前端先走登录用户同意后授权会绑定到用户当前所处的 workspace从会话声明解析。同意成功后返回一个 HTML 跳转页最终把浏览器带回到你的redirect_urihttp://localhost:8080/callback?codebb_code_xxxstate你生成的随机状态用户在同意页拒绝或会话不可用时回调收到的将是erroraccess_denied。授权码有效期 10 分钟且只能兑换一次。第三步用授权码换取访问令牌在你的回调处理器里立即用code向令牌端点发application/x-www-form-urlencoded请求curl -s -X POST $BASE/api/oauth2/token \ -H Content-Type: application/x-www-form-urlencoded \ --data-urlencode grant_typeauthorization_code \ --data-urlencode codebb_code_xxx \ --data-urlencode redirect_urihttp://localhost:8080/callback \ --data-urlencode code_verifier第二步保存的随机串 \ --data-urlencode client_idbb_oauth_xxx服务端会依次校验客户端存在client_id必填也接受 Basic 认证头、该客户端注册了authorization_code授权类型、code 属于该客户端且未过期、redirect_uri与授权时一致、PKCE 验证通过、code 对应的resource/scope如果请求里带了与同意时一致。全部通过才原子消费 code 并签发令牌来自 token.go。成功响应{ access_token: eyJ..., token_type: Bearer, expires_in: 1800, refresh_token: bb_refresh_xxx, scope: read }其中access_token是 JWT带workspace_id声明audience 为同意时绑定的 resource因此只会被用户同意的/mcp端点接受refresh_token只在客户端注册了refresh_token授权类型时返回scope回显的是实际同意的 scope而不是请求值。上例中的expires_in、scope为文档示例值实际以响应为准。第四步刷新与吊销访问令牌过期后使用刷新令牌续期。注意刷新令牌是轮换式单次使用的每次刷新会原子消费旧令牌并签发一对新令牌同时重新校验用户对绑定 workspace 的成员资格刷新令牌自身有效期 30 天。curl -s -X POST $BASE/api/oauth2/token \ -H Content-Type: application/x-www-form-urlencoded \ --data-urlencode grant_typerefresh_token \ --data-urlencode refresh_tokenbb_refresh_xxx \ --data-urlencode client_idbb_oauth_xxx刷新时如果带resource/scope必须与同意时的值完全一致否则按不匹配拒绝。撤销令牌调用发现元数据中的revocation_endpoint即POST $BASE/api/oauth2/revoke。验证流程是否跑通按上面的顺序完成后判断成功与否的依据发现端点返回 200 且各端点 URL 以你的BASE开头注册返回 201 与client_id浏览器回调 URL 的 query 中出现codebb_code_...且state与发起时一致令牌端点返回 200 JSON含access_token与token_type: Bearer。常见错误与限制现象error字段出现环节含义invalid_client_metadata/invalid_redirect_uri注册元数据不合法或回调不在白名单见第一步invalid_request重定向回回调授权缺少code_challenge或code_challenge_method不是 S256access_denied重定向回回调授权用户拒绝同意或用户未登录或旧版客户端固定在其他 workspace提示 “client is registered to a different workspace; switch workspaces and try again”invalid_grant换令牌 / 刷新code 无效或已过期10 分钟redirect_uri不一致code_verifier错误用户已不是该 workspace 成员或授权是 3.22.1 之前签发的旧 grant无 resource 绑定描述会提示重新授权invalid_target/invalid_scope换令牌 / 刷新请求里的resource/scope与同意值不一致或授权时scope含未知 tokentemporarily_unavailableHTTP 503换令牌 / 刷新workspace 的 MCP 能力上限策略当前不放行签发这是管理员可回切的策略状态不是凭据问题令牌未被消耗调回策略后原凭据仍可用unsupported_grant_type换令牌grant_type不是authorization_code或refresh_token503OAuth2 discovery is unavailable发现部署的对外 URL 未配置或解析失败其他需要在集成前了解的边界workspace 绑定同意时把 grant 绑定到用户会话所在的 workspace旧版本3.18.2 迁移前注册的客户端固定在注册时的 workspace跨 workspace 使用会被拒绝。令牌用途如开头所述这是 MCP 授权流访问令牌绑定到同意的 resource默认{BASE}/mcp不适合当作调用 Bytebase 其他 REST API 的通用凭证。仅公有客户端动态注册只能创建token_endpoint_auth_methodnone的客户端机密客户端的 secret 校验只为迁移前已存在的旧客户端保留。完成一次完整往返注册 → 授权 → 换令牌 → 用 Bearer 头访问同意的 MCP 端点后第三方应用即完成接入后续维护上只需处理刷新轮换和 30 天刷新令牌到期后的重新授权。【免费下载链接】bytebaseDatabase governance built for humans and agents — controlling changes and access across every major database.项目地址: https://gitcode.com/GitHub_Trending/by/bytebase创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表