GitHub OAuth Device authentication strategy for JavaScript
@octokit/auth-oauth-device
is implementing one of GitHub’s OAuth Device Flow.
createOAuthDeviceAuth(options)
auth(options)
auth.hook(request, route, parameters)
or auth.hook(request, options)
Browsers
Load @octokit/auth-oauth-device
directly from esm.sh
<script type="module"> import { createOAuthDeviceAuth } from "https://esm.sh/@octokit/auth-oauth-device"; </script>
Node
Install with npm install @octokit/core @octokit/auth-oauth-device
import { createOAuthDeviceAuth } from "@octokit/auth-oauth-device";
const auth = createOAuthDeviceAuth({ clientType: "oauth-app", clientId: "1234567890abcdef1234", scopes: ["public_repo"], onVerification(verification) { // verification example // { // device_code: "3584d83530557fdd1f46af8289938c8ef79f9dc5", // user_code: "WDJB-MJHT", // verification_uri: "https://github.com/login/device", // expires_in: 900, // interval: 5, // }; console.log("Open %s", verification.verification_uri); console.log("Enter code: %s", verification.user_code); }, }); const tokenAuthentication = await auth({ type: "oauth", }); // resolves with // { // type: "token", // tokenType: "oauth", // clientType: "oauth-app", // clientId: "1234567890abcdef1234", // token: "...", /* the created oauth token */ // scopes: [] /* depend on request scopes by OAuth app */ // }
GitHub Apps do not support scopes
. Client IDs of GitHub Apps have a lv1.
prefix. If the GitHub App has expiring user tokens enabled, the resulting authentication
object has extra properties related to expiration and refreshing the token.
const auth = createOAuthDeviceAuth({ clientType: "github-app", clientId: "lv1.1234567890abcdef", onVerification(verification) { // verification example // { // device_code: "3584d83530557fdd1f46af8289938c8ef79f9dc5", // user_code: "WDJB-MJHT", // verification_uri: "https://github.com/login/device", // expires_in: 900, // interval: 5, // }; console.log("Open %s", verification.verification_uri); console.log("Enter code: %s", verification.user_code); }, }); const tokenAuthentication = await auth({ type: "oauth", }); // resolves with // { // type: "token", // tokenType: "oauth", // clientType: "github-app", // clientId: "lv1.1234567890abcdef", // token: "...", /* the created oauth token */ // } // or if expiring user tokens are enabled // { // type: "token", // tokenType: "oauth", // clientType: "github-app", // clientId: "lv1.1234567890abcdef", // token: "...", /* the created oauth token */ // refreshToken: "...", // expiresAt: "2022-01-01T08:00:0.000Z", // refreshTokenExpiresAt: "2021-07-01T00:00:0.000Z", // }
createOAuthDeviceAuth(options)
The createOAuthDeviceAuth
method accepts a single options
parameter
clientId
string
Required. Find your OAuth app’s Client ID
in your account’s developer settings. onVerification
function
Required. A function that is called once the device and user codes were retrieved
The onVerification()
callback can be used to pause until the user completes step 2, which might result in a better user experience.
const auth = createOAuthDeviceAuth({ clientId: "1234567890abcdef1234", onVerification(verification) { console.log("Open %s", verification.verification_uri); console.log("Enter code: %s", verification.user_code); await prompt("press enter when you are ready to continue"); }, });
clientType
string
Must be either oauth-app
or github-app
. Defaults to oauth-app
.
request
function
You can pass in your own @octokit/request
instance. For usage with enterprise, set baseUrl
to the API root endpoint. Example:
import { request } from "@octokit/request"; createOAuthDeviceAuth({ clientId: "1234567890abcdef1234", clientSecret: "secret", request: request.defaults({ baseUrl: "https://ghe.my-company.com/api/v3", }), });
scopes
array of strings
Only relevant if clientType
is set to "oauth-app"
.
Array of scope names enabled for the token. Defaults to []
. See available scopes.
The async auth()
method returned by createOAuthDeviceAuth(options)
accepts the following options
type
string
Required. Must be set to "oauth"
scopes
array of strings
Only relevant if the clientType
strategy options was set to "oauth-app"
Array of scope names enabled for the token. Defaults to what was set in the strategy options. See available scopes
refresh
boolean
Defaults to false
. When set to false
, calling auth(options)
will resolve with a token that was previously created for the same scopes if it exists. If set to true
a new token will always be created.
The async auth(options)
method resolves to one of three possible objects
The differences are
scopes
is only present for OAuth AppsrefreshToken
, expiresAt
, refreshTokenExpiresAt
are only present for GitHub Apps, and only if token expiration is enabledtype
string
"token"
tokenType
string
"oauth"
clientType
string
"github-app"
clientId
string
The app's Client ID
token
string
The personal access token scopes
array of strings
array of scope names enabled for the token GitHub APP user authentication with expiring tokens disabled name type description type
string
"token"
tokenType
string
"oauth"
clientType
string
"github-app"
clientId
string
The app's Client ID
token
string
The personal access token GitHub APP user authentication with expiring tokens enabled name type description type
string
"token"
tokenType
string
"oauth"
clientType
string
"github-app"
clientId
string
The app's Client ID
token
string
The user access token refreshToken
string
The refresh token expiresAt
string
Date timestamp in ISO 8601 standard. Example: 2022-01-01T08:00:0.000Z
refreshTokenExpiresAt
string
Date timestamp in ISO 8601 standard. Example: 2021-07-01T00:00:0.000Z
auth.hook(request, route, parameters)
or auth.hook(request, options)
auth.hook()
hooks directly into the request life cycle. It amends the request to authenticate correctly based on the request URL.
The request
option is an instance of @octokit/request
. The route
/options
parameters are the same as for the request()
method.
auth.hook()
can be called directly to send an authenticated request
const { data: user } = await auth.hook(request, "GET /user");
Or it can be passed as option to request()
.
const requestWithAuth = request.defaults({ request: { hook: auth.hook, }, }); const { data: user } = await requestWithAuth("GET /user");
import { OAuthAppStrategyOptions, OAuthAppAuthOptions, OAuthAppAuthentication, GitHubAppStrategyOptions, GitHubAppAuthOptions, GitHubAppAuthentication, GitHubAppAuthenticationWithExpiration, } from "@octokit/auth-oauth-device";
GitHub's OAuth Device flow is different from the web flow in two ways
The flow has 3 parts (see GitHub documentation)
@octokit/auth-oauth-device
requests a device and user code@octokit/auth-oauth-device
is sending requests in the background to retrieve the OAuth access token. Once the user completed step 2, the request will succeed and the token will be returnedSee CONTRIBUTING.md
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4