文档章节

记录Google+ oauth验证登陆

 以手指天
发布于 2015/12/09 11:44
字数 760
阅读 99
收藏 0
import urllib2
import urllib
import json

# google+的oauth服务配置,数据来源于google开发控制台
CLIENT_ID = '238181135422-8mkomb3ukrgr94vj1cqhhj2huphckndn.apps.googleusercontent.com'
CLIENT_SECRET = 'ESwmtjGXobmwjXzWXgJDkDNV'

def request_code(redirect_uri, state):
    """
    @attention: 请求google+的code码,返回用户授权地址
    @param client_id: 客户端ID
    @param redirect_uri: 验证后google服务器请求的地址,需要在google开发者控制台设置
    @param state: 验证字符串
    @note: 
    oauth参考地址: http://wiki.jikexueyuan.com/project/google-oauth-2/web-apps.html
    开发者控制台地址: https://console.developers.google.com/home
  【请求参数】
    >> response_type(响应类型): 
    参考值: code
    描述: 决定 Google OAuth 2.0 端点是否要返回授权码。 对于 Web 服务器应用程序,参数应该使用 code
    
    >> client_id(客户端 ID):
    参考值: 你从开发者控制台处获得的客户端 ID,例如238181135422-8mkomb3ukrgr94vj1cqhhj2huphckndn.apps.googleusercontent.com
    描述: 确定是哪个客户端正在发出请求。传过去的这个参数值必须要与开发者控制台里显示的完全一致。
    
    >> redirect_uri (重定向 URI)
    参考值: 127.0.0.1:8000/login/,必须在控制台中设置,此处google为字符串验证,不需要公网地址
    描述: 决定回应(Response)会发向哪里。这个参数的值必须和谷歌开发者控制台为这个工程所显示的值的其中一个完全一致(包括完整的 HTTP 或 HTTPS 格式、大小写、和末尾的'/'符号)。
    
    >> scope (域)
    参考值: profile openid email
    描述: 确认您的应用程序请求的谷歌 API 访问权; profile(基本,可以获取用户基本信息)/email(邮件权限,可以获取用户邮箱信息)/openid(用户openid验证??)
    
    >> state (状态)
    参考值: 任意字符串,例如 hello world
    描述: 在redirect_uri地址被google主动请求时会加上此内容,用于服务器本身验证
    """
    req_url = "https://accounts.google.com/o/oauth2/auth"
    query = {}
    query["response_type"] = "code"
    query["client_id"] = CLIENT_ID
    query["scope"] = "profile openid email"
    query["state"] = state
    query["redirect_uri"] = redirect_uri
    # 注意:这里的参数以GET形式传输
    get_info = urllib.urlencode(query)
    return "%s?%s" % (req_url, get_info)

def request_token_by_code(code, redirect_uri):
    """
    @attention: 用code换取token,返回token值
    @param code: 上面请求的redirect_uri中GET信息中携带
    @param client_id: 客户端ID(从开发者控制台处获得)
    @param client_secret: 客户端 secret(从开发者控制台处获得)
    @param redirect_uri: 必须有效,没搞懂作用,这里并没有重定向,待验证
    """
    base_url = "https://accounts.google.com/o/oauth2/token"
    form = {}
    form["client_id"] = CLIENT_ID
    form["grant_type"] = "authorization_code"
    form["client_secret"] = CLIENT_SECRET
    form["redirect_uri"] = redirect_uri
    form["code"] = code
    form["scope"] = ""

    post_info = urllib.urlencode(form)
    try:
        # 注意:这里的参数以POST形式传输
        req = urllib2.urlopen(base_url, post_info)
        response = json.loads(req.read())
        return response.get("access_token")
    except:
        return ""

def request_user_info(token):
    """
    @attention: 请求用户信息,返回用户名(暂时按中国姓名顺序返回)和邮箱
    @param token: request_token_by_code获取的access_token值,注意有时间限制
    @note: 获取google其他接口可以参考 https://developers.google.com/oauthplayground/
    """
    base_url = "https://www.googleapis.com/oauth2/v2/userinfo"
    query = {}
    query["access_token"] = token
    get_info = urllib.urlencode(query)
    try:
        req_url = "%s?%s" % (base_url, get_info)
        # 注意:这里的参数以GET形式传输
        req = urllib2.urlopen(req_url)
        response = json.loads(req.read())
        return "%s%s" % (response.get("given_name"), response.get("family_name")), response.get("email")
    except:
        return "", ""

def request_refresh_token():
    """
    @attention: 再次获取token,
    @note: 用于token超时的接口,使用时再补充代码
    """
    return ""


© 著作权归作者所有

粉丝 0
博文 8
码字总数 5343
作品 0
成都
程序员
私信 提问
不要用JWT替代session管理(上):全面了解Token,JWT,OAuth,SAML,SSO

通常为了弄清楚一个概念,我们需要掌握十个概念。在判断 JWT (Json Web Token) 是否能代替 session 管理之前,我们要了解什么是 token,以及 access token 和 refresh token 的区别;了解什么...

李熠
2018/07/03
0
0
基于 OAuth 安全协议的 Java 应用编程

OAuth 是由 Blaine Cook、Chris Messina、Larry Halff 及 David Recordon 共同发起的,目的在于为 API 访问授权提供一个安全、开放的标准。 基于 OAuth 认证授权具有以下特点: 安全。OAuth...

红薯
2010/03/19
3.2K
6
Google Apps API 开始支持 OAuth 验证

Google Apps管理员以前必须通过ClientLogin验证来通过发送请求到Google Apps API来使用用户名和密码登录,而这种跨网站的密码共享可能有潜在的安全隐患,于是今天Google Apps API开始支持OAu...

红薯
2010/09/28
950
6
基于 OAuth 安全协议的 Java 应用编程

OAuth 简介 OAuth 是由 Blaine Cook、Chris Messina、Larry Halff 及 David Recordon 共同发起的,目的在于为 API 访问授权提供一个安全、开放的标准。 基于 OAuth 认证授权具有以下特点: ...

长平狐
2012/11/12
103
0
Google OAuth 简单入门与使用

MeetTea需要能够通过Google API来获取用户的用户名和头像,效果就像google.org.cn的排队系统。 那么如何实现呢? 通过几天的学习、研究,下载google的源码,最后了解了原理并制作了一个简单的...

红薯
2011/12/21
740
1

没有更多内容

加载失败,请刷新页面

加载更多

OpenStack 简介和几种安装方式总结

OpenStack :是一个由NASA和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenSta...

小海bug
昨天
6
0
DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
昨天
6
0
数据库中间件MyCat

什么是MyCat? 查看官网的介绍是这样说的 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务、ACID、可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵...

沉浮_
昨天
7
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
昨天
9
0
常用物流快递单号查询接口种类及对接方法

目前快递查询接口有两种方式可以对接,一是和顺丰、圆通、中通、天天、韵达、德邦这些快递公司一一对接接口,二是和快递鸟这样第三方集成接口一次性对接多家常用快递。第一种耗费时间长,但是...

程序的小猿
昨天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部