Add PKCE documentation - #256

Open
ricardobcl wants to merge 1 commit into
support/update-authentication-documentationfrom
feature/add-pkce-documentation
Open

Add PKCE documentation#256
ricardobcl wants to merge 1 commit into
support/update-authentication-documentationfrom
feature/add-pkce-documentation

Conversation

@ricardobcl

Copy link
Copy Markdown

Description

Documents the Native Application Flow (PKCE) being added to the authorization server by uphold/backend#19003, for native clients (desktop, CLI, mobile) that receive the OAuth redirect on a loopback address — including the MCP client use case.

  • New _authentication.md section: proof key generation (code_verifier/code_challenge, S256 only), the GET /oauth2/authorize/start endpoint with its parameters and challenge semantics (30-minute validity, bound to client_id + state, fresh state per attempt), the code_verifier token-exchange parameter with its failure mode (mismatch consumes the code), and loopback redirect URL matching (port-agnostic per RFC 8252 §7.3).
  • _applications.md: loopback http redirect URLs are now registrable for native applications, with a pointer to the PKCE requirement they trigger.
  • _ratelimits.md: GET /oauth2/authorize/start — 30 requests / 5-min window per IP.
  • Intro updated to present the three authorization flows.

Stacked on #250 (the auth-section refresh), since both edit the same sections — this PR targets that branch and will retarget to master automatically when it merges.

Blocked — do not merge until uphold/backend#19003 is merged and deployed

Two open review items on the backend PR may require small wording updates here before merging:

  • Whether /oauth2/authorize/start will reject clients that are not PKCE-required (review suggestion) — affects the "other applications may opt in" phrasing.
  • Whether client authentication (client_secret) at the token endpoint will be relaxed for public clients — the Step 3 example currently shows -u <clientId>:<clientSecret>, matching today's behavior.

Related issues

Impacted areas

Authentication, Applications and Rate Limits pages of the API reference.

Steps to reproduce or test

Development

Content derived from the backend PR's implementation and description (endpoint parameters, validation rules, TTLs and rate limit verified against its diff and config).

QA

Once the backend change is deployed to sandbox, run the documented flow end to end: generate a proof key, authorize via /oauth2/authorize/start, and exchange the code with code_verifier.

Checklist

  • Add label Breaking Change if it applies.
  • Commits are atomic and logically separated.
  • Performance implications have been considered.
  • Security implications have been considered.
  • The new and updated code has good coverage.
  • API documentation, if required, has been created or updated.
  • New dependencies have been added to package.json.
  • The README file, if required, has been updated.
  • Architectural diagram, if required, has been updated.

Deploy notes

Merge only after uphold/backend#19003 is deployed to production, and after #250 merges (this PR is stacked on it). No files removed, so no slate index changes are needed.

🤖 Generated with Claude Code

@ricardobclricardobcl self-assigned this Aug 23, 2026
@ricardobcl
ricardobclforce-pushed the feature/add-pkce-documentation branch from e0c4a61 to ca60e2eCompareAugust 26, 2026 17:22
Documents the Native Application Flow introduced by uphold/backend#19003:
proof key generation, the GET /oauth2/authorize/start endpoint, the
code_verifier token exchange parameter, loopback redirect URL matching
semantics, and the associated rate limit. Blocked until the backend
change is merged and deployed.
@ricardobcl
ricardobclforce-pushed the feature/add-pkce-documentation branch from ca60e2e to c670898CompareAugust 31, 2026 14:17
@ricardobcl
ricardobcl marked this pull request as ready for review September 1, 2026 12:44
@ricardobcl

Copy link
Copy Markdown
Author

uphold/backend#19003 has merged (squash fb25dd2d70), so this is now open for review. Keeping the blocked label until that change is deployed to production, since these pages go live on merge and describe the new GET /oauth2/authorize/start endpoint. One follow-up already queued: uphold/backend#19084 forwards intention on the start route — once it lands, intention should be added to the start endpoint's parameter table here.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

blockedDo not merge!feature

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@ricardobcl
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Add PKCE documentation - #256

Open
ricardobcl wants to merge 1 commit into
support/update-authentication-documentationfrom
feature/add-pkce-documentation
Open

Add PKCE documentation#256
ricardobcl wants to merge 1 commit into
support/update-authentication-documentationfrom
feature/add-pkce-documentation

Conversation

@ricardobcl

Copy link
Copy Markdown

Description

Documents the Native Application Flow (PKCE) being added to the authorization server by uphold/backend#19003, for native clients (desktop, CLI, mobile) that receive the OAuth redirect on a loopback address — including the MCP client use case.

  • New _authentication.md section: proof key generation (code_verifier/code_challenge, S256 only), the GET /oauth2/authorize/start endpoint with its parameters and challenge semantics (30-minute validity, bound to client_id + state, fresh state per attempt), the code_verifier token-exchange parameter with its failure mode (mismatch consumes the code), and loopback redirect URL matching (port-agnostic per RFC 8252 §7.3).
  • _applications.md: loopback http redirect URLs are now registrable for native applications, with a pointer to the PKCE requirement they trigger.
  • _ratelimits.md: GET /oauth2/authorize/start — 30 requests / 5-min window per IP.
  • Intro updated to present the three authorization flows.

Stacked on #250 (the auth-section refresh), since both edit the same sections — this PR targets that branch and will retarget to master automatically when it merges.

Blocked — do not merge until uphold/backend#19003 is merged and deployed

Two open review items on the backend PR may require small wording updates here before merging:

  • Whether /oauth2/authorize/start will reject clients that are not PKCE-required (review suggestion) — affects the "other applications may opt in" phrasing.
  • Whether client authentication (client_secret) at the token endpoint will be relaxed for public clients — the Step 3 example currently shows -u <clientId>:<clientSecret>, matching today's behavior.

Related issues

Impacted areas

Authentication, Applications and Rate Limits pages of the API reference.

Steps to reproduce or test

Development

Content derived from the backend PR's implementation and description (endpoint parameters, validation rules, TTLs and rate limit verified against its diff and config).

QA

Once the backend change is deployed to sandbox, run the documented flow end to end: generate a proof key, authorize via /oauth2/authorize/start, and exchange the code with code_verifier.

Checklist

  • Add label Breaking Change if it applies.
  • Commits are atomic and logically separated.
  • Performance implications have been considered.
  • Security implications have been considered.
  • The new and updated code has good coverage.
  • API documentation, if required, has been created or updated.
  • New dependencies have been added to package.json.
  • The README file, if required, has been updated.
  • Architectural diagram, if required, has been updated.

Deploy notes

Merge only after uphold/backend#19003 is deployed to production, and after #250 merges (this PR is stacked on it). No files removed, so no slate index changes are needed.

🤖 Generated with Claude Code

@ricardobclricardobcl self-assigned this Aug 23, 2026
@ricardobcl
ricardobclforce-pushed the feature/add-pkce-documentation branch from e0c4a61 to ca60e2eCompareAugust 26, 2026 17:22
Documents the Native Application Flow introduced by uphold/backend#19003:
proof key generation, the GET /oauth2/authorize/start endpoint, the
code_verifier token exchange parameter, loopback redirect URL matching
semantics, and the associated rate limit. Blocked until the backend
change is merged and deployed.
@ricardobcl
ricardobclforce-pushed the feature/add-pkce-documentation branch from ca60e2e to c670898CompareAugust 31, 2026 14:17
@ricardobcl
ricardobcl marked this pull request as ready for review September 1, 2026 12:44
@ricardobcl

Copy link
Copy Markdown
Author

uphold/backend#19003 has merged (squash fb25dd2d70), so this is now open for review. Keeping the blocked label until that change is deployed to production, since these pages go live on merge and describe the new GET /oauth2/authorize/start endpoint. One follow-up already queued: uphold/backend#19084 forwards intention on the start route — once it lands, intention should be added to the start endpoint's parameter table here.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

blockedDo not merge!feature

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@ricardobcl
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add PKCE documentation - #256

Open
ricardobcl wants to merge 1 commit into
support/update-authentication-documentationfrom
feature/add-pkce-documentation
Open

Add PKCE documentation#256
ricardobcl wants to merge 1 commit into
support/update-authentication-documentationfrom
feature/add-pkce-documentation

Conversation

@ricardobcl

Copy link
Copy Markdown

Description

Documents the Native Application Flow (PKCE) being added to the authorization server by uphold/backend#19003, for native clients (desktop, CLI, mobile) that receive the OAuth redirect on a loopback address — including the MCP client use case.

  • New _authentication.md section: proof key generation (code_verifier/code_challenge, S256 only), the GET /oauth2/authorize/start endpoint with its parameters and challenge semantics (30-minute validity, bound to client_id + state, fresh state per attempt), the code_verifier token-exchange parameter with its failure mode (mismatch consumes the code), and loopback redirect URL matching (port-agnostic per RFC 8252 §7.3).
  • _applications.md: loopback http redirect URLs are now registrable for native applications, with a pointer to the PKCE requirement they trigger.
  • _ratelimits.md: GET /oauth2/authorize/start — 30 requests / 5-min window per IP.
  • Intro updated to present the three authorization flows.

Stacked on #250 (the auth-section refresh), since both edit the same sections — this PR targets that branch and will retarget to master automatically when it merges.

Blocked — do not merge until uphold/backend#19003 is merged and deployed

Two open review items on the backend PR may require small wording updates here before merging:

  • Whether /oauth2/authorize/start will reject clients that are not PKCE-required (review suggestion) — affects the "other applications may opt in" phrasing.
  • Whether client authentication (client_secret) at the token endpoint will be relaxed for public clients — the Step 3 example currently shows -u <clientId>:<clientSecret>, matching today's behavior.

Related issues

Impacted areas

Authentication, Applications and Rate Limits pages of the API reference.

Steps to reproduce or test

Development

Content derived from the backend PR's implementation and description (endpoint parameters, validation rules, TTLs and rate limit verified against its diff and config).

QA

Once the backend change is deployed to sandbox, run the documented flow end to end: generate a proof key, authorize via /oauth2/authorize/start, and exchange the code with code_verifier.

Checklist

  • Add label Breaking Change if it applies.
  • Commits are atomic and logically separated.
  • Performance implications have been considered.
  • Security implications have been considered.
  • The new and updated code has good coverage.
  • API documentation, if required, has been created or updated.
  • New dependencies have been added to package.json.
  • The README file, if required, has been updated.
  • Architectural diagram, if required, has been updated.

Deploy notes

Merge only after uphold/backend#19003 is deployed to production, and after #250 merges (this PR is stacked on it). No files removed, so no slate index changes are needed.

🤖 Generated with Claude Code

@ricardobclricardobcl self-assigned this Aug 23, 2026
@ricardobcl
ricardobclforce-pushed the feature/add-pkce-documentation branch from e0c4a61 to ca60e2eCompareAugust 26, 2026 17:22
Documents the Native Application Flow introduced by uphold/backend#19003:
proof key generation, the GET /oauth2/authorize/start endpoint, the
code_verifier token exchange parameter, loopback redirect URL matching
semantics, and the associated rate limit. Blocked until the backend
change is merged and deployed.
@ricardobcl
ricardobclforce-pushed the feature/add-pkce-documentation branch from ca60e2e to c670898CompareAugust 31, 2026 14:17
@ricardobcl
ricardobcl marked this pull request as ready for review September 1, 2026 12:44
@ricardobcl

Copy link
Copy Markdown
Author

uphold/backend#19003 has merged (squash fb25dd2d70), so this is now open for review. Keeping the blocked label until that change is deployed to production, since these pages go live on merge and describe the new GET /oauth2/authorize/start endpoint. One follow-up already queued: uphold/backend#19084 forwards intention on the start route — once it lands, intention should be added to the start endpoint's parameter table here.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

blockedDo not merge!feature

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@ricardobcl
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add PKCE documentation - #256

Open
ricardobcl wants to merge 1 commit into
support/update-authentication-documentationfrom
feature/add-pkce-documentation
Open

Add PKCE documentation#256
ricardobcl wants to merge 1 commit into
support/update-authentication-documentationfrom
feature/add-pkce-documentation

Conversation

@ricardobcl

Copy link
Copy Markdown

Description

Documents the Native Application Flow (PKCE) being added to the authorization server by uphold/backend#19003, for native clients (desktop, CLI, mobile) that receive the OAuth redirect on a loopback address — including the MCP client use case.

  • New _authentication.md section: proof key generation (code_verifier/code_challenge, S256 only), the GET /oauth2/authorize/start endpoint with its parameters and challenge semantics (30-minute validity, bound to client_id + state, fresh state per attempt), the code_verifier token-exchange parameter with its failure mode (mismatch consumes the code), and loopback redirect URL matching (port-agnostic per RFC 8252 §7.3).
  • _applications.md: loopback http redirect URLs are now registrable for native applications, with a pointer to the PKCE requirement they trigger.
  • _ratelimits.md: GET /oauth2/authorize/start — 30 requests / 5-min window per IP.
  • Intro updated to present the three authorization flows.

Stacked on #250 (the auth-section refresh), since both edit the same sections — this PR targets that branch and will retarget to master automatically when it merges.

Blocked — do not merge until uphold/backend#19003 is merged and deployed

Two open review items on the backend PR may require small wording updates here before merging:

  • Whether /oauth2/authorize/start will reject clients that are not PKCE-required (review suggestion) — affects the "other applications may opt in" phrasing.
  • Whether client authentication (client_secret) at the token endpoint will be relaxed for public clients — the Step 3 example currently shows -u <clientId>:<clientSecret>, matching today's behavior.

Related issues

Impacted areas

Authentication, Applications and Rate Limits pages of the API reference.

Steps to reproduce or test

Development

Content derived from the backend PR's implementation and description (endpoint parameters, validation rules, TTLs and rate limit verified against its diff and config).

QA

Once the backend change is deployed to sandbox, run the documented flow end to end: generate a proof key, authorize via /oauth2/authorize/start, and exchange the code with code_verifier.

Checklist

  • Add label Breaking Change if it applies.
  • Commits are atomic and logically separated.
  • Performance implications have been considered.
  • Security implications have been considered.
  • The new and updated code has good coverage.
  • API documentation, if required, has been created or updated.
  • New dependencies have been added to package.json.
  • The README file, if required, has been updated.
  • Architectural diagram, if required, has been updated.

Deploy notes

Merge only after uphold/backend#19003 is deployed to production, and after #250 merges (this PR is stacked on it). No files removed, so no slate index changes are needed.

🤖 Generated with Claude Code

@ricardobclricardobcl self-assigned this Aug 23, 2026
@ricardobcl
ricardobclforce-pushed the feature/add-pkce-documentation branch from e0c4a61 to ca60e2eCompareAugust 26, 2026 17:22
Documents the Native Application Flow introduced by uphold/backend#19003:
proof key generation, the GET /oauth2/authorize/start endpoint, the
code_verifier token exchange parameter, loopback redirect URL matching
semantics, and the associated rate limit. Blocked until the backend
change is merged and deployed.
@ricardobcl
ricardobclforce-pushed the feature/add-pkce-documentation branch from ca60e2e to c670898CompareAugust 31, 2026 14:17
@ricardobcl
ricardobcl marked this pull request as ready for review September 1, 2026 12:44
@ricardobcl

Copy link
Copy Markdown
Author

uphold/backend#19003 has merged (squash fb25dd2d70), so this is now open for review. Keeping the blocked label until that change is deployed to production, since these pages go live on merge and describe the new GET /oauth2/authorize/start endpoint. One follow-up already queued: uphold/backend#19084 forwards intention on the start route — once it lands, intention should be added to the start endpoint's parameter table here.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

blockedDo not merge!feature

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@ricardobcl
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Add PKCE documentation - #256

Open
ricardobcl wants to merge 1 commit into
support/update-authentication-documentationfrom
feature/add-pkce-documentation
Open

Add PKCE documentation#256
ricardobcl wants to merge 1 commit into
support/update-authentication-documentationfrom
feature/add-pkce-documentation

Conversation

@ricardobcl

Copy link
Copy Markdown

Description

Documents the Native Application Flow (PKCE) being added to the authorization server by uphold/backend#19003, for native clients (desktop, CLI, mobile) that receive the OAuth redirect on a loopback address — including the MCP client use case.

  • New _authentication.md section: proof key generation (code_verifier/code_challenge, S256 only), the GET /oauth2/authorize/start endpoint with its parameters and challenge semantics (30-minute validity, bound to client_id + state, fresh state per attempt), the code_verifier token-exchange parameter with its failure mode (mismatch consumes the code), and loopback redirect URL matching (port-agnostic per RFC 8252 §7.3).
  • _applications.md: loopback http redirect URLs are now registrable for native applications, with a pointer to the PKCE requirement they trigger.
  • _ratelimits.md: GET /oauth2/authorize/start — 30 requests / 5-min window per IP.
  • Intro updated to present the three authorization flows.

Stacked on #250 (the auth-section refresh), since both edit the same sections — this PR targets that branch and will retarget to master automatically when it merges.

Blocked — do not merge until uphold/backend#19003 is merged and deployed

Two open review items on the backend PR may require small wording updates here before merging:

  • Whether /oauth2/authorize/start will reject clients that are not PKCE-required (review suggestion) — affects the "other applications may opt in" phrasing.
  • Whether client authentication (client_secret) at the token endpoint will be relaxed for public clients — the Step 3 example currently shows -u <clientId>:<clientSecret>, matching today's behavior.

Related issues

Impacted areas

Authentication, Applications and Rate Limits pages of the API reference.

Steps to reproduce or test

Development

Content derived from the backend PR's implementation and description (endpoint parameters, validation rules, TTLs and rate limit verified against its diff and config).

QA

Once the backend change is deployed to sandbox, run the documented flow end to end: generate a proof key, authorize via /oauth2/authorize/start, and exchange the code with code_verifier.

Checklist

  • Add label Breaking Change if it applies.
  • Commits are atomic and logically separated.
  • Performance implications have been considered.
  • Security implications have been considered.
  • The new and updated code has good coverage.
  • API documentation, if required, has been created or updated.
  • New dependencies have been added to package.json.
  • The README file, if required, has been updated.
  • Architectural diagram, if required, has been updated.

Deploy notes

Merge only after uphold/backend#19003 is deployed to production, and after #250 merges (this PR is stacked on it). No files removed, so no slate index changes are needed.

🤖 Generated with Claude Code

@ricardobclricardobcl self-assigned this Aug 23, 2026
@ricardobcl
ricardobclforce-pushed the feature/add-pkce-documentation branch from e0c4a61 to ca60e2eCompareAugust 26, 2026 17:22
Documents the Native Application Flow introduced by uphold/backend#19003:
proof key generation, the GET /oauth2/authorize/start endpoint, the
code_verifier token exchange parameter, loopback redirect URL matching
semantics, and the associated rate limit. Blocked until the backend
change is merged and deployed.
@ricardobcl
ricardobclforce-pushed the feature/add-pkce-documentation branch from ca60e2e to c670898CompareAugust 31, 2026 14:17
@ricardobcl
ricardobcl marked this pull request as ready for review September 1, 2026 12:44
@ricardobcl

Copy link
Copy Markdown
Author

uphold/backend#19003 has merged (squash fb25dd2d70), so this is now open for review. Keeping the blocked label until that change is deployed to production, since these pages go live on merge and describe the new GET /oauth2/authorize/start endpoint. One follow-up already queued: uphold/backend#19084 forwards intention on the start route — once it lands, intention should be added to the start endpoint's parameter table here.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

blockedDo not merge!feature

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@ricardobcl
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add PKCE documentation - #256

Open
ricardobcl wants to merge 1 commit into
support/update-authentication-documentationfrom
feature/add-pkce-documentation
Open

Add PKCE documentation#256
ricardobcl wants to merge 1 commit into
support/update-authentication-documentationfrom
feature/add-pkce-documentation

Conversation

@ricardobcl

Copy link
Copy Markdown

Description

Documents the Native Application Flow (PKCE) being added to the authorization server by uphold/backend#19003, for native clients (desktop, CLI, mobile) that receive the OAuth redirect on a loopback address — including the MCP client use case.

  • New _authentication.md section: proof key generation (code_verifier/code_challenge, S256 only), the GET /oauth2/authorize/start endpoint with its parameters and challenge semantics (30-minute validity, bound to client_id + state, fresh state per attempt), the code_verifier token-exchange parameter with its failure mode (mismatch consumes the code), and loopback redirect URL matching (port-agnostic per RFC 8252 §7.3).
  • _applications.md: loopback http redirect URLs are now registrable for native applications, with a pointer to the PKCE requirement they trigger.
  • _ratelimits.md: GET /oauth2/authorize/start — 30 requests / 5-min window per IP.
  • Intro updated to present the three authorization flows.

Stacked on #250 (the auth-section refresh), since both edit the same sections — this PR targets that branch and will retarget to master automatically when it merges.

Blocked — do not merge until uphold/backend#19003 is merged and deployed

Two open review items on the backend PR may require small wording updates here before merging:

  • Whether /oauth2/authorize/start will reject clients that are not PKCE-required (review suggestion) — affects the "other applications may opt in" phrasing.
  • Whether client authentication (client_secret) at the token endpoint will be relaxed for public clients — the Step 3 example currently shows -u <clientId>:<clientSecret>, matching today's behavior.

Related issues

Impacted areas

Authentication, Applications and Rate Limits pages of the API reference.

Steps to reproduce or test

Development

Content derived from the backend PR's implementation and description (endpoint parameters, validation rules, TTLs and rate limit verified against its diff and config).

QA

Once the backend change is deployed to sandbox, run the documented flow end to end: generate a proof key, authorize via /oauth2/authorize/start, and exchange the code with code_verifier.

Checklist

  • Add label Breaking Change if it applies.
  • Commits are atomic and logically separated.
  • Performance implications have been considered.
  • Security implications have been considered.
  • The new and updated code has good coverage.
  • API documentation, if required, has been created or updated.
  • New dependencies have been added to package.json.
  • The README file, if required, has been updated.
  • Architectural diagram, if required, has been updated.

Deploy notes

Merge only after uphold/backend#19003 is deployed to production, and after #250 merges (this PR is stacked on it). No files removed, so no slate index changes are needed.

🤖 Generated with Claude Code

@ricardobclricardobcl self-assigned this Aug 23, 2026
@ricardobcl
ricardobclforce-pushed the feature/add-pkce-documentation branch from e0c4a61 to ca60e2eCompareAugust 26, 2026 17:22
Documents the Native Application Flow introduced by uphold/backend#19003:
proof key generation, the GET /oauth2/authorize/start endpoint, the
code_verifier token exchange parameter, loopback redirect URL matching
semantics, and the associated rate limit. Blocked until the backend
change is merged and deployed.
@ricardobcl
ricardobclforce-pushed the feature/add-pkce-documentation branch from ca60e2e to c670898CompareAugust 31, 2026 14:17
@ricardobcl
ricardobcl marked this pull request as ready for review September 1, 2026 12:44
@ricardobcl

Copy link
Copy Markdown
Author

uphold/backend#19003 has merged (squash fb25dd2d70), so this is now open for review. Keeping the blocked label until that change is deployed to production, since these pages go live on merge and describe the new GET /oauth2/authorize/start endpoint. One follow-up already queued: uphold/backend#19084 forwards intention on the start route — once it lands, intention should be added to the start endpoint's parameter table here.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

blockedDo not merge!feature

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@ricardobcl
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add PKCE documentation - #256

Open
ricardobcl wants to merge 1 commit into
support/update-authentication-documentationfrom
feature/add-pkce-documentation
Open

Add PKCE documentation#256
ricardobcl wants to merge 1 commit into
support/update-authentication-documentationfrom
feature/add-pkce-documentation

Conversation

@ricardobcl

Copy link
Copy Markdown

Description

Documents the Native Application Flow (PKCE) being added to the authorization server by uphold/backend#19003, for native clients (desktop, CLI, mobile) that receive the OAuth redirect on a loopback address — including the MCP client use case.

  • New _authentication.md section: proof key generation (code_verifier/code_challenge, S256 only), the GET /oauth2/authorize/start endpoint with its parameters and challenge semantics (30-minute validity, bound to client_id + state, fresh state per attempt), the code_verifier token-exchange parameter with its failure mode (mismatch consumes the code), and loopback redirect URL matching (port-agnostic per RFC 8252 §7.3).
  • _applications.md: loopback http redirect URLs are now registrable for native applications, with a pointer to the PKCE requirement they trigger.
  • _ratelimits.md: GET /oauth2/authorize/start — 30 requests / 5-min window per IP.
  • Intro updated to present the three authorization flows.

Stacked on #250 (the auth-section refresh), since both edit the same sections — this PR targets that branch and will retarget to master automatically when it merges.

Blocked — do not merge until uphold/backend#19003 is merged and deployed

Two open review items on the backend PR may require small wording updates here before merging:

  • Whether /oauth2/authorize/start will reject clients that are not PKCE-required (review suggestion) — affects the "other applications may opt in" phrasing.
  • Whether client authentication (client_secret) at the token endpoint will be relaxed for public clients — the Step 3 example currently shows -u <clientId>:<clientSecret>, matching today's behavior.

Related issues

Impacted areas

Authentication, Applications and Rate Limits pages of the API reference.

Steps to reproduce or test

Development

Content derived from the backend PR's implementation and description (endpoint parameters, validation rules, TTLs and rate limit verified against its diff and config).

QA

Once the backend change is deployed to sandbox, run the documented flow end to end: generate a proof key, authorize via /oauth2/authorize/start, and exchange the code with code_verifier.

Checklist

  • Add label Breaking Change if it applies.
  • Commits are atomic and logically separated.
  • Performance implications have been considered.
  • Security implications have been considered.
  • The new and updated code has good coverage.
  • API documentation, if required, has been created or updated.
  • New dependencies have been added to package.json.
  • The README file, if required, has been updated.
  • Architectural diagram, if required, has been updated.

Deploy notes

Merge only after uphold/backend#19003 is deployed to production, and after #250 merges (this PR is stacked on it). No files removed, so no slate index changes are needed.

🤖 Generated with Claude Code

@ricardobclricardobcl self-assigned this Aug 23, 2026
@ricardobcl
ricardobclforce-pushed the feature/add-pkce-documentation branch from e0c4a61 to ca60e2eCompareAugust 26, 2026 17:22
Documents the Native Application Flow introduced by uphold/backend#19003:
proof key generation, the GET /oauth2/authorize/start endpoint, the
code_verifier token exchange parameter, loopback redirect URL matching
semantics, and the associated rate limit. Blocked until the backend
change is merged and deployed.
@ricardobcl
ricardobclforce-pushed the feature/add-pkce-documentation branch from ca60e2e to c670898CompareAugust 31, 2026 14:17
@ricardobcl
ricardobcl marked this pull request as ready for review September 1, 2026 12:44
@ricardobcl

Copy link
Copy Markdown
Author

uphold/backend#19003 has merged (squash fb25dd2d70), so this is now open for review. Keeping the blocked label until that change is deployed to production, since these pages go live on merge and describe the new GET /oauth2/authorize/start endpoint. One follow-up already queued: uphold/backend#19084 forwards intention on the start route — once it lands, intention should be added to the start endpoint's parameter table here.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

blockedDo not merge!feature

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@ricardobcl
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Add PKCE documentation - #256

Open
ricardobcl wants to merge 1 commit into
support/update-authentication-documentationfrom
feature/add-pkce-documentation
Open

Add PKCE documentation#256
ricardobcl wants to merge 1 commit into
support/update-authentication-documentationfrom
feature/add-pkce-documentation

Conversation

@ricardobcl

Copy link
Copy Markdown

Description

Documents the Native Application Flow (PKCE) being added to the authorization server by uphold/backend#19003, for native clients (desktop, CLI, mobile) that receive the OAuth redirect on a loopback address — including the MCP client use case.

  • New _authentication.md section: proof key generation (code_verifier/code_challenge, S256 only), the GET /oauth2/authorize/start endpoint with its parameters and challenge semantics (30-minute validity, bound to client_id + state, fresh state per attempt), the code_verifier token-exchange parameter with its failure mode (mismatch consumes the code), and loopback redirect URL matching (port-agnostic per RFC 8252 §7.3).
  • _applications.md: loopback http redirect URLs are now registrable for native applications, with a pointer to the PKCE requirement they trigger.
  • _ratelimits.md: GET /oauth2/authorize/start — 30 requests / 5-min window per IP.
  • Intro updated to present the three authorization flows.

Stacked on #250 (the auth-section refresh), since both edit the same sections — this PR targets that branch and will retarget to master automatically when it merges.

Blocked — do not merge until uphold/backend#19003 is merged and deployed

Two open review items on the backend PR may require small wording updates here before merging:

  • Whether /oauth2/authorize/start will reject clients that are not PKCE-required (review suggestion) — affects the "other applications may opt in" phrasing.
  • Whether client authentication (client_secret) at the token endpoint will be relaxed for public clients — the Step 3 example currently shows -u <clientId>:<clientSecret>, matching today's behavior.

Related issues

Impacted areas

Authentication, Applications and Rate Limits pages of the API reference.

Steps to reproduce or test

Development

Content derived from the backend PR's implementation and description (endpoint parameters, validation rules, TTLs and rate limit verified against its diff and config).

QA

Once the backend change is deployed to sandbox, run the documented flow end to end: generate a proof key, authorize via /oauth2/authorize/start, and exchange the code with code_verifier.

Checklist

  • Add label Breaking Change if it applies.
  • Commits are atomic and logically separated.
  • Performance implications have been considered.
  • Security implications have been considered.
  • The new and updated code has good coverage.
  • API documentation, if required, has been created or updated.
  • New dependencies have been added to package.json.
  • The README file, if required, has been updated.
  • Architectural diagram, if required, has been updated.

Deploy notes

Merge only after uphold/backend#19003 is deployed to production, and after #250 merges (this PR is stacked on it). No files removed, so no slate index changes are needed.

🤖 Generated with Claude Code

@ricardobclricardobcl self-assigned this Aug 23, 2026
@ricardobcl
ricardobclforce-pushed the feature/add-pkce-documentation branch from e0c4a61 to ca60e2eCompareAugust 26, 2026 17:22
Documents the Native Application Flow introduced by uphold/backend#19003:
proof key generation, the GET /oauth2/authorize/start endpoint, the
code_verifier token exchange parameter, loopback redirect URL matching
semantics, and the associated rate limit. Blocked until the backend
change is merged and deployed.
@ricardobcl
ricardobclforce-pushed the feature/add-pkce-documentation branch from ca60e2e to c670898CompareAugust 31, 2026 14:17
@ricardobcl
ricardobcl marked this pull request as ready for review September 1, 2026 12:44
@ricardobcl

Copy link
Copy Markdown
Author

uphold/backend#19003 has merged (squash fb25dd2d70), so this is now open for review. Keeping the blocked label until that change is deployed to production, since these pages go live on merge and describe the new GET /oauth2/authorize/start endpoint. One follow-up already queued: uphold/backend#19084 forwards intention on the start route — once it lands, intention should be added to the start endpoint's parameter table here.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

blockedDo not merge!feature

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@ricardobcl