oauth暂存

pull/12/head
liangliangyy 9 years ago
parent ea09e9abc2
commit ebde6b6271

@ -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'
}
}

@ -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
"""

@ -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

@ -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
}

@ -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<sitename>\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),
]
"""

@ -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('/')
"""

Loading…
Cancel
Save