python实现qq登录_在django中实现QQ登录
在服務(wù)器端做qq登錄的流程:
1.放置QQ登錄按鈕,這個去QQ的網(wǎng)站上下,把這個按鈕的連接指向
https://graph.qq.com/oauth2.0/authorize?response_type=code&
client_id=[YOUR_APPID]&redirect_uri=[YOUR_REDIRECT_URI]&scope=
[THE_SCOPE],也可以先指向自己的網(wǎng)站,然后再重定向過去,這樣可以避免APPID暴露;
2.在上面連接的redirect_uri的處理函數(shù)中獲取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可以調(diào)用騰訊提供的其他API了。
那么對應(yīng)于django的web服務(wù)端,應(yīng)該怎么操作呢,步驟如下:
1.在QQ按鈕的請求地址進行重定向到qq那邊;
2.在對應(yīng)的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構(gòu)造請求獲取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.根據(jù)網(wǎng)站自己的賬戶規(guī)則,提示用戶
注冊本站的用戶名,郵箱號等(密碼可以不要),然后再數(shù)據(jù)庫中增加此賬號(如果你嫌麻煩,可以程序隨機生成一個賬號,不需要用戶填寫信息),再另一個表中
記錄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)
創(chuàng)建用戶,并與qq賬號關(guān)聯(lián)
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.至此,就可以調(diào)用qq提供的其他API了;
7.如果用戶沒有注銷,下
次登錄,直接根據(jù)cookie取session中的username,
openid,access_token,token_timestamp等數(shù)據(jù),根據(jù)token_timestamp判斷是否過期,如果過期,再重復(fù)步
驟1-3,并在session中更新access_token,token_timestamp;如果沒有過期,則就當(dāng)已經(jīng)登錄的正常用戶處理,可以直接
調(diào)用qq提供的API
8.如果用戶注銷,下次登錄,則直接重復(fù)1-4,根據(jù)openid反查出username等,存入session.
最后再說下調(diào)試,由于qq的key跟id都需要用域名去申請,并且傳遞的redirect_url也必須是這個域名的,所以在調(diào)試的時候,可以將自己的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
分類:互聯(lián)網(wǎng)
評論
總結(jié)
以上是生活随笔為你收集整理的python实现qq登录_在django中实现QQ登录的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 造轮子是什么意思_程序员发文质疑阿里天启
- 下一篇: websocket python爬虫_p