Learn how to use OpenID Connect (OIDC) with your Copilot Extension to enhance security.
OpenID Connect (OIDC) allows Copilot Extensions to exchange short-lived tokens directly from their cloud provider instead of storing long-lived GitHub credentials. This feature enables both Copilot agents and skillsets to more securely authenticate users and access cloud resources.
Copilot Extensions often need to access third-party resources or APIs on behalf of users. Traditionally, this required storing GitHub tokens as secrets and making additional API calls to map these tokens to user identities in your system. With OIDC, your extension can request short-lived access tokens directly from your authentication service by exchanging GitHub identity information.
When enabled, GitHub's OIDC provider automatically generates a token containing claims about the user and the request context. Your authentication service can validate these claims and exchange them for an access token scoped specifically for your service.
Using OIDC is especially valuable for Copilot skillsets development because it allows you to leverage your existing API endpoints without maintaining separate GitHub-specific endpoints. Instead of duplicating endpoints to accept GitHub tokens, you can use OIDC to translate GitHub identities into your service’s native authentication tokens.
By implementing OIDC token exchange in your Copilot Extension, you can:
The following outlines how the Copilot Extensibility Platform exchanges an OIDC token for an access token to authenticate requests to your extension.
# HTTP header Authorization: Bearer <your-service-token> X-GitHub-Token: <github-token>
The OIDC token from GitHub is a JWT containing claims about the user and request context:
{ "jti": "<unique-token-id>", "sub": "<github-user-id>", "aud": "<your-client-id>", "iss": "https://github.com/login/oauth", "nbf": 1632492967, "exp": 1632493867, "iat": 1632493567, "act": { "sub": "api.copilotchat.com" } }
There are three steps to setting up OIDC for your extension.
Create an endpoint in your service that conforms to the RFC 8693 OAuth 2.0 Token Exchange. This endpoint should:
Accept POST requests with the following form-encoded parameters:
POST
grant_type=urn:ietf:params:oauth:grant-type:token-exchange &resource=<https://your-service.com/resource> &subject_token=<github-jwt-token> &subject_token_type=urn:ietf:params:oauth:token-type:id_token
Return a JSON response with your service's access token:
{ "access_token": <"your-service-token">, "Issued_token_type":"urn:ietf:params:oauth:token-type:access_token", "token_type": "Bearer", "expires_in": 3600 }
Return an error response when validation fails:
{ "error": "invalid_request" }
In your Copilot Extension's configuration, enable OIDC:
In the upper-right corner of any page on GitHub, click your profile photo.
Navigate to your account settings.
In the left sidebar, click Developer settings.
In the left sidebar, click GitHub Apps.
To the right of the GitHub App you want to configure for your Copilot Extension, click Edit.
In the left sidebar, click Copilot.
Under OpenID Connect Token Exchange, check Enabled.
In the Token exchange endpoint field, input your token exchange URL.
In the Request header key field, input the header key for your service's token. The default is Authorization.
Authorization
In the Request header value field, input the header value format. The default is Bearer ${token}.
Bearer ${token}
Your token exchange endpoint should validate the GitHub OIDC token by following the steps below:
aud
sub
400 Bad Request
iat
nbf
exp
act
The following sections outline common problems and best practices for implementing OIDC for your Copilot Extension.
HTTP 400
HTTP 403