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)