diff --git a/oauth/oauthmanager.py b/oauth/oauthmanager.py index 5d7521a..32c337a 100644 --- a/oauth/oauthmanager.py +++ b/oauth/oauthmanager.py @@ -25,6 +25,12 @@ from DjangoBlog.utils import parse_dict_to_url, cache_decorator logger = logging.getLogger(__name__) +class OAuthAccessTokenException(Exception): + ''' + oauth授权失败异常 + ''' + + class BaseOauthManager(metaclass=ABCMeta): """获取用户授权""" AUTH_URL = None @@ -106,14 +112,14 @@ class WBOauthManager(BaseOauthManager): 'redirect_uri': self.callback_url } rsp = self.do_post(self.TOKEN_URL, params) - try: - obj = json.loads(rsp) + + obj = json.loads(rsp) + if 'access_token' in obj: self.access_token = str(obj['access_token']) self.openid = str(obj['uid']) return self.get_oauth_userinfo() - except Exception as e: - logger.error(e) - return None + else: + raise OAuthAccessTokenException(rsp) def get_oauth_userinfo(self): if not self.is_authorized: @@ -124,7 +130,6 @@ class WBOauthManager(BaseOauthManager): } rsp = self.do_get(self.API_URL, params) try: - datas = json.loads(rsp) user = OAuthUser() user.matedata = rsp @@ -178,15 +183,14 @@ class GoogleOauthManager(BaseOauthManager): rsp = self.do_post(self.TOKEN_URL, params) obj = json.loads(rsp) - try: + + if 'access_token' in obj: self.access_token = str(obj['access_token']) self.openid = str(obj['id_token']) logger.info(self.ICON_NAME + ' oauth ' + rsp) return self.access_token - except Exception as e: - logger.error(e) - logger.error(self.ICON_NAME + ' oauth error ' + rsp) - return None + else: + raise OAuthAccessTokenException(rsp) def get_oauth_userinfo(self): if not self.is_authorized: @@ -249,14 +253,13 @@ class GitHubOauthManager(BaseOauthManager): } rsp = self.do_post(self.TOKEN_URL, params) - try: - from urllib import parse - r = parse.parse_qs(rsp) + from urllib import parse + r = parse.parse_qs(rsp) + if 'access_token' in r: self.access_token = (r['access_token'][0]) return self.access_token - except Exception as e: - logger.error(e) - return None + else: + raise OAuthAccessTokenException(rsp) def get_oauth_userinfo(self): @@ -318,14 +321,13 @@ class FaceBookOauthManager(BaseOauthManager): } rsp = self.do_post(self.TOKEN_URL, params) - try: - obj = json.loads(rsp) + obj = json.loads(rsp) + if 'access_token' in obj: token = str(obj['access_token']) self.access_token = token return self.access_token - except Exception as e: - logger.error(e) - return None + else: + raise OAuthAccessTokenException(rsp) def get_oauth_userinfo(self): params = { @@ -385,9 +387,12 @@ class QQOauthManager(BaseOauthManager): rsp = self.do_get(self.TOKEN_URL, params) if rsp: d = urllib.parse.parse_qs(rsp) - token = d['access_token'] - self.access_token = token - return token + if 'access_token' in d: + token = d['access_token'] + self.access_token = token + return token + else: + raise OAuthAccessTokenException(rsp) def get_open_id(self): if self.is_access_token_set: diff --git a/oauth/views.py b/oauth/views.py index 2e99a3d..9c828dc 100644 --- a/oauth/views.py +++ b/oauth/views.py @@ -15,7 +15,7 @@ from DjangoBlog.utils import send_email, get_md5, save_user_avatar from DjangoBlog.utils import get_current_site from django.core.exceptions import ObjectDoesNotExist from django.http import HttpResponseForbidden -from .oauthmanager import get_manager_by_type +from .oauthmanager import get_manager_by_type, OAuthAccessTokenException from DjangoBlog.blog_signals import oauth_user_login_signal import logging @@ -57,7 +57,14 @@ def authorize(request): if not manager: return HttpResponseRedirect('/') code = request.GET.get('code', None) - rsp = manager.get_access_token_by_code(code) + try: + rsp = manager.get_access_token_by_code(code) + except OAuthAccessTokenException as e: + logger.warning("OAuthAccessTokenException:" + str(e)) + return HttpResponseRedirect('/') + except Exception as e: + logger.error(e) + rsp = None nexturl = get_redirecturl(request) if not rsp: return HttpResponseRedirect(manager.get_authorization_url(nexturl))