def weiboLogin(request): # TODO: bug 目前还有错,不知道是哪儿的原因: # 用WeBless和新闻追踪007可以正常登录,但是用zzy和幸运女神的帐号登录就没有user_id!!! signed_request = request.POST.get('signed_request') # signed_request传到python这边, 数据结构是一个字符串型的list if isinstance(signed_request, list): signed_request = signed_request[0] encoded_sig, payload = signed_request.split(".", 2) # 余数2, 那么需要补一个= payload = str(payload) if len(payload) % 3 == 2: payload += '=' # 余数1, 那么需要补两个= if len(payload) % 3 == 1: payload += '==' # urlsafe_b64decode() Decode string s using a URL-safe alphabet, # which substitutes - instead of + and _ instead of / in the standard Base64 alphabet. # 得到data data = simplejson.loads(base64.urlsafe_b64decode(payload)) # 得到sig encoded_sig = str(encoded_sig) if len(encoded_sig) % 3 == 2: encoded_sig += '=' if len(encoded_sig) % 3 == 1: encoded_sig += '==' sig = base64.urlsafe_b64decode(encoded_sig) try: user_id = data['user_id'] oauth_token = data['oauth_token'] expires = data['expires'] except: print '认证错误,这个错误还未解决!!!' if _DEBUG: print 'signed_request: ', signed_request print 'data: ', data print user_id # #判断用户是否已经登录过(第一次登录会自动帮用户注册) try: _account = Account.objects.get(weiboId=user_id) except: print 'create new Account for:' + str(user_id) _weibo = weiboAPI(oauth_token, expires, user_id) _account = dbop.get_or_create_account_from_weibo(_weibo.getUserInfo()) # # TODO: 如何实现用户自动登录?? request.session['user'] = _account.user return HttpResponseRedirect('/home/')
def weibo_callback(request): # 获取code code = request.GET.get('code') # 构建微博对象 _wb = weiboAPI() _r = _wb.client.request_access_token(code) access_token = _r.access_token expires_in = _r.expires_in u_id = _r.uid _wb.client.set_access_token(access_token, expires_in) uinfo = _wb.getUserInfo(uid=u_id) # 保存授权信息 _oauth = dbop.create_or_update_weibo_auth(u_id=u_id, access_token=access_token, expires_in=expires_in) _account = dbop.get_or_create_account_from_weibo(uinfo) _account.oauth = _oauth _account.save() _account.user.backend = 'django.contrib.auth.backends.ModelBackend' auth_login(request, _account.user) return HttpResponseRedirect('/home/')