parent
407fe823b3
commit
605761db13
@ -0,0 +1,3 @@
|
||||
from django.contrib import admin
|
||||
|
||||
# Register your models here.
|
||||
@ -0,0 +1,5 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class OauthConfig(AppConfig):
|
||||
name = 'oauth'
|
||||
@ -0,0 +1,29 @@
|
||||
from django.db import models
|
||||
|
||||
# Create your models here.
|
||||
from django.conf import settings
|
||||
|
||||
|
||||
class BaseModel(models.Model):
|
||||
author = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name='用户')
|
||||
openid = models.CharField(max_length=50)
|
||||
nikename = models.CharField(max_length=50, verbose_name='昵称')
|
||||
token = models.CharField(max_length=50)
|
||||
|
||||
def __str__(self):
|
||||
return self.nikename
|
||||
|
||||
class Meta:
|
||||
abstract = True
|
||||
|
||||
|
||||
class SinaWBUserInfo(BaseModel):
|
||||
class Meta:
|
||||
verbose_name = "新浪微博"
|
||||
verbose_name_plural = verbose_name
|
||||
|
||||
|
||||
class QQUserInfo(BaseModel):
|
||||
class Meta:
|
||||
verbose_name = "QQ"
|
||||
verbose_name_plural = verbose_name
|
||||
@ -0,0 +1,117 @@
|
||||
#!/usr/bin/env python
|
||||
# encoding: utf-8
|
||||
|
||||
|
||||
"""
|
||||
@version: ??
|
||||
@author: liangliangyy
|
||||
@license: MIT Licence
|
||||
@contact: liangliangyy@gmail.com
|
||||
@site: https://www.lylinux.org/
|
||||
@software: PyCharm
|
||||
@file: oauthmanager.py
|
||||
@time: 2016/11/26 下午5:09
|
||||
"""
|
||||
|
||||
from abc import ABCMeta, abstractmethod, abstractproperty
|
||||
import requests
|
||||
import json
|
||||
import urllib.parse
|
||||
|
||||
|
||||
class BaseManager(metaclass=ABCMeta):
|
||||
"""获取用户授权"""
|
||||
AUTH_URL = None
|
||||
"""获取token"""
|
||||
TOKEN_URL = None
|
||||
"""获取用户信息"""
|
||||
API_URL = None
|
||||
|
||||
def __init__(self, client_id, client_secret, callback_url, access_token=None, openid=None):
|
||||
self.client_id = client_id
|
||||
self.client_secret = client_secret
|
||||
self.callback_url = callback_url
|
||||
self.access_token = access_token
|
||||
self.openid = openid
|
||||
|
||||
@property
|
||||
def is_access_token_set(self):
|
||||
return self.access_token != None
|
||||
|
||||
@property
|
||||
def is_authorized(self):
|
||||
return self.is_access_token_set and self.access_token != None and self.openid != None
|
||||
|
||||
@abstractmethod
|
||||
def get_authorization_url(self):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def get_access_token_by_code(self, code):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def get_oauth_userinfo(self):
|
||||
pass
|
||||
|
||||
def do_get(self, url, params):
|
||||
rsp = requests.get(url=url, params=params)
|
||||
return rsp.text
|
||||
|
||||
def do_post(self, url, params):
|
||||
rsp = requests.post(url, params)
|
||||
return rsp.text
|
||||
|
||||
|
||||
class WBOauthManager(BaseManager):
|
||||
AUTH_URL = 'https://api.weibo.com/oauth2/authorize'
|
||||
TOKEN_URL = 'https://api.weibo.com/oauth2/access_token'
|
||||
API_URL = 'https://api.weibo.com/2/users/show.json'
|
||||
|
||||
def __init__(self, client_id, client_secret, callback_url, access_token=None, openid=None):
|
||||
super(WBOauthManager, self).__init__(client_id=client_id, client_secret=client_secret,
|
||||
callback_url=callback_url, access_token=access_token, openid=openid)
|
||||
|
||||
def get_authorization_url(self):
|
||||
params = {
|
||||
'client_id': self.client_id,
|
||||
'response_type': 'code',
|
||||
'redirect_uri': self.callback_url
|
||||
}
|
||||
url = self.AUTH_URL + "?" + urllib.parse.urlencode(params)
|
||||
return url
|
||||
|
||||
def get_access_token_by_code(self, code):
|
||||
print(code)
|
||||
params = {
|
||||
'client_id': self.client_id,
|
||||
'client_secret': self.client_secret,
|
||||
'grant_type': 'authorization_code',
|
||||
'code': code,
|
||||
'redirect_uri': self.callback_url
|
||||
}
|
||||
rsp = self.do_post(self.TOKEN_URL, params)
|
||||
print(rsp)
|
||||
# return rsp
|
||||
|
||||
obj = json.loads(rsp)
|
||||
self.access_token = str(obj['access_token'])
|
||||
self.openid = str(obj['uid'])
|
||||
return self.get_oauth_userinfo()
|
||||
|
||||
try:
|
||||
self.access_token = str(obj['access_token'])
|
||||
self.openid = str(obj['uid'])
|
||||
return self.get_oauth_userinfo()
|
||||
except:
|
||||
return None
|
||||
|
||||
def get_oauth_userinfo(self):
|
||||
if not self.is_authorized:
|
||||
return None
|
||||
params = {
|
||||
'uid': self.openid,
|
||||
'access_token': self.access_token
|
||||
}
|
||||
rsp = self.do_get(self.API_URL, params)
|
||||
print(rsp)
|
||||
@ -0,0 +1,13 @@
|
||||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
||||
|
||||
class OAuthTet(TestCase):
|
||||
def setUp(self):
|
||||
pass
|
||||
|
||||
|
||||
from oauth.oauthmanager import WBOauthManager
|
||||
from django.conf import settings
|
||||
settings.OAHUTH['sina']
|
||||
manager=WBOauthManager(client_id=settings.OAHUTH['sina']['appkey'],client_secret=settings.OAHUTH['sina']['appsecret'],callback_url=settings.OAHUTH['sina']['callbackurl'])
|
||||
@ -0,0 +1,24 @@
|
||||
#!/usr/bin/env python
|
||||
# encoding: utf-8
|
||||
|
||||
|
||||
"""
|
||||
@version: ??
|
||||
@author: liangliangyy
|
||||
@license: MIT Licence
|
||||
@contact: liangliangyy@gmail.com
|
||||
@site: https://www.lylinux.org/
|
||||
@software: PyCharm
|
||||
@file: urls.py
|
||||
@time: 2016/11/26 下午5:25
|
||||
"""
|
||||
|
||||
from django.conf.urls import url
|
||||
from django.views.decorators.cache import cache_page
|
||||
from . import views
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^oauth/wbauthorize/(?P<sitename>\w+)$', views.wbauthorize),
|
||||
|
||||
url(r'^oauth/wboauthurl$', views.wboauthurl),
|
||||
]
|
||||
@ -0,0 +1,24 @@
|
||||
from django.shortcuts import render
|
||||
|
||||
# Create your views here.
|
||||
from .oauthmanager import WBOauthManager
|
||||
from django.conf import settings
|
||||
from django.http import HttpResponse
|
||||
|
||||
|
||||
def wbauthorize(request, sitename):
|
||||
manager = WBOauthManager(client_id=settings.OAHUTH['sina']['appkey'],
|
||||
client_secret=settings.OAHUTH['sina']['appsecret'],
|
||||
callback_url=settings.OAHUTH['sina']['callbackurl'])
|
||||
code = request.GET.get('code', None)
|
||||
rsp = manager.get_access_token_by_code(code)
|
||||
print(rsp)
|
||||
return HttpResponse(rsp)
|
||||
|
||||
|
||||
def wboauthurl(request):
|
||||
manager = WBOauthManager(client_id=settings.OAHUTH['sina']['appkey'],
|
||||
client_secret=settings.OAHUTH['sina']['appsecret'],
|
||||
callback_url=settings.OAHUTH['sina']['callbackurl'])
|
||||
url = manager.get_authorization_url()
|
||||
return HttpResponse(url)
|
||||
@ -0,0 +1,77 @@
|
||||
{% comment %}{% load blog_tags %}
|
||||
{% query nav_category_list parent_category=None as root_categorys %}
|
||||
{% for root in root_categorys %}
|
||||
<li id="menu-item-{{ root.pk }}"
|
||||
class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-7"><a
|
||||
href="{{ root.get_absolute_url }}">{{ root.name }}</a></li>
|
||||
{% query nav_category_list parent_category=root as chind_categorys %}
|
||||
{% if chind_categorys %}
|
||||
|
||||
{% endif %}
|
||||
{% endfor %}{% endcomment %}
|
||||
|
||||
|
||||
<nav id="site-navigation" class="main-navigation" role="navigation">
|
||||
<button class="menu-toggle">菜单</button>
|
||||
<a class="assistive-text" href="#content" title="跳至正文">跳至正文</a>
|
||||
<div class="menu-%e8%8f%9c%e5%8d%95-container">
|
||||
<ul id="menu-%e8%8f%9c%e5%8d%95" class="nav-menu">
|
||||
<li id="menu-item-3498"
|
||||
class="menu-item menu-item-type-custom menu-item-object-custom current-menu-item current_page_item menu-item-home menu-item-3498">
|
||||
<a href="{{ SITE_BASE_URL }}">首页</a></li>
|
||||
|
||||
{% load blog_tags %}
|
||||
{% query nav_category_list parent_category=None as root_categorys %}
|
||||
{% for node in root_categorys %}
|
||||
{% include 'nav_node.html' %}
|
||||
{% endfor %}
|
||||
{% comment %}
|
||||
<li id="menu-item-7"
|
||||
class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-7"><a
|
||||
href="https://www.lylinux.org/category/linux">linux</a></li>
|
||||
<li id="menu-item-606"
|
||||
class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-606">
|
||||
<a href="https://www.lylinux.org/category/%e7%a8%8b%e5%ba%8f%e7%8c%bf%e4%b9%8b%e8%b7%af">程序猿之路</a>
|
||||
<ul class="sub-menu">
|
||||
<li id="menu-item-607"
|
||||
class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-607"><a
|
||||
href="https://www.lylinux.org/category/%e7%a8%8b%e5%ba%8f%e7%8c%bf%e4%b9%8b%e8%b7%af/python">python</a>
|
||||
</li>
|
||||
<li id="menu-item-608"
|
||||
class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-608"><a
|
||||
href="https://www.lylinux.org/category/%e7%a8%8b%e5%ba%8f%e7%8c%bf%e4%b9%8b%e8%b7%af/c">c++</a>
|
||||
</li>
|
||||
<li id="menu-item-3181"
|
||||
class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3181"><a
|
||||
href="https://www.lylinux.org/category/%e7%a8%8b%e5%ba%8f%e7%8c%bf%e4%b9%8b%e8%b7%af/csharp">csharp</a>
|
||||
</li>
|
||||
<li id="menu-item-12"
|
||||
class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-12">
|
||||
<a href="https://www.lylinux.org/category/%e7%a8%8b%e5%ba%8f%e7%8c%bf%e4%b9%8b%e8%b7%af/javaweb/ssh%e6%a1%86%e6%9e%b6">ssh框架</a>
|
||||
<ul class="sub-menu">
|
||||
<li id="menu-item-11"
|
||||
class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-11">
|
||||
<a href="https://www.lylinux.org/category/%e7%a8%8b%e5%ba%8f%e7%8c%bf%e4%b9%8b%e8%b7%af/javaweb/jspservlet">jsp/servlet</a>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li id="menu-item-8"
|
||||
class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-8"><a
|
||||
href="https://www.lylinux.org/category/wordpress">wordpress</a></li>
|
||||
<li id="menu-item-9"
|
||||
class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-9"><a
|
||||
href="https://www.lylinux.org/category/%e9%9a%8f%e7%ac%94%e6%9d%82%e8%b0%88">随笔杂谈</a></li>
|
||||
<li id="menu-item-603"
|
||||
class="menu-item menu-item-type-post_type menu-item-object-page menu-item-603"><a
|
||||
href="https://www.lylinux.org/link">友情链接</a></li>
|
||||
<li id="menu-item-604"
|
||||
class="menu-item menu-item-type-post_type menu-item-object-page menu-item-604"><a
|
||||
href="https://www.lylinux.org/%e7%95%99%e8%a8%80%e6%9d%bf">留言板</a></li>
|
||||
<li id="menu-item-605"
|
||||
class="menu-item menu-item-type-post_type menu-item-object-page menu-item-605"><a
|
||||
href="https://www.lylinux.org/%e5%85%b3%e4%ba%8e">关于</a></li>{% endcomment %}
|
||||
</ul>
|
||||
</div>
|
||||
</nav><!-- #site-navigation -->
|
||||
@ -0,0 +1,40 @@
|
||||
<li id="menu-item-{{ node.pk }}"
|
||||
class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-{{ node.pk }}">
|
||||
<a href="{{ node.get_absolute_url }}">{{ node.name }}</a>
|
||||
{% load blog_tags %}
|
||||
{% query nav_category_list parent_category=node as child_categorys %}
|
||||
{% if child_categorys %}
|
||||
|
||||
<ul class="sub-menu">
|
||||
{% for child in child_categorys %}
|
||||
{% with node=child template_name="nav_node.html" %}
|
||||
{% include template_name %}
|
||||
{% endwith %}
|
||||
{% endfor %}
|
||||
{% comment %} <li id="menu-item-607"
|
||||
class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-607"><a
|
||||
href="https://www.lylinux.org/category/%e7%a8%8b%e5%ba%8f%e7%8c%bf%e4%b9%8b%e8%b7%af/python">python</a>
|
||||
</li>
|
||||
<li id="menu-item-608"
|
||||
class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-608"><a
|
||||
href="https://www.lylinux.org/category/%e7%a8%8b%e5%ba%8f%e7%8c%bf%e4%b9%8b%e8%b7%af/c">c++</a>
|
||||
</li>
|
||||
<li id="menu-item-3181"
|
||||
class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3181"><a
|
||||
href="https://www.lylinux.org/category/%e7%a8%8b%e5%ba%8f%e7%8c%bf%e4%b9%8b%e8%b7%af/csharp">csharp</a>
|
||||
</li>
|
||||
<li id="menu-item-12"
|
||||
class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-12">
|
||||
<a href="https://www.lylinux.org/category/%e7%a8%8b%e5%ba%8f%e7%8c%bf%e4%b9%8b%e8%b7%af/javaweb/ssh%e6%a1%86%e6%9e%b6">ssh框架</a>
|
||||
<ul class="sub-menu">
|
||||
<li id="menu-item-11"
|
||||
class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-11">
|
||||
<a href="https://www.lylinux.org/category/%e7%a8%8b%e5%ba%8f%e7%8c%bf%e4%b9%8b%e8%b7%af/javaweb/jspservlet">jsp/servlet</a>
|
||||
</li>
|
||||
</ul>
|
||||
</li>{% endcomment %}
|
||||
</ul>
|
||||
{% endif %}
|
||||
</li>
|
||||
|
||||
|
||||
Loading…
Reference in new issue