Github : 官方文档:https://developer.github.com/v3/oauth/
中文资料:转自http://www.open-open.com/lib/view/open1416812717570.html 以防丢失
用python-social-auth包的流程和以下流程不同,采用的是不同的api,登陆成功后直接返回uri地址,用github时不会返回code,结果不同。 至于原因不知道。
用github登录,oauth开发
最近做的oj项目的网站子项目中要使用到“用github登录”这一功能,也就是oauth,于是研究了一番。
github的oauth验证的过程如下:
用户访问登录验证接入口
https://github.com/login/oauth/authorize?client_id=xxxxxxxxxxxxxxxxxx&scope=user,public_repo
其中client_id由开发者在github网站上申请,无限制。
申请成功后,获取client_id和client_secret
用户访问上面的url之后,github会让其跳转到你预定的url,并且带上code参数,例如
然后,开发者可以通过code,client_id以及client_secret这三个参数获取用户的access_token即用户身份标识,请求如下
这个请求将会返回如下内容
access_token=xxxxxxxxxxxxxxxxxxxxxxxxx&scope=public_repo%2Cuser&token_type=bearer
有了access_token之后,只需要通过如下请求就可以获取用户信息
https://api.github.com/user?access_token=xxxxxxxxxxxxxxxxxxxxxxxxx
返回的信息将会是json格式。注意整个请求过程中都是使用GET请求。只要理解了oauth验证过程,如此就很容易编程实现了。
最后,附上我自己用golang实现的github的oauth验证库https://github.com/gogather/oauth 。
源代码:python2.7 django views.py
from django.http import HttpResponse
from django.conf import settings
import urllib
import json
import urllib2
import re
def printLog(text):
f = open("/data/wumengqiang/mytest/authDemo/githubAuth/log.ini",'w')
f.write(str(text))
f.close()
def loginView(request):
return render(request,'githubAuth/login.html')
def githubCallbackView(request):
code = request.GET.get('code')
url ="https://github.com/login/oauth/access_token?client_id=%s&client_secret=%s&code=%s"% (settings.SOCIAL_AUTH_GITHUB_KEY,settings.SOCIAL_AUTH_GITHUB_SECRET,code) # 通过get url获取access_token
req = urllib2.urlopen(url)
html = str(req.read()) # 返回来的是一个文件 read()读取文件所有信息
printLog(html)
if re.match("error",html): # 如果开头是error:
return render(request, 'githubAuth/login.html') # login again
elif re.match("access_token",html): # 如果开头是access_token
html = re.split('[=&]',html) # split方法分开来获取token
printLog(html)
html = html[1] # token所在位置
printLog(str(html))
url = "https://api.github.com/user?access_token=%s"%html
req = urllib2.urlopen(url) # 返回来的是json格式
result = json.load(req)
printLog(result)
result = dict(result)
return render(request,'githubAuth/welcome.html',{"result":result,"type":isinstance(result,dict)})