在服务器端做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登录相关推荐

  1. 【原创】去掉微信登录二维码中的微信登录几个字的解决方法

    去掉微信登录二维码中的微信登录几个字的解决方法 通过分析,原来微信自己有参数可以去掉, 解决方法,如下: 链接中加上 &popup=0&href=https%3A%2F%2Fsta.g ...

  2. python 邮箱验证_在Django中进行用户注册和邮箱验证的方法

    本文主要介绍我在利用Django写文章时,采用的注册方法.首先说一下整体逻辑思路: •处理用户注册数据, •产生token,生成验证URL, •发送验证邮件, •用户登录网址,进行验证, •验证处理. ...

  3. python的目的及应用_python Django中的apps.py的目的是什么_python_脚本之家

    This question has been asked earlier: 07000 Application configuration objects store metadata for an ...

  4. php第三方登录代码,thinkPHP5项目中实现QQ第三方登录功能

    本文实例讲述了thinkPHP5项目中实现QQ第三方登录功能.分享给大家供大家参考,具体如下: 最近用thinkPHP 5框架做了一个婚纱店的项目,在开发过程中需要用到第三方登录,腾讯官方给的案例是几 ...

  5. openmvide使用需要什么插件_在Django中使用Webpack:再也不需要插件了!

    这篇文章将会学习如何在Django中以最小的代价安装Webpack.这个问题常规的解决办法是使用django-webpack-loader,但是在我看来这种方式代价太大.这篇文章的目的是提供一个在Dj ...

  6. python嵌入到程序_在应用中嵌入Python:转

    前面的章节讨论如何扩展Python,如何生成适合的C库等.不过还有另一种情况:通过将Python嵌入C/C++应用以扩展程序的功能.Python嵌入实现了一些使用Python更合适的功能.这可以有很多 ...

  7. 以下选项中不是python数据类型的是_以下选项中,是Python数据类型的是()。

    以下选项中,是Python数据类型的是(). 在Excel中,函数SUM(A1:A4)等价于()A:SUM(A1/A4)B:SUM(A1+A2+A3+A4)C:SUM(A1:A4)D:SUM(A1A2 ...

  8. python 会议室预约系统_基于django的会议室预订系统

    欢迎登录会议室预订系统 {% csrf_token %} 用户名 密码 登录 varhandlerPopup= function(captchaObj) {//成功的回调 captchaObj.onS ...

  9. 计算机删除qq用户信息吗,电脑中删除qq资料生日性别的方法

    默认情况下,用户们首次注册QQ,有些资料是都是为空的(比如血型),不过在设置完成后就不能重新设为空白,而有些选项则是无法选择为空的(比如性别.生日).那么,我们要如何清空QQ资料呢?接下来,小编给大家 ...

最新文章

  1. 在医学图像分析中使用ICP算法进行点云配准
  2. Optional 详解 Java
  3. Effective Java之考虑自定义的序列化模式(七十五)
  4. 云原生基础架构的最佳状态,就是没有架构?
  5. java case switch面试_Java基础篇——Java中switch case语句用法及注意事项面试题9期
  6. Android setBackgroundResource无反应?
  7. python画图颜色随机_python随机颜色
  8. 傅里叶变换性质证明卷积_傅里叶变换2.系统属性和卷积公式的推导
  9. python游戏可以买什么书_游戏通关,电影看完,是时候用Python整理下电子书了
  10. 软件测试从业者年纪大了以后该怎么办?我能继续测试!可以自救...
  11. 男人到中年,活得不如一条狗
  12. 安卓 app 本地升级下载后自动安装(小米手机安装包解析失败问题)
  13. 一个公司有m名推销员,他们都推销n种不同的产品。其中m>=l;m<=100,n>=l,n<=10。每天,每个推销员都要为售出的每一种产品交上来一个卡片。
  14. 图片上传到阿里云OSS
  15. WIN10设置自启动脚本
  16. 旅行售货商模型matlab,旅行售货员问题的几种解决方案.doc
  17. [刷题]leetcode\704_二分查找
  18. php工作便签,便签本的正确使用方法
  19. 华为OD机试真题 C++ 实现【异常的打卡记录】【2022.11 Q4 新题】
  20. 【Python】Python的单双引号

热门文章

  1. 注册不到两年半Github标星39k+,吴恩达、李航老师的作品的笔记和代码实现
  2. 这个3月我有3场见面会,不知道你来不来?
  3. 程序员必须掌握的英语单词
  4. oracle rac理论知识
  5. 两大上市公司联手,打造智慧城市安防领域生态闭环
  6. velocity 遍历map
  7. 视觉平衡与物理平衡_设计中的视觉平衡
  8. 逆序数问题(归并排序,C++)
  9. ThreadLocal原理及用法详解
  10. linux Fedora35 grub2 改变启动顺序