在服务器端做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
分享到:
相关推荐
python-Django实现用户登录
今天由于工作需求,需要用Django实现单用户登录。大概意思就是跟QQ一样的效果,每个账号只能一个地方登录使用,限制账号的登录次数。由于用的是Django自带的认证,然后校验用户是否登录其实就是通过Session实现的。...
django+python+sqlite实现的简单登录注册功能的网页,运行环境为python+django
基于Django1.11.7实现酒店管理、适合毕业设计作品,使用Python3开发 项目描述:https://blog.csdn.net/qq_41741971/article/details/115796526
基于python框架django实现的个人博客管理系统包含前端+后台 运行环境 django1.10+python3+sublime text3+Navicat Premium+cmd命令 项目技术 django+python+sql+cmd+html+css+jquery 使用分页插件,jquery实现万年历...
使用qq登录的前提是已经在qq互联官网创建网站应用并获取到QQ互联中网站应用的APP ID和APP KEY。这篇文章主要介绍了Django项目中实现使用qq第三方登录功能,需要的朋友可以参考下
登录系统在我们的日常生活中随处可见,比如当我们使用QQ、微信等社交软件时,都需要先输入自己的账号密码进行登录,本文博主将带着大家用Python的Django实现一个简单的登录系统。 项目框架 Django 实验内容 安装...
本资源里面有对应系统,所需要的python环境,sql脚本,部署的步骤,系统截图; 当毕设不成问题 ...普通用户可以添加需要维修的东西,对小区的信息进行查看,可以在首页查看到统计图,对以可视化的形式进行查看
通过目前最为广泛使用的django框架来实现一个即时聊天系统。django和channels的版本都已升级到2.0+,该源代码全部基于新版本实现。
本项目集成注册,登录,购物,购物车,评论,搜索,第三方qq登录,微信登录,手机号登录,支付宝支付等功能。 基于Django的电子商城系统是一个使用Python语言和Django框架开发的网上购物平台。以下是该系统的主要...
这是我开发的一个个人博客,将其解压,打开settings配置文件,修改自己的数据库配置和项目目录projectsdir。运行python manage.py runserver 0.0.0.0:80 然后打开浏览器,输入... 如有哪里不懂,请加我的qq 1186969412
Python+Django实现基于人脸识别的门禁管理系统源码+项目介绍 基于人脸识别的门禁管理系统 实现技术:(Python+Django+RESTframework+JsonWebToken+Redis+Dlib) 该项目为宿舍门禁系统管理,并额外加入宿舍管理、水电费...
该部分代码包括java上位机以及django程序,不包含stm32下位机程序。资源介绍链接:https://blog.csdn.net/qq_41020634/article/details/102762734
管理人员可以添加机构,在对应的机构下增加不同的课程,可以添加试卷,添加课程资源供用户下载,可以查看用户的留言,可以查看用户的分数; 用户登录系统,可以考试,可以查看自己的分数,这个分数是后台自动算出来...
## 采用最新Python环境和Django框架实现的一个学生教务选课系统。学生成员可以前台注册登录,登录后可以查询课程信息选课,查询自己的选课信息和成绩信息,修改个人信息。管理员登录后可以管理所有的注册学生信息,...
django实现多文件同时上例子
## 采用最新Python环境和Django框架实现的一个学生教务选课系统。学生成员可以前台注册登录,登录后可以查询课程信息选课,查询自己的选课信息和成绩信息,修改个人信息。管理员登录后可以管理所有的注册学生信息,...
使用Django框架实现班务管理系统,练手项目,清晰易懂,学生、教师、管理员三用户,学生功能包括登录、签到、公告强、成绩记录、请假、班费记录查看、班级活动申请。教师用户的功能包括请假信息批准、考勤统计、公告...