记录Google+ oauth验证登陆

原创
2015/12/09 11:44
阅读数 215
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
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部