SingeeKing
2017-11-06 16:04:19 +08:00
from .models import WeUser
from django.contrib.auth.models import User
class WechatOpenidAuth(object):
def get_user(self, user_id):
try:
return User.objects.get(id=user_id)
except User.DoesNotExist:
return None
def authenticate(self, openid=None):
weus = WeUser.objects.filter(openID=openid, available=True)
for weu in weus:
if not weu.user.has_perm('settings.is_admin'):
return weu.user
return None
def login(request):
code = request.GET.get('code')
next = request.GET.get('state', reverse('index'))
we_auth_base = WeChatOAuth(app_id=settings.WECHAT_APP_ID, secret=settings.WECHAT_APP_SECRET,
redirect_uri=request.build_absolute_uri(reverse('wechatLogin')),
scope='snsapi_base',
state=next)
if not code:
try:
authorize_url = we_auth_base.authorize_url
except Exception as e:
logger.error(e)
return redirect(reverse('login') + '?force=1')
return redirect(authorize_url)
try:
r = we_auth_base.fetch_access_token(code)
except Exception as e:
logger.error(e)
return redirect(reverse('login') + '?force=1')
if r.get('errcode'):
logger.error(r)
return redirect(reverse('login') + '?force=1')
open_id = r.get('openid')
if log_in_with_open_id(request, open_id):
messages.success(request, '登录成功')
return redirect(next)
else:
return redirect(reverse('login') + '?force=1')