梦见世界

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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网站上申请,无限制。
用github登录,oauth开发
申请成功后,获取client_id和client_secret
用github登录,oauth开发

用户访问上面的url之后,github会让其跳转到你预定的url,并且带上code参数,例如

http://oj.duguying.net/oauth/github?code=xxxxxxxxxxxxxxxxxx 

然后,开发者可以通过code,client_id以及client_secret这三个参数获取用户的access_token即用户身份标识,请求如下

https://github.com/login/oauth/access_token?client_id=xxxxxxxxxxxxxxxxxxx&client_secret=xxxxxxxxxxxxxxxxx&code=xxxxxxxxxxxxxxxxxxx 

这个请求将会返回如下内容 

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)})

 

posted on 2015-07-25 16:46  梦见世界  阅读(692)  评论(1编辑  收藏  举报