• Oauth github 参考链接


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

  • 相关阅读:
    Linux系统IP地址
    系统网络概述
    系统内存和CPU管理、监控
    系统磁盘资源
    Linux与DOS的常用命令比较
    傻瓜式破解linux--rootpassword
    【iOS】彩虹渐变色 的 Swift 实现
    Spring与Hibernate整合中,使用OpenSessionInViewFilter后出现sessionFactory未注入问题
    OpenCV Haar AdaBoost源代码改进(比EMCV快6倍)
    【Hibernate步步为营】--双向关联一对一映射具体解释(一)
  • 原文地址:https://www.cnblogs.com/lifeisshort/p/4676167.html
Copyright © 2020-2023  润新知