1
0
mirror of synced 2025-12-19 18:10:59 -05:00

Add basic auth to REST doc and examples (#50758)

Co-authored-by: Sarah Edwards <skedwards88@github.com>
Co-authored-by: Peter Bengtsson <peterbe@github.com>
This commit is contained in:
Rachael Sewell
2024-06-05 14:45:09 -07:00
committed by GitHub
parent a2d5f91249
commit 4a5a335d11
14 changed files with 148 additions and 70 deletions

View File

@@ -182,6 +182,8 @@ rest_reference:
installation_access_token_name: GitHub App installation access tokens installation_access_token_name: GitHub App installation access tokens
fine_grained_access_token_name: Fine-grained personal access tokens fine_grained_access_token_name: Fine-grained personal access tokens
no_fine_grained_access: This endpoint does not work with GitHub App user access tokens, GitHub App installation access tokens, or fine-grained personal access tokens. no_fine_grained_access: This endpoint does not work with GitHub App user access tokens, GitHub App installation access tokens, or fine-grained personal access tokens.
basic_auth_heading: Basic authentication for "{{ RESTOperationTitle }}"
basic_auth: You must use <a href="/rest/authentication/authenticating-to-the-rest-api#using-basic-authentication">Basic Authentication</a> to use this endpoint. Use the application's <code>client_id</code> as the username and the <code>client_secret</code> as the password.
webhooks: webhooks:
action_type_switch_error: There was an error switching webhook action types. action_type_switch_error: There was an error switching webhook action types.
action_type: Action type action_type: Action type

View File

@@ -182,6 +182,8 @@ rest_reference:
installation_access_token_name: GitHub App installation access tokens installation_access_token_name: GitHub App installation access tokens
fine_grained_access_token_name: Fine-grained personal access tokens fine_grained_access_token_name: Fine-grained personal access tokens
no_fine_grained_access: This endpoint does not work with GitHub App user access tokens, GitHub App installation access tokens, or fine-grained personal access tokens. no_fine_grained_access: This endpoint does not work with GitHub App user access tokens, GitHub App installation access tokens, or fine-grained personal access tokens.
basic_auth_heading: Basic authentication for "{{ RESTOperationTitle }}"
basic_auth: You must use <a href="/rest/authentication/authenticating-to-the-rest-api#using-basic-authentication">Basic Authentication</a> to use this endpoint. Use the application's <code>client_id</code> as the username and the <code>client_secret</code> as the password.
webhooks: webhooks:
action_type_switch_error: There was an error switching webhook action types. action_type_switch_error: There was an error switching webhook action types.
action_type: Action type action_type: Action type

View File

@@ -185,6 +185,7 @@ export async function getProgAccessData(progAccessSource, isRest = false) {
: operation.permission_sets || [], : operation.permission_sets || [],
allowPermissionlessAccess: operation.allows_permissionless_access, allowPermissionlessAccess: operation.allows_permissionless_access,
allowsPublicRead: operation.allows_public_read, allowsPublicRead: operation.allows_public_read,
basicAuth: operation.basic_auth,
} }
} }

View File

@@ -16,11 +16,10 @@ const FINE_GRAINED_TOKEN_PATH =
type Props = { type Props = {
progAccess: ProgAccessT progAccess: ProgAccessT
slug: string slug: string
heading: string operationTitle: string
} }
export function RestAuth({ progAccess, slug, heading }: Props) { export function RestAuth({ progAccess, slug, operationTitle }: Props) {
const router = useRouter()
const { currentVersion } = useVersion() const { currentVersion } = useVersion()
const { t } = useTranslation('rest_reference') const { t } = useTranslation('rest_reference')
@@ -29,30 +28,48 @@ export function RestAuth({ progAccess, slug, heading }: Props) {
if (currentVersion === 'enterprise-server@3.9' || currentVersion === 'enterprise-server@3.8') if (currentVersion === 'enterprise-server@3.9' || currentVersion === 'enterprise-server@3.8')
return null return null
let basePath = `/${router.locale}`
if (currentVersion !== DEFAULT_VERSION) {
basePath += `/${currentVersion}`
}
// There are some operations that have no progAccess access defined // There are some operations that have no progAccess access defined
// For those operations, we shouldn't display this component // For those operations, we shouldn't display this component
if (!progAccess) return null if (!progAccess) return null
const { userToServerRest, serverToServer, fineGrainedPat } = progAccess const { userToServerRest, serverToServer, fineGrainedPat, basicAuth = false } = progAccess
const noFineGrainedAcccess = !(userToServerRest || serverToServer || fineGrainedPat) const noFineGrainedAcccess = !(userToServerRest || serverToServer || fineGrainedPat)
// Pluralize the message if needed or customize it const heading = basicAuth ? t('basic_auth_heading') : t('fine_grained_access')
// when no permissions are defined const headingId = heading.replace('{{ RESTOperationTitle }}', operationTitle)
const numPermissionSets = progAccess.permissions.length const authSlug = basicAuth
const permissionMsg = ? `${slug}--basic-authentication`
numPermissionSets === 0 : `${slug}--fine-grained-access-tokens`
? t('no_permission_sets')
: numPermissionSets > 1 return (
? t('permission_sets') + ':' <>
: t('permission_set') + ':' <h3 className="mt-4 mb-3 pt-3 h4" id={authSlug}>
const publicAccessMsg = <a href={`#${authSlug}`}>{headingId}</a>
numPermissionSets === 0 </h3>
? t('allows_public_read_access_no_permissions') {noFineGrainedAcccess ? (
: t('allows_public_read_access') <NoFineGrainedAccess basicAuth={basicAuth} />
) : (
<FineGrainedAccess progAccess={progAccess} />
)}
</>
)
}
function NoFineGrainedAccess({ basicAuth }: { basicAuth: boolean }) {
const { t } = useTranslation('rest_reference')
if (basicAuth) return <p dangerouslySetInnerHTML={{ __html: t('basic_auth') }}></p>
return <p>{t('no_fine_grained_access')}</p>
}
type FineGrainedProps = {
progAccess: ProgAccessT
}
function FineGrainedAccess({ progAccess }: FineGrainedProps) {
const router = useRouter()
const { currentVersion } = useVersion()
const { t } = useTranslation('rest_reference')
// progAccess.permissions is an array of objects // progAccess.permissions is an array of objects
// For example: [ {'"Actions" repository permissions': 'read', '"Administration" organization permissions': 'write'}, {'"Secrets" organization permissions"': 'write'} ] // For example: [ {'"Actions" repository permissions': 'read', '"Administration" organization permissions': 'write'}, {'"Secrets" organization permissions"': 'write'} ]
// Each object represents a set of permissions containing one // Each object represents a set of permissions containing one
@@ -77,7 +94,26 @@ export function RestAuth({ progAccess, slug, heading }: Props) {
) )
}) })
const fineGrainedData = ( let basePath = `/${router.locale}`
if (currentVersion !== DEFAULT_VERSION) {
basePath += `/${currentVersion}`
}
// Pluralize the message if needed or customize it
// when no permissions are defined
const numPermissionSets = progAccess.permissions.length
const permissionMsg =
numPermissionSets === 0
? t('no_permission_sets')
: numPermissionSets > 1
? t('permission_sets') + ':'
: t('permission_set') + ':'
const publicAccessMsg =
numPermissionSets === 0
? t('allows_public_read_access_no_permissions')
: t('allows_public_read_access')
return (
<> <>
<p>{t('works_with_fine_grained_tokens')}:</p> <p>{t('works_with_fine_grained_tokens')}:</p>
<ul> <ul>
@@ -106,13 +142,4 @@ export function RestAuth({ progAccess, slug, heading }: Props) {
{progAccess.allowsPublicRead && <p>{publicAccessMsg}</p>} {progAccess.allowsPublicRead && <p>{publicAccessMsg}</p>}
</> </>
) )
return (
<>
<h3 className="mt-4 mb-3 pt-3 h4" id={`${slug}--fine-grained-access-tokens`}>
<a href={`#${slug}--fine-grained-access-tokens`}>{heading}</a>
</h3>
{noFineGrainedAcccess ? <p>{t('no_fine_grained_access')}</p> : fineGrainedData}
</>
)
} }

View File

@@ -70,7 +70,7 @@ export function RestOperation({ operation }: Props) {
<RestAuth <RestAuth
progAccess={operation.progAccess} progAccess={operation.progAccess}
slug={titleSlug} slug={titleSlug}
heading={t('fine_grained_access').replace('{{ RESTOperationTitle }}', operation.title)} operationTitle={operation.title}
/> />
{hasParameters && ( {hasParameters && (

View File

@@ -93,6 +93,10 @@ export function getShellExample(
acceptHeader = acceptHeader === `-H "Accept: application/vnd.github+json"` ? '' : acceptHeader acceptHeader = acceptHeader === `-H "Accept: application/vnd.github+json"` ? '' : acceptHeader
} }
if (operation?.progAccess?.basicAuth) {
authHeader = '-u "<YOUR_CLIENT_ID>:<YOUR_CLIENT_SECRET>"'
}
const args = [ const args = [
operation.verb !== 'get' && `-X ${operation.verb.toUpperCase()}`, operation.verb !== 'get' && `-X ${operation.verb.toUpperCase()}`,
acceptHeader, acceptHeader,
@@ -121,6 +125,9 @@ export function getGHExample(
currentVersion: string, currentVersion: string,
allVersions: Record<string, VersionItem>, allVersions: Record<string, VersionItem>,
) { ) {
// Basic authentication is not supported by GH CLI
if (operation?.progAccess?.basicAuth) return
const defaultAcceptHeader = getAcceptHeader(codeSample) const defaultAcceptHeader = getAcceptHeader(codeSample)
const hostname = operation.serverUrl !== 'https://api.github.com' ? '--hostname HOSTNAME' : '' const hostname = operation.serverUrl !== 'https://api.github.com' ? '--hostname HOSTNAME' : ''
@@ -326,9 +333,12 @@ export function getJSExample(
} }
const comment = `// Octokit.js\n// https://github.com/octokit/core.js#readme\n` const comment = `// Octokit.js\n// https://github.com/octokit/core.js#readme\n`
const require = `const octokit = new Octokit(${stringify({ auth: 'YOUR-TOKEN' }, null, 2)})\n\n` const authOctokit = `const octokit = new Octokit(${stringify({ auth: 'YOUR-TOKEN' }, null, 2)})\n\n`
const oauthOctokit = `import { createOAuthAppAuth } from "@octokit/auth-oauth-app"\n\nconst octokit = new Octokit({\n authStrategy: createOAuthAppAuth,\n auth:{\n clientType: 'oauth-app',\n clientId: '<YOUR_CLIENT ID>',\n clientSecret: '<YOUR_CLIENT SECRET>'\n }\n})\n\n`
const isBasicAuth = operation?.progAccess?.basicAuth
const authString = isBasicAuth ? oauthOctokit : authOctokit
return `${comment}${require}await octokit.request('${operation.verb.toUpperCase()} ${ return `${comment}${authString}await octokit.request('${operation.verb.toUpperCase()} ${
operation.requestPath operation.requestPath
}${queryParameters}', ${stringify(parameters, null, 2)})` }${queryParameters}', ${stringify(parameters, null, 2)})`
} }

View File

@@ -21,6 +21,7 @@ export interface ProgAccessT {
permissions: Array<Object> permissions: Array<Object>
allowPermissionlessAccess?: boolean allowPermissionlessAccess?: boolean
allowsPublicRead?: boolean allowsPublicRead?: boolean
basicAuth?: boolean
} }
export interface Parameter { export interface Parameter {

View File

@@ -84928,7 +84928,8 @@
"userToServerRest": false, "userToServerRest": false,
"serverToServer": false, "serverToServer": false,
"fineGrainedPat": false, "fineGrainedPat": false,
"permissions": [] "permissions": [],
"basicAuth": true
}, },
"codeExamples": [ "codeExamples": [
{ {
@@ -96146,7 +96147,8 @@
"userToServerRest": false, "userToServerRest": false,
"serverToServer": false, "serverToServer": false,
"fineGrainedPat": false, "fineGrainedPat": false,
"permissions": [] "permissions": [],
"basicAuth": true
}, },
"codeExamples": [ "codeExamples": [
{ {
@@ -96217,7 +96219,8 @@
"userToServerRest": false, "userToServerRest": false,
"serverToServer": false, "serverToServer": false,
"fineGrainedPat": false, "fineGrainedPat": false,
"permissions": [] "permissions": [],
"basicAuth": true
}, },
"codeExamples": [ "codeExamples": [
{ {
@@ -97227,7 +97230,8 @@
"userToServerRest": false, "userToServerRest": false,
"serverToServer": false, "serverToServer": false,
"fineGrainedPat": false, "fineGrainedPat": false,
"permissions": [] "permissions": [],
"basicAuth": true
}, },
"codeExamples": [ "codeExamples": [
{ {
@@ -98233,7 +98237,8 @@
"userToServerRest": false, "userToServerRest": false,
"serverToServer": false, "serverToServer": false,
"fineGrainedPat": false, "fineGrainedPat": false,
"permissions": [] "permissions": [],
"basicAuth": true
}, },
"codeExamples": [ "codeExamples": [
{ {

View File

@@ -94538,7 +94538,8 @@
"userToServerRest": false, "userToServerRest": false,
"serverToServer": false, "serverToServer": false,
"fineGrainedPat": false, "fineGrainedPat": false,
"permissions": [] "permissions": [],
"basicAuth": true
}, },
"codeExamples": [ "codeExamples": [
{ {
@@ -105756,7 +105757,8 @@
"userToServerRest": false, "userToServerRest": false,
"serverToServer": false, "serverToServer": false,
"fineGrainedPat": false, "fineGrainedPat": false,
"permissions": [] "permissions": [],
"basicAuth": true
}, },
"codeExamples": [ "codeExamples": [
{ {
@@ -105827,7 +105829,8 @@
"userToServerRest": false, "userToServerRest": false,
"serverToServer": false, "serverToServer": false,
"fineGrainedPat": false, "fineGrainedPat": false,
"permissions": [] "permissions": [],
"basicAuth": true
}, },
"codeExamples": [ "codeExamples": [
{ {
@@ -106837,7 +106840,8 @@
"userToServerRest": false, "userToServerRest": false,
"serverToServer": false, "serverToServer": false,
"fineGrainedPat": false, "fineGrainedPat": false,
"permissions": [] "permissions": [],
"basicAuth": true
}, },
"codeExamples": [ "codeExamples": [
{ {
@@ -107843,7 +107847,8 @@
"userToServerRest": false, "userToServerRest": false,
"serverToServer": false, "serverToServer": false,
"fineGrainedPat": false, "fineGrainedPat": false,
"permissions": [] "permissions": [],
"basicAuth": true
}, },
"codeExamples": [ "codeExamples": [
{ {

View File

@@ -93569,7 +93569,8 @@
"userToServerRest": false, "userToServerRest": false,
"serverToServer": false, "serverToServer": false,
"fineGrainedPat": false, "fineGrainedPat": false,
"permissions": [] "permissions": [],
"basicAuth": true
}, },
"codeExamples": [ "codeExamples": [
{ {
@@ -101792,7 +101793,8 @@
"userToServerRest": false, "userToServerRest": false,
"serverToServer": false, "serverToServer": false,
"fineGrainedPat": false, "fineGrainedPat": false,
"permissions": [] "permissions": [],
"basicAuth": true
}, },
"codeExamples": [ "codeExamples": [
{ {
@@ -101863,7 +101865,8 @@
"userToServerRest": false, "userToServerRest": false,
"serverToServer": false, "serverToServer": false,
"fineGrainedPat": false, "fineGrainedPat": false,
"permissions": [] "permissions": [],
"basicAuth": true
}, },
"codeExamples": [ "codeExamples": [
{ {
@@ -102848,7 +102851,8 @@
"userToServerRest": false, "userToServerRest": false,
"serverToServer": false, "serverToServer": false,
"fineGrainedPat": false, "fineGrainedPat": false,
"permissions": [] "permissions": [],
"basicAuth": true
}, },
"codeExamples": [ "codeExamples": [
{ {
@@ -103829,7 +103833,8 @@
"userToServerRest": false, "userToServerRest": false,
"serverToServer": false, "serverToServer": false,
"fineGrainedPat": false, "fineGrainedPat": false,
"permissions": [] "permissions": [],
"basicAuth": true
}, },
"codeExamples": [ "codeExamples": [
{ {

View File

@@ -93593,7 +93593,8 @@
"userToServerRest": false, "userToServerRest": false,
"serverToServer": false, "serverToServer": false,
"fineGrainedPat": false, "fineGrainedPat": false,
"permissions": [] "permissions": [],
"basicAuth": true
}, },
"codeExamples": [ "codeExamples": [
{ {
@@ -101816,7 +101817,8 @@
"userToServerRest": false, "userToServerRest": false,
"serverToServer": false, "serverToServer": false,
"fineGrainedPat": false, "fineGrainedPat": false,
"permissions": [] "permissions": [],
"basicAuth": true
}, },
"codeExamples": [ "codeExamples": [
{ {
@@ -101887,7 +101889,8 @@
"userToServerRest": false, "userToServerRest": false,
"serverToServer": false, "serverToServer": false,
"fineGrainedPat": false, "fineGrainedPat": false,
"permissions": [] "permissions": [],
"basicAuth": true
}, },
"codeExamples": [ "codeExamples": [
{ {
@@ -102872,7 +102875,8 @@
"userToServerRest": false, "userToServerRest": false,
"serverToServer": false, "serverToServer": false,
"fineGrainedPat": false, "fineGrainedPat": false,
"permissions": [] "permissions": [],
"basicAuth": true
}, },
"codeExamples": [ "codeExamples": [
{ {
@@ -103853,7 +103857,8 @@
"userToServerRest": false, "userToServerRest": false,
"serverToServer": false, "serverToServer": false,
"fineGrainedPat": false, "fineGrainedPat": false,
"permissions": [] "permissions": [],
"basicAuth": true
}, },
"codeExamples": [ "codeExamples": [
{ {

View File

@@ -93769,7 +93769,8 @@
"userToServerRest": false, "userToServerRest": false,
"serverToServer": false, "serverToServer": false,
"fineGrainedPat": false, "fineGrainedPat": false,
"permissions": [] "permissions": [],
"basicAuth": true
}, },
"codeExamples": [ "codeExamples": [
{ {
@@ -102077,7 +102078,8 @@
"userToServerRest": false, "userToServerRest": false,
"serverToServer": false, "serverToServer": false,
"fineGrainedPat": false, "fineGrainedPat": false,
"permissions": [] "permissions": [],
"basicAuth": true
}, },
"codeExamples": [ "codeExamples": [
{ {
@@ -102148,7 +102150,8 @@
"userToServerRest": false, "userToServerRest": false,
"serverToServer": false, "serverToServer": false,
"fineGrainedPat": false, "fineGrainedPat": false,
"permissions": [] "permissions": [],
"basicAuth": true
}, },
"codeExamples": [ "codeExamples": [
{ {
@@ -103150,7 +103153,8 @@
"userToServerRest": false, "userToServerRest": false,
"serverToServer": false, "serverToServer": false,
"fineGrainedPat": false, "fineGrainedPat": false,
"permissions": [] "permissions": [],
"basicAuth": true
}, },
"codeExamples": [ "codeExamples": [
{ {
@@ -104148,7 +104152,8 @@
"userToServerRest": false, "userToServerRest": false,
"serverToServer": false, "serverToServer": false,
"fineGrainedPat": false, "fineGrainedPat": false,
"permissions": [] "permissions": [],
"basicAuth": true
}, },
"codeExamples": [ "codeExamples": [
{ {

View File

@@ -93861,7 +93861,8 @@
"userToServerRest": false, "userToServerRest": false,
"serverToServer": false, "serverToServer": false,
"fineGrainedPat": false, "fineGrainedPat": false,
"permissions": [] "permissions": [],
"basicAuth": true
}, },
"codeExamples": [ "codeExamples": [
{ {
@@ -102209,7 +102210,8 @@
"userToServerRest": false, "userToServerRest": false,
"serverToServer": false, "serverToServer": false,
"fineGrainedPat": false, "fineGrainedPat": false,
"permissions": [] "permissions": [],
"basicAuth": true
}, },
"codeExamples": [ "codeExamples": [
{ {
@@ -102280,7 +102282,8 @@
"userToServerRest": false, "userToServerRest": false,
"serverToServer": false, "serverToServer": false,
"fineGrainedPat": false, "fineGrainedPat": false,
"permissions": [] "permissions": [],
"basicAuth": true
}, },
"codeExamples": [ "codeExamples": [
{ {
@@ -103290,7 +103293,8 @@
"userToServerRest": false, "userToServerRest": false,
"serverToServer": false, "serverToServer": false,
"fineGrainedPat": false, "fineGrainedPat": false,
"permissions": [] "permissions": [],
"basicAuth": true
}, },
"codeExamples": [ "codeExamples": [
{ {
@@ -104296,7 +104300,8 @@
"userToServerRest": false, "userToServerRest": false,
"serverToServer": false, "serverToServer": false,
"fineGrainedPat": false, "fineGrainedPat": false,
"permissions": [] "permissions": [],
"basicAuth": true
}, },
"codeExamples": [ "codeExamples": [
{ {

View File

@@ -92555,7 +92555,8 @@
"userToServerRest": false, "userToServerRest": false,
"serverToServer": false, "serverToServer": false,
"fineGrainedPat": false, "fineGrainedPat": false,
"permissions": [] "permissions": [],
"basicAuth": true
}, },
"codeExamples": [ "codeExamples": [
{ {
@@ -100774,7 +100775,8 @@
"userToServerRest": false, "userToServerRest": false,
"serverToServer": false, "serverToServer": false,
"fineGrainedPat": false, "fineGrainedPat": false,
"permissions": [] "permissions": [],
"basicAuth": true
}, },
"codeExamples": [ "codeExamples": [
{ {
@@ -100845,7 +100847,8 @@
"userToServerRest": false, "userToServerRest": false,
"serverToServer": false, "serverToServer": false,
"fineGrainedPat": false, "fineGrainedPat": false,
"permissions": [] "permissions": [],
"basicAuth": true
}, },
"codeExamples": [ "codeExamples": [
{ {
@@ -101830,7 +101833,8 @@
"userToServerRest": false, "userToServerRest": false,
"serverToServer": false, "serverToServer": false,
"fineGrainedPat": false, "fineGrainedPat": false,
"permissions": [] "permissions": [],
"basicAuth": true
}, },
"codeExamples": [ "codeExamples": [
{ {
@@ -102811,7 +102815,8 @@
"userToServerRest": false, "userToServerRest": false,
"serverToServer": false, "serverToServer": false,
"fineGrainedPat": false, "fineGrainedPat": false,
"permissions": [] "permissions": [],
"basicAuth": true
}, },
"codeExamples": [ "codeExamples": [
{ {