diff --git a/DjangoBlog/settings.py b/DjangoBlog/settings.py index 6489a36..6897111 100644 --- a/DjangoBlog/settings.py +++ b/DjangoBlog/settings.py @@ -195,24 +195,24 @@ CACHE_MIDDLEWARE_SECONDS = 60 * 60 * 10 CACHE_MIDDLEWARE_KEY_PREFIX = "djangoblog" CACHE_MIDDLEWARE_ALIAS = 'default' -SESSION_ENGINE = "django.contrib.sessions.backends.cache" -SESSION_CACHE_ALIAS = 'default' +# SESSION_ENGINE = "django.contrib.sessions.backends.cache" +# SESSION_CACHE_ALIAS = 'default' OAHUTH = { 'sina': { 'appkey': '3161614143', 'appsecret': 'ee17c099317f872eeddb25204ea46721', - 'callbackurl': 'http://www.lylinux.net/oauth/weibo' + 'callbackurl': 'http://www.lylinux.net/oauth/authorize?type=weibo' }, 'google': { 'appkey': os.environ.get('GOOGLE_APP_KEY'), 'appsecret': os.environ.get('GOOGLE_APP_SECRET'), - 'callbackurl': 'http://www.lylinux.net/oauth/googleauthorize' + 'callbackurl': 'http://www.lylinux.net/oauth/authorize?type=google' }, 'github': { 'appkey': os.environ.get('GITHUB_APP_KEY'), 'appsecret': os.environ.get('GITHUB_APP_SECRET'), - 'callbackurl': 'http://www.lylinux.net/oauth/githubauthorize' + 'callbackurl': 'http://www.lylinux.net/oauth/authorize?type=github' } } diff --git a/oauth/models.py b/oauth/models.py index 76a10b0..5c0497d 100644 --- a/oauth/models.py +++ b/oauth/models.py @@ -4,8 +4,22 @@ from django.db import models from django.conf import settings +class oauthuser(models.Model): + author = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name='用户', blank=True, null=True) + openid = models.CharField(max_length=50) + nikename = models.CharField(max_length=50, verbose_name='昵称') + token = models.CharField(max_length=50) + picture = models.CharField(max_length=50, blank=True, null=True) + type = models.CharField(blank=False, null=False, max_length=50) + email = models.CharField(max_length=50, null=True, blank=True) + + def __str__(self): + return self.nikename + + +""" class BaseModel(models.Model): - author = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name='用户') + author = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name='用户', blank=True, null=True) openid = models.CharField(max_length=50) nikename = models.CharField(max_length=50, verbose_name='昵称') token = models.CharField(max_length=50) @@ -34,3 +48,4 @@ class GoogleUserInfo(BaseModel): class Meta: verbose_name = "Google" verbose_name_plural = verbose_name +""" diff --git a/oauth/oauthmanager.py b/oauth/oauthmanager.py index 3fcd81f..477b568 100644 --- a/oauth/oauthmanager.py +++ b/oauth/oauthmanager.py @@ -14,6 +14,7 @@ """ from abc import ABCMeta, abstractmethod, abstractproperty +from oauth.models import oauthuser from django.conf import settings import requests import json @@ -192,7 +193,7 @@ class GitHubOauthManager(BaseOauthManager): 'client_id': self.client_id, 'response_type': 'code', 'redirect_uri': self.callback_url, - 'scope': 'user:email', + 'scope': 'user' } url = self.AUTH_URL + "?" + urllib.parse.urlencode(params, quote_via=urllib.parse.quote) return url @@ -208,16 +209,45 @@ class GitHubOauthManager(BaseOauthManager): } rsp = self.do_post(self.TOKEN_URL, params) print(rsp) - obj = json.loads(rsp) - self.access_token = str(obj['access_token']) - self.openid = str(obj['id_token']) + try: + from urllib import parse + r = parse.parse_qs(rsp) + self.access_token = (r['access_token'][0]) + return self.access_token + except: + return None def get_oauth_userinfo(self): - if not self.is_authorized: - return None + params = { 'access_token': self.access_token } rsp = self.do_get(self.API_URL, params) print(rsp) - return json.loads(rsp) + try: + datas = json.loads(rsp) + user = oauthuser() + user.picture = datas['avatar_url'] + user.nikename = datas['name'] + user.openid = datas['id'] + user.type = 'github' + if datas['email']: + user.email = datas['email'] + + return user + except: + logger.info('github oauth error.rsp:' + rsp) + return None + + +def get_oauth_apps(): + applications = BaseOauthManager.__subclasses__() + return list(map(lambda x: x(), applications)) + + +def get_manager_by_type(type): + applications = get_oauth_apps() + finds = list(filter(lambda x: x.ICON_NAME.lower() == type.lower(), applications)) + if finds: + return finds[0] + return None diff --git a/oauth/templatetags/oauth_tags.py b/oauth/templatetags/oauth_tags.py index 26da1f7..eb37aab 100644 --- a/oauth/templatetags/oauth_tags.py +++ b/oauth/templatetags/oauth_tags.py @@ -12,7 +12,7 @@ @file: oauth_tags.py @time: 2017/3/4 下午3:22 """ -from oauth.oauthmanager import * +from oauth.oauthmanager import get_oauth_apps from django import template from django.conf import settings @@ -22,13 +22,8 @@ register = template.Library() @register.inclusion_tag('oauth/oauth_applications.html') def load_oauth_applications(): - applications = BaseOauthManager.__subclasses__() - apps = [] - for application in applications: - app = application() - icon = app.ICON_NAME - authorizeurl = app.get_authorization_url() - apps.append((icon, authorizeurl)) + applications = get_oauth_apps() + apps = list(map(lambda x: (x.ICON_NAME, x.get_authorization_url()), applications)) return { 'apps': apps } diff --git a/oauth/urls.py b/oauth/urls.py index b980ec2..6a43a66 100644 --- a/oauth/urls.py +++ b/oauth/urls.py @@ -17,6 +17,9 @@ from django.conf.urls import url from django.views.decorators.cache import cache_page from . import views +urlpatterns = [url(r'^oauth/authorize$', views.authorize), ] + +""" urlpatterns = [ url(r'^oauth/wbauthorize/(?P\w+)$', views.wbauthorize), url(r'^oauth/wboauthurl$', views.wboauthurl), @@ -24,3 +27,4 @@ urlpatterns = [ url(r'^oauth/googleoauthurl', views.googleoauthurl), url(r'^oauth/googleauthorize', views.googleauthorize), ] +""" diff --git a/oauth/views.py b/oauth/views.py index d9a0d81..f9d6f5e 100644 --- a/oauth/views.py +++ b/oauth/views.py @@ -1,14 +1,43 @@ from django.shortcuts import render # Create your views here. -from .oauthmanager import WBOauthManager, GoogleOauthManager +from .oauthmanager import WBOauthManager, GoogleOauthManager, get_manager_by_type from django.conf import settings from django.http import HttpResponse, HttpResponseRedirect from django.contrib.auth import get_user_model -from .models import GoogleUserInfo +from .models import oauthuser from django.contrib.auth import login +def authorize(request): + manager = None + type = request.GET.get('type', None) + if not type: + return HttpResponseRedirect('/') + manager = get_manager_by_type(type) + if not manager: + return HttpResponseRedirect('/') + code = request.GET.get('code', None) + rsp = manager.get_access_token_by_code(code) + if not rsp: + return HttpResponseRedirect(manager.get_authorization_url()) + user = manager.get_oauth_userinfo() + author = None + if user: + email = user.email + if email: + author = get_user_model().objects.get(email=email) + if not author: + author = get_user_model().objects.create_user(username=user["name"], email=email) + user.author = author + user.save() + login(request, author) + return HttpResponseRedirect('/') + if not email: + author = get_user_model().objects.create_user(username=user["name"], email=email) + + +""" def wbauthorize(request, sitename): manager = WBOauthManager(client_id=settings.OAHUTH['sina']['appkey'], client_secret=settings.OAHUTH['sina']['appsecret'], @@ -55,4 +84,7 @@ def googleauthorize(request): userinfo.nikename = user["name"] userinfo.save() login(request, author) + else: + pass return HttpResponseRedirect('/') +"""