python实现qq登录_在django中实现QQ登录

在服务器端做qq登录的流程:

1.放置QQ登录按钮,这个去QQ的网站上下,把这个按钮的连接指向

https://graph.qq.com/oauth2.0/authorize?response_type=code&

client_id=[YOUR_APPID]&redirect_uri=[YOUR_REDIRECT_URI]&scope=

[THE_SCOPE],也可以先指向自己的网站,然后再重定向过去,这样可以避免APPID暴露;

2.在上面连接的redirect_uri的处理函数中获取code;

3.

利用此code向https://graph.qq.com/oauth2.0

/token?grant_type=authorization_code&client_id=[YOUR_APP_ID]&

client_secret=[YOUR_APP_Key]&code=[The_AUTHORIZATION_CODE]&

state=[The_CLIENT_STATE]&redirect_uri=[YOUR_REDIRECT_URI]中请求

access_token,

4.得到返回的access_token后,再向https://graph.qq.com/oauth2.0/me?access_token=YOUR_ACCESS_TOKEN请求获取openid,

5.最后利用access_token与openid可以调用腾讯提供的其他API了。

那么对应于django的web服务端,应该怎么操作呢,步骤如下:

1.在QQ按钮的请求地址进行重定向到qq那边;

2.在对应的redirect_uri中进行处理,获取变量code的值;

#生成请求code的url

def get_code_url(self, crsf_token):

auth_url = '%s?%s'%(self.code_url, urllib.urlencode({

'response_type': 'code',

'client_id': self.appid,

'redirect_uri': self.redirect_url,

'scope': self.scope,

'state': crsf_token,

}))

return auth_url

#解析获取code

def get_code(self, request):

return request.REQUEST.get('code')

3.用urllib2库向qq请求access_token,获取返回的access_token;

def get_token_url(self, code):

token_url = '%s?%s'%(self.token_url, urllib.urlencode({

'grant_type': 'authorization_code',

'client_id': self.appid,

'client_secret': self.appkey,

'code': code,

'redirect_uri': self.redirect_url,

}))

return token_url

def get_token(self, code):

token_url = self.get_token_url(code)

req = urllib2.Request(token_url)

resp = urllib2.urlopen(req)

content = resp.read()

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

return access_token

4.然后再用urllib2库,access_token构造请求获取openid;

def get_openid_url(self, token):

openid_url = '%s?%s'%(self.openid_url, urllib.urlencode({

'access_token': token,

}))

return openid_url

def get_openid(self, token):

openid_url = self.get_openid_url(token)

req = urllib2.Request(openid_url)

resp = urllib2.urlopen(req)

content = resp.read()

content = content[content.find('(')+1:content.rfind(')')]

data = simplejson.loads(content)

return data.get('openid')

5.根据网站自己的账户规则,提示用户

注册本站的用户名,邮箱号等(密码可以不要),然后再数据库中增加此账号(如果你嫌麻烦,可以程序随机生成一个账号,不需要用户填写信息),再另一个表中

记录openid,外键指向刚才的账号,同时将username,openid,access_token,token_timestamp记入

session中。

新表的model如下:

class Company(models.Model):

company = models.CharField('company', max_length=20)

def __unicode__(self):

return self.company.decode('utf8')

class OpenId(models.Model):

user = models.ForeignKey(User, verbose_name='用户')

company = models.ForeignKey(Company, verbose_name='公司')

openid = models.CharField('openid', max_length=100)

def __unicode__(self):

return u'%s, %s'%(self.user.username, self.company)

创建用户,并与qq账号关联

def save(self, request):

username = self.cleaned_data.get("username")

email = self.cleaned_data["email"].strip().lower()

openid = request.session.get('openid')

company = request.session.get('company')

company = Company.objects.get(company__iexact=company)

if not (openid and company):

return None

new_user = self.create_user(username)

#EmailAddress.objects.add_email(new_user, email)

EmailAddress(user=new_user, email=email, verified=True, primary=True).save()

#OpenId.objects.add_openid(new_user, openid, company)

OpenId(user=new_user, openid=openid, company=company).save()

return new_user

6.至此,就可以调用qq提供的其他API了;

7.如果用户没有注销,下

次登录,直接根据cookie取session中的username,

openid,access_token,token_timestamp等数据,根据token_timestamp判断是否过期,如果过期,再重复步

骤1-3,并在session中更新access_token,token_timestamp;如果没有过期,则就当已经登录的正常用户处理,可以直接

调用qq提供的API

8.如果用户注销,下次登录,则直接重复1-4,根据openid反查出username等,存入session.

最后再说下调试,由于qq的key跟id都需要用域名去申请,并且传递的redirect_url也必须是这个域名的,所以在调试的时候,可以将自己的PC的host文件修改了,一般路径为C:\Windows\System32\drivers\etc\host,大概修改如下(请注意替换你自己的域名):

192.168.1.63 www.mydomain.com

192.168.1.63 mydomain.com

分享到:

2012-05-26 14:58

浏览 1980

分类:互联网

评论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值