import{_ as i,c as a,o as t,a6 as n}from"./chunks/framework.CHl2ywxc.js";const E=JSON.parse('{"title":"Tutorial: OAuth Delegation (GitHub)","description":"","frontmatter":{},"headers":[],"relativePath":"tutorials/oauth-delegation-github.md","filePath":"tutorials/oauth-delegation-github.md","lastUpdated":1755281500000}'),e={name:"tutorials/oauth-delegation-github.md"};function l(h,s,p,k,o,r){return t(),a("div",null,s[0]||(s[0]=[n(`<h1 id="tutorial-oauth-delegation-github" tabindex="-1">Tutorial: OAuth Delegation (GitHub) <a class="header-anchor" href="#tutorial-oauth-delegation-github" aria-label="Permalink to "Tutorial: OAuth Delegation (GitHub)""></a></h1><p>Goal: Use delegated OAuth for a backend requiring GitHub OAuth.</p><h2 id="_1-create-a-github-oauth-app" tabindex="-1">1) Create a GitHub OAuth App <a class="header-anchor" href="#_1-create-a-github-oauth-app" aria-label="Permalink to "1) Create a GitHub OAuth App""></a></h2><ul><li>Homepage URL: <code>http://localhost:3000</code></li><li>Authorization callback URL: <code>http://localhost:3000/oauth/callback</code></li></ul><p>Record <code>Client ID</code> and <code>Client Secret</code>.</p><h2 id="_2-configuration" tabindex="-1">2) Configuration <a class="header-anchor" href="#_2-configuration" aria-label="Permalink to "2) Configuration""></a></h2><p><code>examples/oauth-node/config.yaml</code> (provided):</p><div class="language-yaml vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">hosting</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> platform</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">node</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> port</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">3000</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">master_oauth</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> authorization_endpoint</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">https://example.com/oauth/authorize</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> token_endpoint</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">https://example.com/oauth/token</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> client_id</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">master-mcp</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> redirect_uri</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">http://localhost:3000/oauth/callback</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> scopes</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">openid</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">]</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">servers</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> - </span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">id</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">github-tools</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> type</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">local</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> auth_strategy</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">delegate_oauth</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> auth_config</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> provider</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">github</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> authorization_endpoint</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">https://github.com/login/oauth/authorize</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> token_endpoint</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">https://github.com/login/oauth/access_token</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> client_id</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">\${GITHUB_CLIENT_ID}</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> client_secret</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">env:GITHUB_CLIENT_SECRET</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> scopes</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">repo</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">read:user</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">]</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> config</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;"> port</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">4100</span></span></code></pre></div><p>Set environment variable:</p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>export GITHUB_CLIENT_SECRET=... # from GitHub app</span></span></code></pre></div><p>Run with:</p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>MASTER_CONFIG_PATH=examples/oauth-node/config.yaml npm run dev</span></span></code></pre></div><h2 id="_3-start-the-flow" tabindex="-1">3) Start the Flow <a class="header-anchor" href="#_3-start-the-flow" aria-label="Permalink to "3) Start the Flow""></a></h2><p>Navigate to:</p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>http://localhost:3000/oauth/authorize?server_id=github-tools</span></span></code></pre></div><p>Complete the GitHub consent, then you should see a success page. Calls to tools under <code>github-tools.*</code> will now include the delegated token.</p>`,16)]))}const c=i(e,[["render",l]]);export{E as __pageData,c as default};