|
19 | 19 | from werkzeug import parse_options_header, cached_property |
20 | 20 | from .utils import to_bytes |
21 | 21 | try: |
22 | | - from urlparse import urljoin |
| 22 | + from urllib import urlencode |
| 23 | + from urlparse import parse_qsl, urljoin, urlparse, urlunparse |
23 | 24 | import urllib2 as http |
24 | 25 | except ImportError: |
25 | 26 | from urllib import request as http |
26 | 27 | from urllib.parse import urljoin |
| 28 | + from urllib.parse import parse_qsl, urlencode, urlparse, urlunparse |
27 | 29 | log = logging.getLogger('flask_oauthlib') |
28 | 30 |
|
29 | 31 |
|
@@ -622,10 +624,24 @@ def handle_oauth1_response(self): |
622 | 624 |
|
623 | 625 | def handle_oauth2_response(self): |
624 | 626 | """Handles an oauth2 authorization response.""" |
| 627 | + |
| 628 | + # Remove the 'code' argument from current URL |
| 629 | + oauth_redir_tuple = urlparse(request.url) |
| 630 | + query_args = [ |
| 631 | + arg_pair for arg_pair in parse_qsl(oauth_redir_tuple.query) |
| 632 | + if arg_pair[0] != 'code' |
| 633 | + ] |
| 634 | + oauth_redir = urlunparse( |
| 635 | + oauth_redir_tuple[0:4] + |
| 636 | + (urlencode(query_args, doseq=True),) + |
| 637 | + oauth_redir_tuple[5:] |
| 638 | + ) |
| 639 | + |
625 | 640 | client = self.make_client() |
626 | 641 | remote_args = { |
627 | 642 | 'code': request.args.get('code'), |
628 | 643 | 'client_secret': self.consumer_secret, |
| 644 | + 'redirect_uri': oauth_redir |
629 | 645 | } |
630 | 646 | log.debug('Prepare oauth2 remote args %r', remote_args) |
631 | 647 | remote_args.update(self.access_token_params) |
|
0 commit comments