As a general recommendation, prioritize using the authorization code flow (with PKCE). If the authorization code flow is not an option, carefully evaluate and consider alternative methods only after thoroughly understanding the characteristics and implications of each flow.
The grant types defined in RFC6749 are as follows: There are five types. For each grant type, the elements issued from the authorization endpoint or token endpoint to the client application differ.
This is the most popular grant flow.This flow begins by issuing a short-lived authorization code from the authorization endpoint. The authorization code is then exchanged for an access token at the token endpoint. This is the standard OAuth 2.0 flow.When a token is requested directly from a client (e.g., a public client) that cannot securely store confidential information like a client secret—such as a mobile app—it is essential to use PKCE (Proof Key for Code Exchange) in addition to the authorization code flow.
This flow issues an access token directly from the authorization endpoint. Unlike the authorization code flow, no refresh token is issued. While this flow was originally designed for scenarios such as token requests from single-page applications (SPAs), the authorization code flow with PKCE is now the recommended approach for SPAs.
This flow involves receiving the resource owner’s (end user’s) ID and password to issue an access token. However, it is generally avoided because the resource owner’s credentials are exposed to the client application. This flow is typically used only during transitional phases when implementing OAuth 2.0.
This grant flow is defined for clients with no users involved.A client obtains an access token from an authorization server using its own credentials (e.g. a pair of client ID and client secret, a client certificate, a SAML assertion).This flow issues an access token based solely on client authentication. It is typically used when the client and the resource owner are the same entity.
This is the flow to present the refresh token and have the access token reissued.The grant flow is defined to refresh previously issued access tokens (and refresh tokens).A client obtains an access token (and a new refresh token) from an authorization server using a refresh token previously obtained using other grant flows.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Authlete Documentation","colors":{"primary":"#0057B7","light":"#4D8FEA","dark":"#0057B7"},"logo":{"light":"https://mintcdn.com/authlete/EJDZNZMvOu_9CJHJ/authlete-blue-horizontal-logo.svg?fit=max\u0026auto=format\u0026n=EJDZNZMvOu_9CJHJ\u0026q=85\u0026s=ed123a3de8b7791dffde03e7705c7460","dark":"https://mintcdn.com/authlete/EJDZNZMvOu_9CJHJ/authlete-blue-horizontal-logo.svg?fit=max\u0026auto=format\u0026n=EJDZNZMvOu_9CJHJ\u0026q=85\u0026s=ed123a3de8b7791dffde03e7705c7460"},"favicon":{"light":"https://mintcdn.com/authlete/gV1fxQkuH3uz_H3j/images/favicon-32x32.png?fit=max\u0026auto=format\u0026n=gV1fxQkuH3uz_H3j\u0026q=85\u0026s=9838a40b23e11ab35d7737e4c94a2d9a","dark":"https://mintcdn.com/authlete/gV1fxQkuH3uz_H3j/images/favicon-32x32.png?fit=max\u0026auto=format\u0026n=gV1fxQkuH3uz_H3j\u0026q=85\u0026s=9838a40b23e11ab35d7737e4c94a2d9a"},"api":{"openapi":"https://spec.speakeasy.com/authlete/sdk-workspace/authlete-api-explorer-with-code-samples","playground":{"display":"interactive","proxy":true},"examples":{"languages":["typescript","ruby","go","shell"],"autogenerate":true},"mdx":{"auth":{"method":"bearer"},"server":"https://us.authlete.com"}},"navbar":{"primary":{"type":"button","label":"Get Started","href":"https://console.authlete.com/"}},"footer":{"socials":{"x":"https://x.com/authlete","github":"https://github.com/authlete","linkedin":"https://linkedin.com/company/authlete"}},"contextual":{"options":["copy","view","chatgpt","claude","mcp","cursor"],"display":"header"},"thumbnails":{"fonts":{"family":"Noto Sans JP"}},"markdown":{"instructions":["### Authlete versions","Authlete 3.0 is the current version. Unless the user says they use another version, answer for Authlete 3.0 using the 3.x documentation.","Documentation for Authlete 2.x (pages under `/v2/` and `/ja/v2/`) is for the legacy version. Refer to it only when the user is on Authlete 2.x.","","### Authlete architecture","Authlete is a backend engine for OAuth 2.0 and OpenID Connect processing. End users and client applications do not call it directly; the service provider's authorization server and API server call Authlete's APIs. Authlete handles protocol processing and token, client, and service management, while the service provider owns the OAuth/OIDC endpoints and user authentication.","See [Architecture](https://developers.authlete.com/get-started/introduction-to-authlete/architecture.md).","","### Concepts","If the user is new to Authlete, read these pages first:","- [Request and Response](https://developers.authlete.com/get-started/concepts/request-and-response.md): Core API requests pass the client's request parameters as-is, and responses return `resultCode`, `action`, and `responseContent`.","- [Action Handling](https://developers.authlete.com/get-started/concepts/action-handling.md): Branch on `action`, never on `resultCode`, and map each action to the HTTP response your server returns.","- [Two-Step API Calls](https://developers.authlete.com/get-started/concepts/two-step-api-calls.md): Actions such as `INTERACTION` are completed with a second call (`/auth/authorization/issue` or `/auth/authorization/fail`) linked by a `ticket`.","- [Management API Overview](https://developers.authlete.com/get-started/concepts/overview.md): The Management API configures services, manages clients, and operates issued tokens, separately from the protocol flows handled by the Core API.","- [API Authentication](https://developers.authlete.com/get-started/concepts/authentication.md): Authlete APIs use bearer tokens: a Service Access Token (one service) or an Organization Token (the whole organization)."]},"styling":{"latex":false},"navigation":{"languages":[{"language":"en","default":true,"href":"get-started/introduction-to-authlete"},{"language":"ja","href":"ja/get-started/introduction-to-authlete"}]}},"deployment":{"deploymentMetadataValue":{"subdomain":"authlete","hasAudioNarration":false,"actualSubdomain":"authlete","customDomains":["developers.authlete.com"],"gitSource":{"type":"github","owner":"authlete","repo":"developer-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ad86bfbbcc1b0bac5b9a633","collectionId":"102eb795-336b-4b91-aae6-f3939575b917","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ad86bfbbcc1b0bac5b9a633"},"feedback":{"thumbs":true,"agentFeedback":true},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6ad86bfbbcc1b0bac5b9a633","clientVersion":"0.0.3965","searchFilterCounts":[{"language":"en","tag":"Release Notes","count":103},{"language":"ja","tag":"リリースノート","count":103},{"language":"ja","tag":"設定リファレンス","count":92},{"language":"default","tag":"API Reference","count":87},{"language":"default","tag":"Authlete","count":87},{"language":"en","tag":"Configuration Reference","count":83},{"language":"en","tag":"Protocols \u0026 Flows","count":46},{"language":"en","tag":"Deployment \u0026 Operations","count":44},{"language":"ja","tag":"プロトコル \u0026 フロー","count":42},{"language":"ja","tag":"デプロイと運用","count":39},{"language":"ja","tag":"トークン \u0026 クレーム","count":38},{"language":"ja","tag":"はじめに","count":34},{"language":"ja","tag":"エンドポイント","count":33},{"language":"en","tag":"Get Started","count":32},{"language":"en","tag":"Tokens and Claims","count":28},{"language":"default","tag":"Client Management","count":26},{"language":"en","tag":"Endpoints","count":25},{"language":"en","tag":"Server Releases (v2.2)","count":23},{"language":"en","tag":"Server Releases (v2.3)","count":23},{"language":"ja","tag":"サーバーリリース (v2.2)","count":23},{"language":"ja","tag":"サーバーリリース (v2.3)","count":23},{"language":"en","tag":"Server Releases (v3.0)","count":20},{"language":"ja","tag":"サーバーリリース (v3.0)","count":20},{"language":"default","tag":"Verifiable Credential Issuer","count":11},{"language":"default","tag":"Service Management","count":6},{"language":"default","tag":"Authorization Endpoint","count":5},{"language":"default","tag":"Token Operations","count":5},{"language":"default","tag":"CIBA","count":4},{"language":"default","tag":"Dynamic Client Registration","count":4},{"language":"default","tag":"Hardware Security Key","count":4}],"searchSettings":{"maxResults":7}},"assistantConfig":{},"hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"privacy":{"consentBanner":{"enabled":true}},"isAtlas":false,"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":"#content-area,#navbar,#sidebar,[data-sidebar],body{background-image:none!important}.dynamic-curl-wrapper{width:100%;max-width:100%;min-width:0}.dynamic-curl-output{width:100%!important;max-width:100%!important;min-width:0!important}table[style*=tableLayout] td:last-child{overflow:hidden;min-width:0}table[style*=tableLayout] input{min-width:0}"}],"page":{"pagePath":"v2/get-started/core-concepts/how-to-choose-the-appropriate-oauth-2-flow","slug":"/v2/get-started/core-concepts/how-to-choose-the-appropriate-oauth-2-flow","pageMetadata":{"title":"Choosing OAuth 2.0 Flow","description":"An article on how to choose the best OAuth 2.0 flow.","href":"/v2/get-started/core-concepts/how-to-choose-the-appropriate-oauth-2-flow"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"An article on how to choose the best OAuth 2.0 flow.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,p:`p`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,..._provideComponents(),...props.components},{Heading,Note,Table}=_components;if(!Heading)_missingMdxReference(`Heading`,true);if(!Note)_missingMdxReference(`Note`,true);if(!Table)_missingMdxReference(`Table`,true);return _jsxs(_Fragment,{children:[_jsx(Note,{children:_jsxs(_components.p,{children:[`This page is for `,_jsx(_components.strong,{children:`Authlete 2.x`}),`. For current (3.0) documentation, see `,_jsx(_components.a,{href:`/guides/getting-started-with-implementation/how-to-choose-the-best-oauth-2-0-flow`,children:`this page`}),`.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`preface`,children:`Preface`}),`\n`,_jsxs(_components.p,{children:[`As a general recommendation, prioritize using the authorization code flow (with `,_jsx(_components.a,{href:`/protocols-and-flows/protocol-extensions/proof-key-for-code-exchange-pkce`,children:`PKCE`}),`). If the authorization code flow is not an option, carefully evaluate and consider alternative methods only after thoroughly understanding the characteristics and implications of each flow.`]}),`\n`,_jsx(Heading,{level:`2`,id:`grant-flow-details`,children:`Grant Flow Details`}),`\n`,_jsx(_components.p,{children:`The grant types defined in RFC6749 are as follows: There are five types. For each grant type, the elements issued from the authorization endpoint or token endpoint to the client application differ.`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:_jsx(_components.strong,{children:`Flow`})}),_jsx(_components.th,{children:`Authorization Endpoint`}),_jsx(_components.th,{children:`Token Endpoint`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Authorization Code`}),_jsx(_components.td,{children:`Authorization Code`}),_jsx(_components.td,{children:`Access token, Refresh token`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Implicit`}),_jsx(_components.td,{children:`Access Token`}),_jsx(_components.td,{\"data-numeric\":`true`,children:`-`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Resource Owner Passwords Credentials`}),_jsx(_components.td,{\"data-numeric\":`true`,children:`-`}),_jsx(_components.td,{children:`Access token, Refresh token`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Client Credentials`}),_jsx(_components.td,{\"data-numeric\":`true`,children:`-`}),_jsx(_components.td,{children:`Access token`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Refresh Token`}),_jsx(_components.td,{\"data-numeric\":`true`,children:`-`}),_jsx(_components.td,{children:`Access token, Refresh token`})]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`authorization-code-flow`,children:`Authorization Code Flow`}),`\n`,_jsx(_components.p,{children:`This is the most popular grant flow.`}),`\n`,_jsx(_components.p,{children:`This flow begins by issuing a short-lived authorization code from the authorization endpoint. The authorization code is then exchanged for an access token at the token endpoint. This is the standard OAuth 2.0 flow.`}),`\n`,_jsx(_components.p,{children:`When a token is requested directly from a client (e.g., a public client) that cannot securely store confidential information like a client secret—such as a mobile app—it is essential to use PKCE (Proof Key for Code Exchange) in addition to the authorization code flow.`}),`\n`,_jsx(Heading,{level:`3`,id:`implicit`,children:`Implicit`}),`\n`,_jsxs(_components.p,{children:[`This flow issues an access token directly from the authorization endpoint. Unlike the authorization code flow, no refresh token is issued. While this flow was originally designed for scenarios such as token requests from single-page applications (SPAs), the authorization code flow with `,_jsx(_components.a,{href:`/protocols-and-flows/protocol-extensions/proof-key-for-code-exchange-pkce`,children:`PKCE`}),` is now the recommended approach for SPAs.`]}),`\n`,_jsx(Heading,{level:`3`,id:`resource-owner-passwords-credentials`,children:`Resource Owner Passwords Credentials`}),`\n`,_jsx(_components.p,{children:`This flow involves receiving the resource owner’s (end user’s) ID and password to issue an access token. However, it is generally avoided because the resource owner’s credentials are exposed to the client application. This flow is typically used only during transitional phases when implementing OAuth 2.0.`}),`\n`,_jsx(Heading,{level:`3`,id:`client-credentials`,children:`Client Credentials`}),`\n`,_jsx(_components.p,{children:`This grant flow is defined for clients with no users involved.`}),`\n`,_jsx(_components.p,{children:`A client obtains an access token from an authorization server using its own credentials (e.g. a pair of client ID and client secret, a client certificate, a SAML assertion).`}),`\n`,_jsx(_components.p,{children:`This flow issues an access token based solely on client authentication. It is typically used when the client and the resource owner are the same entity.`}),`\n`,_jsx(Heading,{level:`3`,id:`refresh-token`,children:`Refresh Token`}),`\n`,_jsx(_components.p,{children:`This is the flow to present the refresh token and have the access token reissued.`}),`\n`,_jsx(_components.p,{children:`The grant flow is defined to refresh previously issued access tokens (and refresh tokens).`}),`\n`,_jsx(_components.p,{children:`A client obtains an access token (and a new refresh token) from an authorization server using a refresh token previously obtained using other grant flows.`})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Choosing OAuth 2.0 Flow","description":"An article on how to choose the best OAuth 2.0 flow.","href":"/v2/get-started/core-concepts/how-to-choose-the-appropriate-oauth-2-flow"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Preface","slug":"preface","depth":2,"children":[]},{"title":"Grant Flow Details","slug":"grant-flow-details","depth":2,"children":[{"title":"Authorization Code Flow","slug":"authorization-code-flow","depth":3,"children":[]},{"title":"Implicit","slug":"implicit","depth":3,"children":[]},{"title":"Resource Owner Passwords Credentials","slug":"resource-owner-passwords-credentials","depth":3,"children":[]},{"title":"Client Credentials","slug":"client-credentials","depth":3,"children":[]},{"title":"Refresh Token","slug":"refresh-token","depth":3,"children":[]}]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/authlete/a07b398e9c8556ba/snippets/oauth-dynamic.js"],"subdomain":"authlete","siteName":"Authlete Documentation","title":"Choosing OAuth 2.0 Flow - Authlete Documentation","navMaps":{"firstHrefInVersion":{"3.x":{"href":"/get-started/introduction-to-authlete/index","matchLevel":4},"2.x":{"href":"/v2/get-started/core-concepts/how-to-choose-the-appropriate-oauth-2-flow","matchLevel":0}},"firstHrefInLanguage":{"en":{"href":"/v2/get-started/core-concepts/how-to-choose-the-appropriate-oauth-2-flow","matchLevel":0},"ja":{"href":"/ja/v2/get-started/core-concepts/how-to-choose-the-appropriate-oauth-2-flow","matchLevel":1}}},"lastModified":"2026-07-13T20:00:28.258Z","originalFileLocation":"v2/get-started/core-concepts/how-to-choose-the-appropriate-oauth-2-flow.mdx","locale":"en"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"An article on how to choose the best OAuth 2.0 flow.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Authlete Documentation\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/authlete/aQ4BxffFlrUzvna2/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/authlete/aQ4BxffFlrUzvna2/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/authlete/aQ4BxffFlrUzvna2/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/authlete/aQ4BxffFlrUzvna2/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/authlete/aQ4BxffFlrUzvna2/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/authlete/aQ4BxffFlrUzvna2/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/authlete/aQ4BxffFlrUzvna2/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/authlete/aQ4BxffFlrUzvna2/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/authlete/aQ4BxffFlrUzvna2/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Choosing OAuth 2.0 Flow - Authlete Documentation\">\u003cmeta data-mint-head property=\"og:description\" content=\"An article on how to choose the best OAuth 2.0 flow.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Authlete Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://developers.authlete.com/v2/get-started/core-concepts/how-to-choose-the-appropriate-oauth-2-flow\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://authlete.mintlify.app/_mintlify/api/og/v2?division=Core+Concepts\u0026amp;title=Choosing+OAuth+2.0+Flow\u0026amp;description=An+article+on+how+to+choose+the+best+OAuth+2.0+flow.\u0026amp;theme=9a33e57959880538f1449aa0\u0026amp;signature=6ea74fb792013e6d03b0dba795ad0aff75e55b6c328c2973364f9b9e6819464c\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Choosing OAuth 2.0 Flow - Authlete Documentation\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"An article on how to choose the best OAuth 2.0 flow.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://authlete.mintlify.app/_mintlify/api/og/v2?division=Core+Concepts\u0026amp;title=Choosing+OAuth+2.0+Flow\u0026amp;description=An+article+on+how+to+choose+the+best+OAuth+2.0+flow.\u0026amp;theme=9a33e57959880538f1449aa0\u0026amp;signature=6ea74fb792013e6d03b0dba795ad0aff75e55b6c328c2973364f9b9e6819464c\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/authlete/aQ4BxffFlrUzvna2/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Authlete Documentation\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#0057B7\">\u003clink data-mint-head rel=\"canonical\" href=\"https://developers.authlete.com/v2/get-started/core-concepts/how-to-choose-the-appropriate-oauth-2-flow\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/v2/get-started/core-concepts/how-to-choose-the-appropriate-oauth-2-flow.md\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"en\" href=\"https://developers.authlete.com/v2/get-started/core-concepts/how-to-choose-the-appropriate-oauth-2-flow\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"ja\" href=\"https://developers.authlete.com/ja/v2/get-started/core-concepts/how-to-choose-the-appropriate-oauth-2-flow\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"x-default\" href=\"https://developers.authlete.com/v2/get-started/core-concepts/how-to-choose-the-appropriate-oauth-2-flow\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://developers.authlete.com/#organization\",\"name\":\"Authlete Documentation\",\"url\":\"https://developers.authlete.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/authlete/EJDZNZMvOu_9CJHJ/authlete-blue-horizontal-logo.svg?fit=max\u0026auto=format\u0026n=EJDZNZMvOu_9CJHJ\u0026q=85\u0026s=ed123a3de8b7791dffde03e7705c7460\"}},{\"@type\":\"WebSite\",\"@id\":\"https://developers.authlete.com#website\",\"name\":\"Authlete Documentation\",\"url\":\"https://developers.authlete.com\",\"publisher\":{\"@id\":\"https://developers.authlete.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://developers.authlete.com/v2/get-started/core-concepts/how-to-choose-the-appropriate-oauth-2-flow#webpage\",\"url\":\"https://developers.authlete.com/v2/get-started/core-concepts/how-to-choose-the-appropriate-oauth-2-flow\",\"name\":\"Choosing OAuth 2.0 Flow\",\"description\":\"An article on how to choose the best OAuth 2.0 flow.\",\"dateModified\":\"2026-07-13T20:00:28.258Z\",\"isPartOf\":{\"@id\":\"https://developers.authlete.com#website\"},\"breadcrumb\":{\"@id\":\"https://developers.authlete.com/v2/get-started/core-concepts/how-to-choose-the-appropriate-oauth-2-flow#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://developers.authlete.com/v2/get-started/core-concepts/how-to-choose-the-appropriate-oauth-2-flow#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Core Concepts\",\"item\":\"https://developers.authlete.com/v2/get-started/core-concepts/oauth-basics\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Choosing OAuth 2.0 Flow\",\"item\":\"https://developers.authlete.com/v2/get-started/core-concepts/how-to-choose-the-appropriate-oauth-2-flow\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://developers.authlete.com/v2/get-started/core-concepts/how-to-choose-the-appropriate-oauth-2-flow#article\",\"headline\":\"Choosing OAuth 2.0 Flow\",\"name\":\"Choosing OAuth 2.0 Flow\",\"description\":\"An article on how to choose the best OAuth 2.0 flow.\",\"url\":\"https://developers.authlete.com/v2/get-started/core-concepts/how-to-choose-the-appropriate-oauth-2-flow\",\"mainEntityOfPage\":{\"@id\":\"https://developers.authlete.com/v2/get-started/core-concepts/how-to-choose-the-appropriate-oauth-2-flow#webpage\"},\"dateModified\":\"2026-07-13T20:00:28.258Z\",\"publisher\":{\"@id\":\"https://developers.authlete.com/#organization\"},\"isPartOf\":{\"@id\":\"https://developers.authlete.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Authlete Documentation\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Authlete Documentation","nav":{"global":null,"languages":[{"language":"en","default":true,"versions":[{"version":"3.x","default":true,"pages":[{"title":"3.x","href":"/get-started/introduction-to-authlete"}]},{"version":"2.x","default":false,"tabs":[{"tab":"Get Started","pages":[{"group":"Introduction to Authlete","pages":[{"title":"Welcome to Authlete","mode":"wide","sidebarTitle":"Home","hidden":true,"href":"/get-started/introduction-to-authlete/index"},{"title":"Overview","href":"/get-started/introduction-to-authlete/overview"}]},{"group":"Quickstarts","pages":[{"title":"Setting up Authlete","href":"/v2/get-started/quickstarts/getting-started"},{"title":"Authentication","href":"/v2/get-started/quickstarts/authentication"},{"title":"Using Demo Authorization Server","href":"/v2/get-started/quickstarts/using-demo-authorization-server"},{"title":"Getting Started in Java (Authlete 2.x)","href":"/v2/get-started/quickstarts/getting-started-with-the-authlete-apis-in-java"}]},{"group":"Core Concepts","pages":[{"title":"OAuth 2.0 Basics","href":"/v2/get-started/core-concepts/oauth-basics"},{"title":"OIDC Basics","description":"A tutorial to understand how OpenID Connect identity provider leverages Authlete APIs.","href":"/v2/get-started/core-concepts/oidc-basics"},{"title":"Choosing OAuth 2.0 Flow","href":"/v2/get-started/core-concepts/how-to-choose-the-appropriate-oauth-2-flow"}]},{"group":"Developer Resources","pages":[{"title":"OpenAPI","url":"https://github.com/authlete/openapi","description":null,"href":"/get-started/developer-resources/openapi"},{"title":"GitHub","url":"https://github.com/authlete","href":"/get-started/developer-resources/github"},{"title":"TypeScript SDK","url":"https://github.com/authlete/authlete-typescript-sdk","href":"/get-started/developer-resources/typescript-sdk"},{"title":"Ruby SDK","url":"https://github.com/authlete/authlete-ruby-sdk","href":"/get-started/developer-resources/ruby-sdk"},{"title":"Java SDK","url":"https://github.com/authlete/authlete-java-common","href":"/get-started/developer-resources/java-sdk"}]},{"group":"Tools","pages":[{"title":"CBOR Zone","url":"https://cbor.zone/","href":"/get-started/tools/cbor"},{"title":"mkjose","url":"https://mkjose.org/","href":"/get-started/tools/mkjose"}]}]},{"tab":"API Reference","pages":[{"title":"API Reference","href":"/v2/api-reference"}]},{"tab":"Protocols \u0026 Flows","pages":[{"title":"Protocols \u0026 Flows","href":"/v2/configuration-reference/endpoints/enabling-device-flow"}]},{"tab":"Configuration Reference","pages":[{"title":"Configuration Reference","href":"/v2/configuration-reference/service-setup/service-settings"}]},{"tab":"Deployment \u0026 Operations","pages":[{"title":"Deployment \u0026 Operations","href":"/v2/deployment-and-operations/developer-console/overview"}]},{"tab":"Release Notes","pages":[{"title":"Release Notes","href":"/release-notes/server-v2-3/2026-09"}]}]}]},{"language":"ja","pages":[{"title":"ja","href":"/ja/v2/get-started/core-concepts/how-to-choose-the-appropriate-oauth-2-flow"}]}]},"title":"Choosing OAuth 2.0 Flow - Authlete Documentation","buildId":"dpl_849ArpqvBiCczQiT1Y1stNGpbqHT","deploymentId":"dpl_849ArpqvBiCczQiT1Y1stNGpbqHT","dynamics":[],"chunks":[]}