`
zhouxi2010
  • 浏览: 50765 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

在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
分享到:
评论

相关推荐

    python-Django实现用户登录

    在登录过程中,视图会检查提交的表单数据,然后调用`authenticate`方法进行验证。一旦用户被成功认证,`login`方法会被用来设置用户的会话。同时,URL配置文件(urls.py)会将URL映射到这个视图,使得用户可以通过...

    django+python实现的web入门程序-注册登录功能-sqlite3数据库

    这个程序旨在帮助初学者理解如何在Django中实现用户注册和登录的核心功能。 【核心知识点】 1. Django框架:Django是Python的一款高级Web框架,它遵循模型-视图-控制器(MVC)架构模式,提供了丰富的功能,如ORM...

    Django项目中实现使用qq第三方登录功能

    在Django项目中实现使用QQ第三方登录功能,首先需要在QQ互联官网注册并创建一个网站应用,以获取网站应用的APP ID(应用ID)和APP KEY(应用密钥)。接下来,本文将介绍如何在Django项目中集成QQ登录,这包括建立...

    Django1.11.7 实现酒店管理

    基于Django1.11.7实现酒店管理、适合毕业设计作品,使用Python3开发 项目描述:https://blog.csdn.net/qq_41741971/article/details/115796526

    基于python框架django实现的个人博客管理系统包含前端+后台

    基于python框架django实现的个人博客管理系统包含前端+后台 运行环境 django1.10+python3+sublime text3+Navicat Premium+cmd命令 项目技术 django+python+sql+cmd+html+css+jquery 使用分页插件,jquery实现万年历...

    django实现文件上传并显示的简单例子

    以下就是使用Django实现这一功能的详细步骤。 1. **创建项目和应用** 首先,确保已经安装了Django。然后,创建一个新的Django项目和应用。在命令行中运行: ``` django-admin startproject myproject cd ...

    Python+django+channels实现websocket

    要使用Python和Django实现WebSocket,首先需要安装channels库,可以通过pip进行安装: ```bash pip install channels ``` 接着,我们需要配置Django项目以使用Channels。在`settings.py`中,添加`'channels'`到`...

    Django 2.0 官方中文文档

    中间件是 Django 的一种特殊组件,它们可以在请求和响应之间插入自定义逻辑,例如实现认证、日志记录、性能分析等功能。 8. **安全性(Security)** Django 2.0 强调安全,内置了防止 SQL 注入、跨站脚本攻击...

    基于django+html的用户登录验证系统

    登录系统在我们的日常生活中随处可见,比如当我们使用QQ、微信等社交软件时,都需要先输入自己的账号密码进行登录,本文博主将带着大家用Python的Django实现一个简单的登录系统。 项目框架 Django 实验内容 安装...

    Django框架 Django 2.1.7

    Django的数据库抽象层提供了数据库迁移工具,使得数据库结构的变更可以在多个环境中无缝同步,避免了手动迁移的繁琐工作。 6. **国际化和本地化** Django支持多语言应用,提供了翻译工具和机制,可以轻松地实现...

    python + django +admin 后台+mysql 实现 物业管理系统

    本资源里面有对应系统,所需要的python环境,sql脚本,部署的步骤,系统截图; 当毕设不成问题 ...普通用户可以添加需要维修的东西,对小区的信息进行查看,可以在首页查看到统计图,对以可视化的形式进行查看

    Django-1.8.2-中文文档

    在定义了模型之后,开发者需要在Django的`settings.py`文件中通过`INSTALLED_APPS`配置项来告诉Django框架使用这些模型。然后,可以通过`python manage.py makemigrations`和`python manage.py migrate`命令来生成...

    django layui表单加图片上传功能(Django,layui).zip

    在本文中,我们将深入探讨如何在Django框架中结合Layui实现图片上传功能。Layui是一款优秀的前端UI框架,而Django是Python后端开发的流行框架,两者结合可以构建出美观且功能强大的Web应用。以下是实现这一功能的...

    django实现登录时候输入密码错误5次锁定用户十分钟

    在Django中实现登录时密码错误5次锁定用户十分钟的功能,主要是为了增加系统的安全性,防止恶意尝试登录。以下是如何在Django中实现这一功能的详细步骤: 首先,我们需要自定义Django的用户模型。在Django中,我们...

    Django个人博客系统 课件

    在这个“Django个人博客系统”课程中,我们将深入探讨如何使用Django构建一个功能完善的个人博客平台。 首先,我们要了解Django的基本架构。Django的核心组件包括模型(Model)、视图(View)、模板(Template)和...

    django实现多文件同时上例子

    在Django框架中,实现多文件同时上传是一个常见的需求,特别是在构建支持用户上传附件或多媒体内容的Web应用时。这个例子将带你了解如何在Django中处理这样的功能。首先,我们需要理解Django的表单(Form)和模型...

    Django实战入门项目.rar

    3. **Django应用创建**:在项目中创建应用,比如`python manage.py startapp blog`,了解应用的结构和它与项目的关联。 4. **模型(Model)设计**:学习如何定义数据模型,例如在models.py文件中创建数据库表的类...

    Django实现单用户登录的方法示例

    通过以上步骤,我们可以有效地在Django应用中实现单用户登录功能。这种方式不仅能够提高系统的安全性,还能提升用户体验。希望本文能帮助你更好地理解并实现这一功能。 #### 六、参考资料 - [Django官方文档]...

    Django电商网站全代码

    在这个项目中,Django被用来处理HTTP请求、响应,以及管理数据库和视图逻辑。 2. **数据库搭建**:项目使用了Django的ORM(对象关系映射)来与数据库交互,可能使用的是SQLite或MySQL等数据库。ORM允许开发者用...

Global site tag (gtag.js) - Google Analytics