djano实现qq一键登录

#在login登录url下留出qq登录url
#eg:www.323.com/login?type=qq

tp = request.GET.get('type',None)
if tp:
    code_url = 'https://graph.qq.com/oauth2.0/authorize'
    parm = {
          'response_type':'code',
            'client_id':'你的appid',
            'redirect_uri':'www.323.com/qq',
            'state':'test'
    }
    auth_url = '%s?%s'%(code_url, urlencode(parm))
    return HttpResponseRedirect(auth_url)
else:
    return render(request, 'login.html', locals())


#其中redirect_uri为回调url,qq服务器收到登录请求后调用你的后台实现
#www.323.com/qq  指向如下实现

#流程如下:
#1.www.323.com/login?type=qq
#2.--->跳转qq登录页面
#3.--->qq调用后台www.323.com/qq
#4.--->映射处理登录验证
#qq = QQ(^$#%%$)
#access_token = qq.get_access_token()
#openid = qq.get_openid(access_token)
#user_info = qq.get_userinfo(access_token,openid) #返回字典
#5.保持用户信息到本地数据库
#成功登录后跳转到登录前页面


#QQ登录
#token_url = 'https://graph.qq.com/oauth2.0/token'
#auth_url = 'https://graph.qq.com/oauth2.0/me'    
class QQ(object):   
    def __init__(self,appid,appkey,token_url,auth_url,user_info_url,redirect_uri,code,state):
        self.appid=appid
        self.appkey=appkey
        self.token_url=token_url
        self.auth_url=auth_url
        self.redirect_uri=redirect_uri
        self.code=code
        self.state=state
        self.user_info_url = user_info_url

    #获取access_token
    def get_access_token(self):
        parm = {
              'grant_type':'authorization_code',
                'client_id':self.appid,
                'client_secret':self.appkey,
                'redirect_uri':self.redirect_uri,
                'code':self.code
        }           
        try:
            parm_token_url = '%s?%s'%(token_url, urlencode(parm))
            req = urllib2.Request(parm_token_url)
            resp = urllib2.urlopen(req)
            content = resp.read()

            access_token = urllib2.urlparse.parse_qs(content).get('access_token', [''])[0]
            return access_token

        except urllib2.URLError, e:
            print e.reason

    #获取OpenID 
    def get_openid(self,access_token):
        try:
            parm_auth_url = '%s?%s'%(self.auth_url, urlencode({'access_token': access_token,}))
            req = urllib2.Request(parm_auth_url)
            resp = urllib2.urlopen(req)
            content = resp.read()
            content = content[content.find('(')+1:content.rfind(')')]
            data = json.loads(content)
            openid = data.get('openid')         
            return openid

        except urllib2.URLError, e:
            print e.reason


    #获取uerinfo 
    def get_userinfo(self,access_token,openid):
        parm = {
        'access_token':access_token,
        'oauth_consumer_key':self.appid,
        'openid':openid              
         }    
        try:
            parm_user_info_url = '%s?%s'%(self.user_info_url, urlencode(parm))
            req = urllib2.Request(parm_user_info_url)
            resp = urllib2.urlopen(req)
            content = resp.read()
            user_info = json.loads(content)
            return user_info
        except urllib2.URLError, e:
            print e.reason

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值