I'm having trouble using the refresh token in a Python script to get a new access token for a user after the hour expires. I'm using the `requests_oauthlib` library to handle token calls.
I'm able to get the initial token and store it for a user along with the refresh token. Has anyone done this and, if so, would you be willing to share a working code sample?
Here's my Flask route:
<SPAN class="keyword token">from</SPAN> requests_oauthlib <SPAN class="keyword token">import</SPAN> OAuth2Session<BR /><BR />@app<SPAN class="punctuation token">.</SPAN>route<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'/'</SPAN><SPAN class="punctuation token">)</SPAN><BR />@app<SPAN class="punctuation token">.</SPAN>route<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'/index'</SPAN><SPAN class="punctuation token">)</SPAN><BR /><SPAN class="keyword token">def</SPAN> <SPAN class="token function">index</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN><BR /> <BR /> <SPAN class="comment token"># check that the user exists. If so, log in.</SPAN><BR /> <SPAN class="keyword token">if</SPAN> <SPAN class="operator token">not</SPAN> current_user<SPAN class="punctuation token">.</SPAN>is_anonymous<SPAN class="punctuation token">:</SPAN><BR /><BR /> <SPAN class="comment token"># Update the session if a refresh is needed</SPAN><BR /> <SPAN class="keyword token">def</SPAN> <SPAN class="token function">token_updater</SPAN><SPAN class="punctuation token">(</SPAN>token<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN><BR /> session<SPAN class="punctuation token">[</SPAN><SPAN class="string token">'oauth_token'</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="operator token">=</SPAN> token<BR /> current_user<SPAN class="punctuation token">.</SPAN>token <SPAN class="operator token">=</SPAN> session<SPAN class="punctuation token">[</SPAN><SPAN class="string token">'oauth_token'</SPAN><SPAN class="punctuation token">]</SPAN><BR /><BR /> <SPAN class="comment token"># Check the user's refresh token</SPAN><BR /> <SPAN class="keyword token">if</SPAN> current_user<SPAN class="punctuation token">.</SPAN>expiration <SPAN class="operator token"><</SPAN> time<SPAN class="punctuation token">.</SPAN>time<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN><BR /><BR /> extra <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">{</SPAN><BR /> <SPAN class="string token">'grant_type'</SPAN><SPAN class="punctuation token">:</SPAN> <SPAN class="string token">'refresh_token'</SPAN><BR /> <SPAN class="punctuation token">}</SPAN><BR /><BR /> token <SPAN class="operator token">=</SPAN> OAuth2Session<SPAN class="punctuation token">(</SPAN>app<SPAN class="punctuation token">.</SPAN>config<SPAN class="punctuation token">[</SPAN><SPAN class="string token">'OAUTH_CREDENTIALS'</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="string token">'canvas'</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="string token">'id'</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">,</SPAN><BR /> token<SPAN class="operator token">=</SPAN>current_user<SPAN class="punctuation token">.</SPAN>refresh_token<SPAN class="punctuation token">,</SPAN><BR /> auto_refresh_kwargs<SPAN class="operator token">=</SPAN>extra<SPAN class="punctuation token">,</SPAN><BR /> auto_refresh_url<SPAN class="operator token">=</SPAN>app<SPAN class="punctuation token">.</SPAN>config<SPAN class="punctuation token">[</SPAN><SPAN class="string token">'OAUTH_CREDENTIALS'</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="string token">'canvas'</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="string token">'token_url'</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">,</SPAN><BR /> token_updater<SPAN class="operator token">=</SPAN>token_updater<SPAN class="punctuation token">)</SPAN><BR /><BR /> <SPAN class="keyword token">return</SPAN> redirect<SPAN class="punctuation token">(</SPAN>url_for<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'dashboard'</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN><BR /><BR /> <SPAN class="keyword token">else</SPAN><SPAN class="punctuation token">:</SPAN><BR /> <SPAN class="comment token"># Start the OAuth2 login flow if the user does not exist.</SPAN><BR /> <SPAN class="comment token"># This part works fine.</SPAN><BR /> <SPAN class="keyword token">return</SPAN> render_template<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'login.html'</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN></SPAN>