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
分类:互联网
评论
python实现qq登录_在django中实现QQ登录相关推荐
- 【原创】去掉微信登录二维码中的微信登录几个字的解决方法
去掉微信登录二维码中的微信登录几个字的解决方法 通过分析,原来微信自己有参数可以去掉, 解决方法,如下: 链接中加上 &popup=0&href=https%3A%2F%2Fsta.g ...
- python 邮箱验证_在Django中进行用户注册和邮箱验证的方法
本文主要介绍我在利用Django写文章时,采用的注册方法.首先说一下整体逻辑思路: •处理用户注册数据, •产生token,生成验证URL, •发送验证邮件, •用户登录网址,进行验证, •验证处理. ...
- python的目的及应用_python Django中的apps.py的目的是什么_python_脚本之家
This question has been asked earlier: 07000 Application configuration objects store metadata for an ...
- php第三方登录代码,thinkPHP5项目中实现QQ第三方登录功能
本文实例讲述了thinkPHP5项目中实现QQ第三方登录功能.分享给大家供大家参考,具体如下: 最近用thinkPHP 5框架做了一个婚纱店的项目,在开发过程中需要用到第三方登录,腾讯官方给的案例是几 ...
- openmvide使用需要什么插件_在Django中使用Webpack:再也不需要插件了!
这篇文章将会学习如何在Django中以最小的代价安装Webpack.这个问题常规的解决办法是使用django-webpack-loader,但是在我看来这种方式代价太大.这篇文章的目的是提供一个在Dj ...
- python嵌入到程序_在应用中嵌入Python:转
前面的章节讨论如何扩展Python,如何生成适合的C库等.不过还有另一种情况:通过将Python嵌入C/C++应用以扩展程序的功能.Python嵌入实现了一些使用Python更合适的功能.这可以有很多 ...
- 以下选项中不是python数据类型的是_以下选项中,是Python数据类型的是()。
以下选项中,是Python数据类型的是(). 在Excel中,函数SUM(A1:A4)等价于()A:SUM(A1/A4)B:SUM(A1+A2+A3+A4)C:SUM(A1:A4)D:SUM(A1A2 ...
- python 会议室预约系统_基于django的会议室预订系统
欢迎登录会议室预订系统 {% csrf_token %} 用户名 密码 登录 varhandlerPopup= function(captchaObj) {//成功的回调 captchaObj.onS ...
- 计算机删除qq用户信息吗,电脑中删除qq资料生日性别的方法
默认情况下,用户们首次注册QQ,有些资料是都是为空的(比如血型),不过在设置完成后就不能重新设为空白,而有些选项则是无法选择为空的(比如性别.生日).那么,我们要如何清空QQ资料呢?接下来,小编给大家 ...
最新文章
- 在医学图像分析中使用ICP算法进行点云配准
- Optional 详解 Java
- Effective Java之考虑自定义的序列化模式(七十五)
- 云原生基础架构的最佳状态,就是没有架构?
- java case switch面试_Java基础篇——Java中switch case语句用法及注意事项面试题9期
- Android setBackgroundResource无反应?
- python画图颜色随机_python随机颜色
- 傅里叶变换性质证明卷积_傅里叶变换2.系统属性和卷积公式的推导
- python游戏可以买什么书_游戏通关,电影看完,是时候用Python整理下电子书了
- 软件测试从业者年纪大了以后该怎么办?我能继续测试!可以自救...
- 男人到中年,活得不如一条狗
- 安卓 app 本地升级下载后自动安装(小米手机安装包解析失败问题)
- 一个公司有m名推销员,他们都推销n种不同的产品。其中m>=l;m<=100,n>=l,n<=10。每天,每个推销员都要为售出的每一种产品交上来一个卡片。
- 图片上传到阿里云OSS
- WIN10设置自启动脚本
- 旅行售货商模型matlab,旅行售货员问题的几种解决方案.doc
- [刷题]leetcode\704_二分查找
- php工作便签,便签本的正确使用方法
- 华为OD机试真题 C++ 实现【异常的打卡记录】【2022.11 Q4 新题】
- 【Python】Python的单双引号