Ejemplo n.º 1
0
def g_callback(request):
    # parse the original url from the google+ redirect state param
    original_url = request.args.get("state", "")
    code = request.args["code"]

    # authenticate the passed code
    q = requests.post(
        "https://accounts.google.com/o/oauth2/token",
        data={
            "code": code,
            "client_id": G["client_id"],
            "client_secret": G["client_secret"],
            "redirect_uri": request.host_url + "login/callback/g",
            "grant_type": "authorization_code",
        },
    )

    if q.status_code != 200:
        stderr.write("Login error G+:\n    %s\n" % q.content)
        return redirect("/?msg=AUTH_ERROR")

    content = loads(q.content)
    access_token = content["access_token"]
    del content

    # get userinfo
    q = requests.get("https://www.googleapis.com/oauth2/v1/userinfo?access_token=" + access_token)
    content = loads(q.content)

    service_id = content["id"]

    # save userinfo by id
    u = User.save_g_data(request.session, service_id, fullname=content["name"], email=content["email"])
    u.img_url = content.get("picture")

    request.client_session["login"] = ["gmail", service_id]

    return redirect("/" + original_url)