Authentication
Learn to get authenticated with the GitHub API.
We'll cover the following
Overview
To fully utilize the GitHub API, we have to authenticate ourselves. Unauthenticated users can make only 60 requests per hour. However, authentication can increase this limit to 5000 requests per hour.
Use personal access tokens
First, let’s see the number of requests an unauthenticated user can make to the GitHub API. This limit is identified by x-ratelimit-limit
in the JSON response, as shown below:
const endpointUrl = 'https://api.github.com/rate_limit';const options = {method: 'GET',};async function GetRequestLimit() {try {const response = await fetch(endpointUrl, options);printResponse(response);} catch (error) {printErrors(error);}};GetRequestLimit();async function printResponse(response) {if (response.status === 200) {console.log("x-ratelimit-limit: " + response.headers.get('x-ratelimit-limit'));} else {console.log(`Error Code: ${response.status}`);console.log(`Error: ${response.statusText}`);}}async function printErrors(error) {console.log(error.message);}
Let’s look at a brief explanation of the above code:
- Line 1: We define the URL of the endpoint.
- Lines 6–13: We define the
async
function that will call the defined endpoint.- Line 9: In case of a successful request, the response of the API call is printed by invoking the
printResponse
function. - Line 11: Otherwise, the error is printed by calling
printErrors
function.
- Line 9: In case of a successful request, the response of the API call is printed by invoking the
- Line 15: We call the
async
function.
The best way to authenticate with the GitHub API is via personal access tokens. Let’s run the same code again, but this time, we’ll try to authenticate using the personal access token.
const endpointUrl = 'https://api.github.com/user';const headers = {Authorization: 'token {{ACCESS_TOKEN}}',};const options = {method: 'GET',headers,};async function GetRequestLimit() {try {const response = await fetch(endpointUrl, options);printResponse(response);} catch (error) {printErrors(error);}};GetRequestLimit();
Let’s look at a brief explanation of the above code:
- Line 1: We define the URL of the endpoint.
- Lines 12–19: We define the
async
function that will call the defined endpoint.- Line 15: In case of a successful request, the response of the API call is printed by invoking the
printResponse
function. - Line 17: Otherwise, the error is printed by calling
printErrors
function.
- Line 15: In case of a successful request, the response of the API call is printed by invoking the
- Line 21: We call the
async
function.
Note: The
printResponse
function is implemented on the backend and its purpose is to display the fetched JSON response.
TheprintErrors
function is also implemented on the backend and its purpose is to display the error received against the failed HTTP request.
As we can see, the limit has increased to 5000 requests per hour. In addition to this, authentication also provides the ability to read and write private information using this API.
The personal access tokens usually have an expiration date. The API request using an expiring personal token returns the token’s expiration date. This can be accessed using the GitHub-Authentication-Token-Expiration
header. This token can be used to inform the user that the token will expire soon.
const endpointUrl = 'https://api.github.com/user';const headers = {Authorization: 'token {{ACCESS_TOKEN}}',};const options = {method: 'GET',headers,};async function CheckTokenExpiry() {const response = await fetch(endpointUrl, options);const expiry = response.headers.get('GitHub-Authentication-Token-Expiration');if (expiry != null) {console.log(`Expiration date: ${expiry}`);} else {console.log('No Expiration date');}};CheckTokenExpiry();
Let’s look at a brief explanation of the above code:
-
Line 1: We define the URL of the endpoint.
-
Lines 12–20: We define the
async
function that will call the defined endpoint.- Line 14–19: We check if the access token has an expiry date or not.
-
Line 22: We call the
async
function.
Get your own profile
An authenticated user can fetch information from GitHub that’s associated with specific permissions. For example, we can fetch our own GitHub profile using the following code:
const endpointUrl = 'https://api.github.com/user';const headers = {Authorization: 'token {{ACCESS_TOKEN}}',};const options = {method: 'GET',headers,};async function GetProfile() {const response = await fetch(endpointUrl, options);console.log(JSON.stringify(await response.json(), null, 2));};GetProfile();
Let’s look at a brief explanation of the above code:
- Line 1: We define the URL of the endpoint.
- Lines 12–15: We define the
async
function that will call the defined endpoint. - Line 17: We call the
async
function.
HTTP responses
All the endpoints in this course return HTTP responses. The following table describes some HTTP response codes:
HTTP codes | Description |
| The endpoint is successfully executed |
| The request is forbidden |
| The validation has failed |
| Everything is working fine |
| Temporary redirection |
| The resource is not found |
| The branch has been permanently moved |
| The response was already merged |
| A merge conflict |
| There is an internal error |
| The content has not been modified |
| The service is unavailable |
| A new invite for the collaboration invitation is created |