Spotify.NET/docs/next/authorization_code/index.html
2020-08-24 09:31:48 +00:00

40 lines
26 KiB
HTML

<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
<meta name="generator" content="Docusaurus v2.0.0-alpha.56">
<title data-react-helmet="true">Authorization Code | SpotifyAPI-NET</title><meta data-react-helmet="true" name="docsearch:version" content="next"><meta data-react-helmet="true" name="twitter:card" content="summary_large_image"><meta data-react-helmet="true" property="og:title" content="Authorization Code | SpotifyAPI-NET"><meta data-react-helmet="true" name="description" content="This flow is suitable for long-running applications in which the user grants permission only once. It provides an access token that can be refreshed. Since the token exchange involves sending your secret key, perform this on a secure location, like a backend service, and not from a client such as a browser or from a mobile app."><meta data-react-helmet="true" property="og:description" content="This flow is suitable for long-running applications in which the user grants permission only once. It provides an access token that can be refreshed. Since the token exchange involves sending your secret key, perform this on a secure location, like a backend service, and not from a client such as a browser or from a mobile app."><meta data-react-helmet="true" property="og:url" content="https://johnnycrazy.github.io/SpotifyAPI-NET/docs/next/authorization_code"><link data-react-helmet="true" rel="shortcut icon" href="/SpotifyAPI-NET/img/favicon.ico"><link data-react-helmet="true" rel="canonical" href="https://johnnycrazy.github.io/SpotifyAPI-NET/docs/next/authorization_code"><link rel="stylesheet" href="/SpotifyAPI-NET/styles.8a053330.css">
<link rel="preload" href="/SpotifyAPI-NET/styles.c98ed224.js" as="script">
<link rel="preload" href="/SpotifyAPI-NET/runtime~main.bf17bec6.js" as="script">
<link rel="preload" href="/SpotifyAPI-NET/main.73459b16.js" as="script">
<link rel="preload" href="/SpotifyAPI-NET/1.3b60c25a.js" as="script">
<link rel="preload" href="/SpotifyAPI-NET/2.2bb7aa4d.js" as="script">
<link rel="preload" href="/SpotifyAPI-NET/3.f4b60483.js" as="script">
<link rel="preload" href="/SpotifyAPI-NET/1be78505.163494cb.js" as="script">
<link rel="preload" href="/SpotifyAPI-NET/ad407b76.fbd12313.js" as="script">
<link rel="preload" href="/SpotifyAPI-NET/d85a39be.3ed95a5c.js" as="script">
</head>
<body>
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=window.matchMedia("(prefers-color-scheme: dark)"),n=function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();null!==n?t(n):e.matches&&t("dark")}()</script><div id="__docusaurus">
<nav class="navbar navbar--light navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><div aria-label="Navigation bar toggle" class="navbar__toggle" role="button" tabindex="0"><svg xmlns="http://www.w3.org/2000/svg" width="30" height="30" viewBox="0 0 30 30" role="img" focusable="false"><title>Menu</title><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></div><a class="navbar__brand" href="/SpotifyAPI-NET/"><img class="navbar__logo" src="/SpotifyAPI-NET/img/logo.svg" alt="SpotifyAPI-NET"><strong class="navbar__title">SpotifyAPI-NET</strong></a><div class="navbar__item dropdown dropdown--hoverable dropdown--left"><a activeclassname="navbar__link--active" class="navbar__item navbar__link">Docs</a><ul class="dropdown__menu"><li><a class="dropdown__link" href="/SpotifyAPI-NET/docs/next/introduction">Latest/Next</a></li><li><a class="dropdown__link" href="/SpotifyAPI-NET/docs/home">5.1.1</a></li></ul></div><a class="navbar__item navbar__link" href="/SpotifyAPI-NET/news">News</a></div><div class="navbar__items navbar__items--right"><a href="https://github.com/JohnnyCrazy/SpotifyAPI-NET" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub</a><div class="react-toggle react-toggle--disabled displayOnlyInLargeViewport_1gtM"><div class="react-toggle-track"><div class="react-toggle-track-check"><span class="toggle_keGJ moon_1gwN"></span></div><div class="react-toggle-track-x"><span class="toggle_keGJ sun_3CPA"></span></div></div><div class="react-toggle-thumb"></div><input type="checkbox" disabled="" aria-label="Dark mode toggle" class="react-toggle-screenreader-only"></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div><div class="navbar-sidebar"><div class="navbar-sidebar__brand"><a class="navbar__brand" href="/SpotifyAPI-NET/"><img class="navbar__logo" src="/SpotifyAPI-NET/img/logo.svg" alt="SpotifyAPI-NET"><strong class="navbar__title">SpotifyAPI-NET</strong></a></div><div class="navbar-sidebar__items"><div class="menu"><ul class="menu__list"><li class="menu__list-item"><a activeclassname="navbar__link--active" class="menu__link menu__link--sublist">Docs</a><ul class="menu__list"><li class="menu__list-item"><a class="menu__link" href="/SpotifyAPI-NET/docs/next/introduction">Latest/Next</a></li><li class="menu__list-item"><a class="menu__link" href="/SpotifyAPI-NET/docs/home">5.1.1</a></li></ul></li><li class="menu__list-item"><a class="menu__link" href="/SpotifyAPI-NET/news">News</a></li><li class="menu__list-item"><a href="https://github.com/JohnnyCrazy/SpotifyAPI-NET" target="_blank" rel="noopener noreferrer" class="menu__link">GitHub</a></li></ul></div></div></div></nav><div class="main-wrapper"><div class="docPage_1kjD"><div class="docSidebarContainer_1cYp"><div class="sidebar_1kLs"><div class="menu menu--responsive menu_w2sC"><button aria-label="Open Menu" aria-haspopup="true" class="button button--secondary button--sm menu__button" type="button"><svg aria-label="Menu" class="sidebarMenuIcon_2vk4" xmlns="http://www.w3.org/2000/svg" height="24" width="24" viewBox="0 0 32 32" role="img" focusable="false"><title>Menu</title><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><ul class="menu__list"><li class="menu__list-item"><a class="menu__link menu__link--sublist menu__link--active" href="#!">SpotifyAPI-NET</a><ul class="menu__list"><li class="menu__list-item"><a class="menu__link" tabindex="0" href="/SpotifyAPI-NET/docs/next/introduction">Introduction</a></li><li class="menu__list-item"><a class="menu__link" tabindex="0" href="/SpotifyAPI-NET/docs/next/getting_started">Getting Started</a></li><li class="menu__list-item menu__list-item--collapsed"><a class="menu__link menu__link--sublist" href="#!" tabindex="0">Guides</a><ul class="menu__list"><li class="menu__list-item"><a class="menu__link" tabindex="-1" href="/SpotifyAPI-NET/docs/next/error_handling">Error Handling</a></li><li class="menu__list-item"><a class="menu__link" tabindex="-1" href="/SpotifyAPI-NET/docs/next/configuration">Configuration</a></li><li class="menu__list-item"><a class="menu__link" tabindex="-1" href="/SpotifyAPI-NET/docs/next/logging">Logging</a></li><li class="menu__list-item"><a class="menu__link" tabindex="-1" href="/SpotifyAPI-NET/docs/next/proxy">Proxy</a></li><li class="menu__list-item"><a class="menu__link" tabindex="-1" href="/SpotifyAPI-NET/docs/next/pagination">Pagination</a></li><li class="menu__list-item"><a class="menu__link" tabindex="-1" href="/SpotifyAPI-NET/docs/next/retry_handling">Retry Handling</a></li><li class="menu__list-item"><a class="menu__link" tabindex="-1" href="/SpotifyAPI-NET/docs/next/iplayableitem">IPlayableItem</a></li><li class="menu__list-item"><a class="menu__link" tabindex="-1" href="/SpotifyAPI-NET/docs/next/unit_testing">Unit Testing</a></li></ul></li><li class="menu__list-item"><a class="menu__link menu__link--sublist menu__link--active" href="#!" tabindex="0">Authentication Guides</a><ul class="menu__list"><li class="menu__list-item"><a class="menu__link" tabindex="0" href="/SpotifyAPI-NET/docs/next/auth_introduction">Introduction</a></li><li class="menu__list-item"><a class="menu__link" tabindex="0" href="/SpotifyAPI-NET/docs/next/client_credentials">Client Credentials</a></li><li class="menu__list-item"><a class="menu__link" tabindex="0" href="/SpotifyAPI-NET/docs/next/implicit_grant">Implicit Grant</a></li><li class="menu__list-item"><a aria-current="page" class="menu__link menu__link--active active" tabindex="0" href="/SpotifyAPI-NET/docs/next/authorization_code">Authorization Code</a></li><li class="menu__list-item"><a class="menu__link" tabindex="0" href="/SpotifyAPI-NET/docs/next/pkce">PKCE</a></li><li class="menu__list-item"><a class="menu__link" tabindex="0" href="/SpotifyAPI-NET/docs/next/token_swap">Token Swap</a></li></ul></li><li class="menu__list-item"><a class="menu__link" tabindex="0" href="/SpotifyAPI-NET/docs/next/showcase">Showcase</a></li><li class="menu__list-item menu__list-item--collapsed"><a class="menu__link menu__link--sublist" href="#!" tabindex="0">Examples</a><ul class="menu__list"><li class="menu__list-item"><a class="menu__link" tabindex="-1" href="/SpotifyAPI-NET/docs/next/example_asp">ASP.NET</a></li><li class="menu__list-item"><a class="menu__link" tabindex="-1" href="/SpotifyAPI-NET/docs/next/example_blazor_wasm">Blazor WASM</a></li><li class="menu__list-item"><a class="menu__link" tabindex="-1" href="/SpotifyAPI-NET/docs/next/example_blazor">Blazor ServerSide</a></li><li class="menu__list-item"><a class="menu__link" tabindex="-1" href="/SpotifyAPI-NET/docs/next/example_cli_custom_html">CLI - Custom HTML</a></li><li class="menu__list-item"><a class="menu__link" tabindex="-1" href="/SpotifyAPI-NET/docs/next/example_cli_persistent_config">CLI - Persistent Config</a></li><li class="menu__list-item"><a class="menu__link" tabindex="-1" href="/SpotifyAPI-NET/docs/next/example_token_swap">Token Swap</a></li><li class="menu__list-item"><a class="menu__link" tabindex="-1" href="/SpotifyAPI-NET/docs/next/example_uwp">UWP</a></li></ul></li></ul></li></ul></div></div></div><main class="docMainContainer_FFX1"><div class="container padding-vert--lg docItemWrapper_1cc7"><div class="row"><div class="col docItemCol_2GOA"><div class="docItemContainer_2cwg"><article><div><span class="badge badge--secondary">Version: next</span></div><header><h1 class="docTitle_1vWb">Authorization Code</h1></header><div class="markdown"><blockquote><p>This flow is suitable for long-running applications in which the user grants permission only once. It provides an access token that can be refreshed. Since the token exchange involves sending your secret key, perform this on a secure location, like a backend service, and not from a client such as a browser or from a mobile app.</p></blockquote><h2><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_ZqCz" id="existing-web-server"></a>Existing Web-Server<a aria-hidden="true" tabindex="-1" class="hash-link" href="#existing-web-server" title="Direct link to heading">#</a></h2><p>If you are already in control of a Web-Server (like <code>ASP.NET</code>), you can start the flow by generating a login uri</p><div class="mdxCodeBlock_iHAB"><div class="codeBlockContent_32p_"><button type="button" aria-label="Copy code to clipboard" class="copyButton_1BYj">Copy</button><div tabindex="0" class="prism-code language-csharp codeBlock_19pQ"><div class="codeBlockLines_2n9r" style="color:#bfc7d5;background-color:#292d3e"><div class="token-line" style="color:#bfc7d5"><span class="token plain">// Make sure &quot;http://localhost:5000&quot; is in your applications redirect URIs!</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">var loginRequest = new LoginRequest(</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"> new Uri(&quot;http://localhost:5000&quot;),</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"> &quot;ClientId&quot;,</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"> LoginRequest.ResponseType.Code</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">)</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">{</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"> Scope = new[] { Scopes.PlaylistReadPrivate, Scopes.PlaylistReadCollaborative }</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">};</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">var uri = loginRequest.ToUri();</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">// Redirect user to uri via your favorite web-server</span></div></div></div></div></div><p>When the user is redirected to the generated uri, he will have to login with his spotify account and confirm, that your application wants to access his user data. Once confirmed, he will be redirect to <code>http://localhost:5000</code> and a <code>code</code> parameter is attached to the query. This <code>code</code> has to be exchanged for an <code>access_token</code> and <code>refresh_token</code>:</p><div class="mdxCodeBlock_iHAB"><div class="codeBlockContent_32p_"><button type="button" aria-label="Copy code to clipboard" class="copyButton_1BYj">Copy</button><div tabindex="0" class="prism-code language-csharp codeBlock_19pQ"><div class="codeBlockLines_2n9r" style="color:#bfc7d5;background-color:#292d3e"><div class="token-line" style="color:#bfc7d5"><span class="token plain">// This method should be called from your web-server when the user visits &quot;http://localhost:5000&quot;</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">public Task GetCallback(string code)</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">{</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"> var response = await new OAuthClient().RequestToken(</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"> new AuthorizationCodeTokenRequest(&quot;ClientId&quot;, &quot;ClientSecret&quot;, code, &quot;http://localhost:5000&quot;)</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"> );</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block">
</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"> var spotify = new SpotifyClient(response.AccessToken);</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"> // Also important for later: response.RefreshToken</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">}</span></div></div></div></div></div><p>If the token expires at some point (check via <code>response.IsExpired</code>), you can refresh it:</p><div class="mdxCodeBlock_iHAB"><div class="codeBlockContent_32p_"><button type="button" aria-label="Copy code to clipboard" class="copyButton_1BYj">Copy</button><div tabindex="0" class="prism-code language-csharp codeBlock_19pQ"><div class="codeBlockLines_2n9r" style="color:#bfc7d5;background-color:#292d3e"><div class="token-line" style="color:#bfc7d5"><span class="token plain">var newResponse = await new OAuthClient().RequestToken(</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"> new AuthorizationCodeRefreshRequest(&quot;ClientId&quot;, &quot;ClientSecret&quot;, response.RefreshToken)</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">);</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block">
</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">var spotify = new SpotifyClient(newResponse.AccessToken);</span></div></div></div></div></div><p>You can also let the <code>AuthorizationCodeAuthenticator</code> take care of the refresh part:</p><div class="mdxCodeBlock_iHAB"><div class="codeBlockContent_32p_"><button type="button" aria-label="Copy code to clipboard" class="copyButton_1BYj">Copy</button><div tabindex="0" class="prism-code language-csharp codeBlock_19pQ"><div class="codeBlockLines_2n9r" style="color:#bfc7d5;background-color:#292d3e"><div class="token-line" style="color:#bfc7d5"><span class="token plain">var response = await new OAuthClient().RequestToken(</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"> new AuthorizationCodeTokenRequest(&quot;ClientId&quot;, &quot;ClientSecret&quot;, code, &quot;http://localhost:5000&quot;)</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">);</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">var config = SpotifyClientConfig</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"> .CreateDefault()</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"> .WithAuthenticator(new AuthorizationCodeAuthenticator(&quot;ClientId&quot;, &quot;ClientSecret&quot;, response));</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block">
</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">var spotify = new SpotifyClient(config);</span></div></div></div></div></div><p>For a real example, have a look at <a href="https://github.com/JohnnyCrazy/SpotifyAPI-NET/tree/master/SpotifyAPI.Web.Examples/Example.ASP">Example.ASP</a>. This also uses the great package <code>AspNet.Security.OAuth.Spotify</code> which takes care of the OAuth flow inside of <code>ASP.NET</code>.</p><h2><a aria-hidden="true" tabindex="-1" class="anchor enhancedAnchor_ZqCz" id="using-spotifywebauth"></a>Using Spotify.Web.Auth<a aria-hidden="true" tabindex="-1" class="hash-link" href="#using-spotifywebauth" title="Direct link to heading">#</a></h2><p>For cross-platform CLI and desktop apps (non <code>UWP</code> apps), <code>Spotify.Web.Auth</code> can be used to supply a small embedded Web Server for the code retrieval.</p><div class="admonition admonition-warning alert alert--danger"><div class="admonition-heading"><h5><span class="admonition-icon"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="16" viewBox="0 0 12 16"><path fill-rule="evenodd" d="M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"></path></svg></span>warning</h5></div><div class="admonition-content"><p>You&#x27;re client secret will be exposed when embedded in a desktop/cli app. This can be abused and is not preffered. If possible, let the user create an application in spotify dashboard or let a server handle the spotify communication.</p></div></div><div class="mdxCodeBlock_iHAB"><div class="codeBlockContent_32p_"><button type="button" aria-label="Copy code to clipboard" class="copyButton_1BYj">Copy</button><div tabindex="0" class="prism-code language-csharp codeBlock_19pQ"><div class="codeBlockLines_2n9r" style="color:#bfc7d5;background-color:#292d3e"><div class="token-line" style="color:#bfc7d5"><span class="token plain">private static EmbedIOAuthServer _server;</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block">
</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">public static async Task Main()</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">{</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"> // Make sure &quot;http://localhost:5000/callback&quot; is in your spotify application as redirect uri!</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"> _server = new EmbedIOAuthServer(new Uri(&quot;http://localhost:5000/callback&quot;), 5000);</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"> await _server.Start();</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block">
</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"> _server.AuthorizationCodeReceived += OnAuthorizationCodeReceived;</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block">
</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"> var request = new LoginRequest(_server.BaseUri, &quot;ClientId&quot;, LoginRequest.ResponseType.Code)</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"> {</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"> Scope = new List&lt;string&gt; { Scopes.UserReadEmail }</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"> };</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"> BrowserUtil.Open(uri);</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">}</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block">
</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">private static async Task OnAuthorizationCodeReceived(object sender, AuthorizationCodeResponse response)</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">{</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"> await _server.Stop();</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block">
</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"> var config = SpotifyClientConfig.CreateDefault();</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"> var tokenResponse = await new OAuthClient(config).RequestToken(</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"> new AuthorizationCodeTokenRequest(</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"> &quot;ClientId&quot;, &quot;ClientSecret&quot;, response.Code, &quot;http://localhost:5000/callback&quot;</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"> )</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"> );</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block">
</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"> var spotify = new SpotifyClient(tokenResponse.AccessToken);</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"> // do calls with spotify and save token?</span></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">}</span></div></div></div></div></div><p>For real examples, have a look at <a href="https://github.com/JohnnyCrazy/SpotifyAPI-NET/tree/master/SpotifyAPI.Web.Examples/Example.CLI.PersistentConfig">Example.CLI.PersistentConfig</a> and <a href="https://github.com/JohnnyCrazy/SpotifyAPI-NET/tree/master/SpotifyAPI.Web.Examples/Example.CLI.CustomHTML">Example.CLI.CustomHTML</a></p></div></article><div class="margin-vert--xl"><div class="row"><div class="col"><a href="https://github.com/JohnnyCrazy/SpotifyAPI-NET/edit/master/SpotifyAPI.Docs/docs/authorization_code.md" target="_blank" rel="noreferrer noopener"><svg fill="currentColor" height="1.2em" width="1.2em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 40 40" style="margin-right:0.3em;vertical-align:sub"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Edit this page</a></div><div class="col text--right"><em><small>Last updated on <time datetime="2020-08-24T09:29:13.000Z" class="docLastUpdatedAt_1sqk">8/24/2020</time> by <strong>Alex</strong></small></em></div></div></div><div class="margin-vert--lg"><nav class="pagination-nav"><div class="pagination-nav__item"><a class="pagination-nav__link" href="/SpotifyAPI-NET/docs/next/implicit_grant"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">« Implicit Grant</div></a></div><div class="pagination-nav__item pagination-nav__item--next"><a class="pagination-nav__link" href="/SpotifyAPI-NET/docs/next/pkce"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">PKCE »</div></a></div></nav></div></div></div><div class="col col--3"><div class="tableOfContents_TbNY"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#existing-web-server" class="table-of-contents__link">Existing Web-Server</a></li><li><a href="#using-spotifywebauth" class="table-of-contents__link">Using Spotify.Web.Auth</a></li></ul></div></div></div></div></main></div></div><footer class="footer footer--dark"><div class="container"><div class="text--center"><div>Copyright © 2020 Jonas Dellinger. Built with Docusaurus.</div></div></div></footer></div>
<script src="/SpotifyAPI-NET/styles.c98ed224.js"></script>
<script src="/SpotifyAPI-NET/runtime~main.bf17bec6.js"></script>
<script src="/SpotifyAPI-NET/main.73459b16.js"></script>
<script src="/SpotifyAPI-NET/1.3b60c25a.js"></script>
<script src="/SpotifyAPI-NET/2.2bb7aa4d.js"></script>
<script src="/SpotifyAPI-NET/3.f4b60483.js"></script>
<script src="/SpotifyAPI-NET/1be78505.163494cb.js"></script>
<script src="/SpotifyAPI-NET/ad407b76.fbd12313.js"></script>
<script src="/SpotifyAPI-NET/d85a39be.3ed95a5c.js"></script>
</body>
</html>