Official agent skill

Dpop Adoption

by google in google/skills

Implement and debug OAuth 2.0 DPoP (RFC 9449) refresh token sender-constraining for WebCrypto, Node.js ES6, and browser runtimes integrating with Google's OAuth platform.

OfficialApache-2.0Auto-check passedBackend & APIs

Install Dpop Adoption

skills CLI
$ npx skills add google/skills --skill dpop-adoption -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install google/skills dpop-adoption --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/google/skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/identity/dpop-adoption .claude/skills/dpop-adoption && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
dpop-adoption
GitHub stars
21k
Token cost
~2.8k tokens
SKILL.md length
1,002 words
Files
1
Skills in repo
147
Repo updated
First seen
Licence
Apache-2.0

At a glance

Implement and debug OAuth 2.0 DPoP (RFC 9449) refresh token sender-constraining for WebCrypto, Node.js ES6, and browser runtimes integrating with Google's OAuth platform.

  • Works in 5 steps: Core Cryptographic & Architectural… → Implementation Rules & Mandatory Public… → Token Endpoint & Resource Request Workflow → …
  • Configuring non-extractable asymmetric key pairs (P-256)
  • SKILL.md covers 1. Core Cryptographic &…, 2. Implementation Rules &…, 3. Token Endpoint & Resource… and 4. Concise Agent Egress Protocol, plus 1 more section
  • Calls npx; reaches oauth2.googleapis.com

What it does

Dpop Adoption is an agent skill from google/skills, published by the product's own GitHub organization. Implement and debug OAuth 2.0 DPoP (RFC 9449) refresh token sender-constraining for WebCrypto, Node.js ES6, and browser runtimes integrating with Google's OAuth platform. Use when configuring non-extractable asymmetric key pairs (P-256), generating DPoP Proof JWTs for authorization code exchange and token refresh, or handling 400 usedpopnonce challenge retry loops at oauth2.googleapis.com/token. Don't use for unconstrained OAuth 2.0 flows (where refresh tokens are not bound to a client key pair), or for Google…

Its SKILL.md is about 2.8k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Backend & APIs, covering OAuth and OpenID Connect and Authentication. It works with Google Cloud and Node.js. The repository describes itself as: Agent Skills for Google products and technologies. The licence is Apache-2.0.

When your agent uses it

  • Configuring non-extractable asymmetric key pairs (P-256)
  • Generating DPoP Proof JWTs for authorization code exchange and token refresh
  • Handling 400 usedpopnonce challenge retry loops at oauth2.googleapis.com/token
  • Unconstrained OAuth 2.0 flows (where refresh tokens are not bound to a client key pair)

Example prompts

  • “/dpop-adoption”

Requirements

  • Node.js

Workflow steps

5 steps, taken from the step headings in SKILL.md.

  1. Core Cryptographic & Architectural Invariants
  2. Implementation Rules & Mandatory Public API
  3. Token Endpoint & Resource Request Workflow
  4. Concise Agent Egress Protocol
  5. References & Supporting Documentation

What it can do on your machine

Read from SKILL.md and the folder at commit 7d97937. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • npx

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • oauth2.googleapis.com

    Also links to:

    • developers.google.com
    • datatracker.ietf.org

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Dpop Adoption loads about 2.8k tokens when it runs. Until then it costs about 144 tokens; SKILL.md has 1,002 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~144
When it runs · the whole SKILL.md, loaded when a task matches
~2.8k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from google/skills at commit 7d97937, republished under its Apache-2.0 licence (© google). 1,002 words, ~2,815 tokens.

Download SKILL.mdSave it as .claude/skills/dpop-adoption/SKILL.md (or your agent's skills folder).
name
dpop-adoption
description
Implement and debug OAuth 2.0 DPoP (RFC 9449) refresh token sender-constraining for WebCrypto, Node.js ES6, and browser runtimes integrating with Google's OAuth platform. Use when configuring non-extractable asymmetric key pairs (P-256), generating DPoP Proof JWTs for authorization code exchange and token refresh, or handling 400 use_dpop_nonce challenge retry loops at oauth2.googleapis.com/token. Don't use for unconstrained OAuth 2.0 flows (where refresh tokens are not bound to a client key pair), or for Google Cloud IAM / service account authentication.
metadata.version
1.0.0
metadata.category
Identity

DPoP Adoption & Identity Security Architecture

Demonstrating Proof-of-Possession (DPoP, RFC 9449) secures OAuth 2.0 refresh tokens against interception and replay attacks by cryptographically binding them to a private key held exclusively by the client. In Google's OAuth 2.0 platform, DPoP binds the refresh token at the token endpoint, while access tokens issued for Google APIs are standard Bearer tokens (token_type: "Bearer").

1. Core Cryptographic & Architectural Invariants

When implementing DPoP helpers or upgrading HTTP clients, you MUST adhere to the following strict security invariants:

A. Universal WebCrypto & Runtime Compatibility
  • In modern ES6 JavaScript ("type": "module" for Node 18+ and browsers), ALWAYS access globalThis.crypto directly after verifying the environment context.
  • NEVER import legacy CommonJS modules via require('node:crypto') or reference browser-scoped window.crypto, as these cause module initialization crashes across hybrid runtimes.
B. Hardware-Backed Non-Extractable Key Persistence
  • Generate an Elliptic Curve key pair on the SECP256R1 (P-256) curve: { name: 'ECDSA', namedCurve: 'P-256' }.
  • CRITICAL SECURITY GUARDRAIL: The private key MUST be configured as non-extractable (extractable: false). This guarantees the private key can never leave the hardware cryptographic boundary (Secure Enclave, Android KeyStore, or JS sandbox memory), thwarting XSS and dependency token theft attacks.
  • The public key MUST remain exportable (extractable: true) to allow emitting JSON Web Keys (JWKs).
C. Public JWK Formatting Standards
  • When exporting public keys to attach to DPoP Proof JWT headers, construct a clean JWK dictionary containing strictly:
    • "kty": "EC"
    • "crv": "P-256"
    • "x": Base64URL-encoded x-coordinate without trailing equal sign padding (=).
    • "y": Base64URL-encoded y-coordinate without trailing equal sign padding (=).
  • NEVER expose private key parameters ("d") or superfluous metadata.
D. IEEE P1363 vs. ASN.1 DER Signature Disambiguation
  • DPoP Proof JWTs require raw concatenated coordinate signatures ($R \parallel S$, exactly 64 bytes for P-256) per IEEE P1363 and RFC 7518.
  • WebCrypto Native Rule: In standard WebCrypto (crypto.subtle.sign), ECDSA signatures are ALREADY emitted natively in raw IEEE P1363 format (concatenated 32-byte r and s buffers, 64 bytes total). DO NOT attempt DER-to-Raw conversion on crypto.subtle.sign outputs, as parsing a 64-byte raw buffer as ASN.1 DER causes an immediate runtime exception (Invalid DER sequence). Directly base64url-encode the raw ArrayBuffer.
  • Legacy API Fallback: If and only if implementing in legacy Java/Android (java.security.Signature) or Node CommonJS (crypto.createSign), convert ASN.1 DER output to raw 64-byte IEEE P1363 format before base64url encoding.
E. SPA & Backend-for-Frontend (BFF) Architecture
  • Secretless SPAs Limitation: Pure client-side single-page applications (SPAs) without a backend cannot use DPoP directly with Google APIs due to client_secret requirements on server endpoints and browser CORS limitations on the DPoP-Nonce response header.
  • BFF Pattern: To secure SPAs with DPoP, route authorization and token refresh requests through a Backend-for-Frontend (BFF) server-side client. The BFF sets access_type=offline, binds refresh tokens server-side using DPoP, and maintains secure session cookies with the frontend.

2. Implementation Rules & Mandatory Public API

When creating new modules, your module MUST explicitly export all functions below to integrate cleanly with CI/CD verification harnesses and automated probers. When inspecting or refactoring existing codebases, ensure equivalent cryptographic and RFC 9449 logic is present. Obey strict claim derivation logic in all cases:

A. DPoP Proof JWT Claim Derivation Rules (createDPoPProof)

When generating the DPoP Proof JWT in createDPoPProof:

1. JOSE Header (typ, alg, jwk):

javascript
// Header
{
  "typ": "dpop+jwt",
  "alg": "ES256",
  "jwk": await exportPublicJWK(publicKey)
}

2. Payload Claims:

  • "htm": Uppercase HTTP Method ("POST" for token requests).
  • "htu": Target URI stripped of query parameters and hash fragments using sanitizeHTU(htu). For token requests, this is https://oauth2.googleapis.com/token.
  • "iat": Current integer epoch timestamp in seconds (Math.floor(Date.now() / 1000)).
  • "jti" (Critical Invariant):
    1. If an explicit jti argument is provided to createDPoPProof, use that exact string over all others.
    2. Otherwise, if an authCode argument is provided (during initial code exchange), set jti = await calculateAuthCodeJti(authCode) where calculateAuthCodeJti computes base64url(sha256(authCode)) to ensure the DPoP proof is cryptographically bound to the authorization code.
    3. Only if neither jti nor authCode is provided, generate a fresh cryptographic random string via generateRandomString() (such as crypto.getRandomValues(new Uint8Array(24)) base64url encoded).
  • "ath" (Optional): If an accessToken argument is provided for RFC 9449 resource requests, compute base64url(sha256(accessToken)) via calculateATH(accessToken) and inject it (RFC 9449 Section 6.1).
  • "nonce" (Optional): If a nonce argument is provided, inject it directly into the payload.
Show full SKILL.md (332 more words)Show less
B. Explicit Export Signatures
javascript
// 1. Key generation & JWK export
export async function generateDPoPKeyPair() // -> { publicKey, privateKey } (private key extractable=false)
export async function exportPublicJWK(publicKey) // -> { kty: 'EC', crv: 'P-256', x, y }

// 2. Proof generation & validation
export async function createDPoPProof({ privateKey, publicKey, htm, htu, nonce, accessToken, authCode, jti }) // -> signed JWT string
export async function verifyDPoPProof(dpopProofJwt) // -> { isValid: boolean, header, payload, error }
export function sanitizeHTU(htu) // -> URL stripped of query and hash: const u = new URL(htu); return `${u.origin}${u.pathname}`;

// 3. Cryptographic & encoding utilities
export function base64UrlEncode(buffer) // -> Uint8Array/ArrayBuffer to base64url string without '=' padding
export function base64UrlDecode(str) // -> base64url string to Uint8Array/Buffer
export function stringToBase64Url(str) // -> UTF-8 string to base64url
export function base64UrlToString(str) // -> base64url to UTF-8 string
export function generateRandomString(byteLength = 32) // -> cryptographic random base64url string
export async function calculateATH(accessToken) // -> base64url(sha256(accessToken)) per RFC 9449 Sec 6.1
export async function calculateAuthCodeJti(code) // -> base64url(sha256(code))
export async function generatePKCE() // -> { codeVerifier (>=43 chars), codeChallenge, codeChallengeMethod: 'S256' }

3. Token Endpoint & Resource Request Workflow

When integrating with Google's OAuth 2.0 platform:

  1. Token Endpoint Requests (oauth2.googleapis.com/token):
    • Attach the DPoP Proof JWT in the DPoP HTTP header: `DPoP: ${proofJwt}` when making POST requests for code exchange (grant_type=authorization_code) and token refresh (grant_type=refresh_token).
  2. Resource API Requests:
    • Google's token endpoint returns "token_type": "Bearer". Downstream requests to Google APIs (e.g. Calendar, Drive, Gmail) use standard `Authorization: Bearer ${accessToken}` headers without DPoP headers.
  3. Single-Retry Nonce Challenge Loop & Workflow Isolation:
    • If Google's token endpoint returns HTTP 400 Bad Request with error: "use_dpop_nonce" and a "DPoP-Nonce" response header:
      • Workflow Isolation: Google's authorization server enforces workflow isolation between authorization code exchange and token refresh, returning an HTTP 400 use_dpop_nonce challenge to establish a fresh nonce namespace. This is standard RFC-compliant protocol behavior, not a server failure.
      • Cache the fresh nonce in client state (this.dpopNonce).
      • Immediately synthesize a new DPoP Proof JWT incorporating the updated nonce claim and a fresh jti.
      • Replay the failed token request exactly once. If the retried request fails, terminate immediately with an error to prevent infinite recursion.

4. Concise Agent Egress Protocol

When prompted to synthesize or output code deliverables under this skill, prioritize returning clean, directly importable code blocks without redundant conversational preambles or repetitive filler. For conceptual or architectural inquiries, provide standard direct answers.

5. References & Supporting Documentation

Developer Documentation (Google for Developers)
Developer Knowledge MCP Server
  • Agents equipped with Model Context Protocol (MCP) can query real-time Google Developer documentation using the Google Developer Knowledge MCP Server (npx -y @google/mcp-developer-knowledge-server) via developer_knowledge:search_documents and developer_knowledge:get_documents.
Standards & RFC Specifications

© google, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in skills/identity/dpop-adoption of google/skills.

Open the folder on GitHubat commit 7d97937

Compare with similar skills

Dpop Adoption next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Dpop Adoption compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Dpop Adoption this skillgoogle/skills21k—~2.8kAutomated safety check: PassApache-2.0
Atmos Authcloudposse/atmos1.4k—~4.2kAutomated safety check: PassApache-2.0
Managing Cloud Identity With Oktamukul975/Anthropic-Cybersecurity-Skills34k—~3.1kAutomated safety check: PassApache-2.0
Iam Auditbriiirussell/cybersecurity-skills413—~3.1kAutomated safety check: NotesMIT
Google Cloud AuthVKirill/claude-lane-stack122—~3.1kAutomated safety check: NotesMIT
Lokalise Install Authjeremylongshore/tons-of-skills-marketplace2.8k—~1.4kAutomated safety check: NotesMIT

Similar skills

  • Atmos Auth

    cloudposse/atmos

    Authentication and identity management: providers (SSO/SAML/OIDC/GCP/Atmos Pro), identities, keyring, identity chaining, login/exec/shell/console, and github/sts for private GitHub access

    1.4k GitHub stars~4.2k tokensUpdated today
    Backend & APIsAuto-check passed
  • Managing Cloud Identity With Okta

    mukul975/Anthropic-Cybersecurity-Skills

    Implement Okta as a centralized cloud identity provider: configure SSO with AWS, Azure, and GCP, deploy phishing-resistant MFA with Okta FastPass, automate user provisioning/deprovisioning, and…

    34k GitHub stars~3.1k tokensUpdated 1 mo ago
    Backend & APIsAuto-check passed
  • Iam Audit

    briiirussell/cybersecurity-skills

    Audit, design, and migrate Identity and Access Management — cloud provider IAM (AWS, GCP, Azure), identity providers (Okta, Entra ID / Azure AD, Auth0, Google Workspace), application authorization…

    413 GitHub stars~3.1k tokensUpdated 4 mo ago
    Backend & APIsAuto-check: notes
  • Google Cloud Auth

    VKirill/claude-lane-stack

    [RU: oauth google, авторизация гугл, service account, sa key, refresh token, invalidgrant, adc, google cloud auth] Google auth for all Google APIs — OAuth 2.0, Service Account JWT, ADC.

    122 GitHub stars~3.1k tokensUpdated 2 days ago
    Backend & APIsAuto-check: notes
  • Lokalise Install Auth

    jeremylongshore/tons-of-skills-marketplace

    Install and configure Lokalise SDK/CLI authentication. An agent skill from jeremylongshore/tons-of-skills-marketplace.

    2.8k GitHub stars~1.4k tokensUpdated today
    Backend & APIsAuto-check: notes
  • Hubspot Integration

    aiskillstore/marketplace

    Expert patterns for HubSpot CRM integration including OAuth authentication, CRM objects, associations, batch operations, webhooks, and custom objects.

    430 GitHub starsUsed in 3 repos~5k tokens
    Sales & SupportAuto-check passed

More from google/skills

All 147 skills in this repo
  • Official

    Query Cloud Trace spans, filter by latency thresholds or error status, correlate distributed traces with Cloud Logging, and diagnose latency bottlenecks across Google Cloud services.

    21k GitHub stars~1.7k tokensUpdated today
    Auto-check passed
  • Official

    Manages Google Cloud Privileged Access Manager entitlements and grants: create and edit entitlements, request temporary access, and approve or deny pending grants.

    21k GitHub stars~3.2k tokensUpdated today
    Auto-check passed
  • Official

    Writes Terraform alerting policies for AI agents that emit OpenTelemetry metrics, covering reliability, cost, safety, security and quality signals on Google Cloud.

    21k GitHub stars~4.2k tokensUpdated today
    Auto-check passed
  • Official

    Deploys open models or custom weights from Model Garden to Agent Platform endpoints, checks deployment status and cleans up endpoints, confirming before any change.

    21k GitHub stars~5k tokensUpdated today
    Auto-check passed
  • Official

    Searches, manages and scaffolds skills in the Gemini Enterprise Agent Platform Skill Registry using bundled Python scripts and Google Cloud credentials.

    21k GitHub stars~584 tokensUpdated today
    Auto-check passed
  • Designs GCP infrastructure as local Terraform, validates and scans it against best practices, then imports it to Application Design Center for deployment and troubleshooting.

    21k GitHub stars~4.4k tokensUpdated today
    Auto-check passed

Categories

Questions about Dpop Adoption

What does Dpop Adoption do?

Implement and debug OAuth 2.0 DPoP (RFC 9449) refresh token sender-constraining for WebCrypto, Node.js ES6, and browser runtimes integrating with Google's OAuth platform. Dpop Adoption is an agent skill from google/skills, published by the product's own GitHub organization.js ES6, and browser runtimes integrating with Google's OAuth platform.

When should I use Dpop Adoption?

Dpop Adoption fits situations like: configuring non-extractable asymmetric key pairs (P-256); generating DPoP Proof JWTs for authorization code exchange and token refresh; handling 400 usedpopnonce challenge retry loops at oauth2.googleapis.com/token; unconstrained OAuth 2.0 flows (where refresh tokens are not bound to a client key pair).

How do I install Dpop Adoption in Claude Code?

Run `npx skills add google/skills --skill dpop-adoption -a claude-code`. Or copy the skill folder (skills/identity/dpop-adoption in google/skills) into .claude/skills/dpop-adoption in your project. Claude Code loads it when a task matches its description.

How do I install Dpop Adoption in Codex?

Run `npx skills add google/skills --skill dpop-adoption -a codex`. Or copy the skill folder (skills/identity/dpop-adoption in google/skills) into .agents/skills/dpop-adoption in your project. Codex loads it when a task matches its description.

Can I use Dpop Adoption in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add google/skills --skill dpop-adoption -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/dpop-adoption, .gemini/skills/dpop-adoption, .github/skills/dpop-adoption and .opencode/skills/dpop-adoption in your project.

What does Dpop Adoption need to run?

Going by SKILL.md and its folder, Dpop Adoption needs the command-line tools its instructions call (npx). Our summary lists: Node.js.

Does Dpop Adoption access the network?

SKILL.md names 3 domains. In commands or code: oauth2.googleapis.com; the agent is likely to contact it when it follows the instructions. As links in the text: developers.google.com and datatracker.ietf.org. This is read from the text; nothing was executed.

Is Dpop Adoption safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Dpop Adoption use?

Dpop Adoption is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Dpop Adoption use?

About 2.8k tokens (SKILL.md is roughly 11k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Dpop Adoption?

Skills that share tags, products or a category with Dpop Adoption: Atmos Auth (cloudposse/atmos, 1.4k stars), Managing Cloud Identity With Okta (mukul975/Anthropic-Cybersecurity-Skills, 34k stars), Iam Audit (briiirussell/cybersecurity-skills, 413 stars) and Google Cloud Auth (VKirill/claude-lane-stack, 122 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Dpop Adoption?

google (a GitHub organization, an official publisher) maintains it in google/skills, which has 21,032 GitHub stars. The repository holds 147 skills in this directory. The repository was last updated on October 8, 2026.

Source: google/skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.