getting google oauth to work with flask, react, postgresql. keep getting internal server error and cors errors

Viewed 409

I'm trying to get google oauth to work with flask and react. When I run the server and try to log in, the google sign-in window pops up and immediately closes down and I get an internal server error. in my flask terminal I get this error: raise MissingCodeError("Missing code parameter in response.") oauthlib.oauth2.rfc6749.errors.MissingCodeError: (missing_code) Missing code parameter in response.

Any thoughts?

app.py

  @app.route('/login', methods=['POST'])
  @cross_origin()
  def login():
  google_provider = get_google_provider()
  auth_endpoint = google_provider["authorization_endpoint"]

  request_uri = client.prepare_request_uri(
      authorization_endpoint,
      redirect_uri=request.base_url + "/callback",
      scope=["openid", "email", "profile"]
  )

  return redirect(request_uri)

  @app.route('/login/callback', methods=['GET', 'POST'])
@cross_origin()
def login_callback():
  code = request.json.get("access token")
  print("**************")
  # print(list(request.args.keys()))
  print(request.json)
  print("**************")
  token, headers, body = client.prepare_token_request(
  token_endpoint,
  code=code,
  authorization_response=request.url,
  redirect_url=request.base_url
  )
  token_response = requests.post(
      token_url,
      headers=headers,
      data=body,
      auth=(GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET)
  )

  client.parse_request_body_response(json.dumps(token_response.json()))

  userinfo_endpoint = google_provider["userinfo_endpoint"]
  uri, headers, body = client.add_token(userinfo_endpoint)
  userinfo_response = request.get(uri, headers=headers, data=body)

  if userinfo_response.json().get("email_verified"):
      unique_id = userinfo_response.json()["sub"]
      user_email = userinfo_response.json()["email"]
      user_picture = userinfo_response.json()["picture"]
      user_name = userinfo_response.json()["given_name"]
      user_member_since = datetime.today().strftime('%Y-%m-%d')
  else:
      print("User email not available or not verified by Google")

  user = User(id=unique_id, name=user_name, email=user_email, picture=user_picture,     member_since=user_member_since)

  if not User.get(unique_id):
      User.create(unique_id, user_name, user_email, user_picture, user_member_since)
      login_user(user)
      redirect(url_for("/new-user-form"))
app.js
  googleResponse = (response) => {
const tokenBlob = new Blob([JSON.stringify({access_token: response.accessToken}, null, 2)], {type: 'application/json'});
const options = {
  method: 'POST',
  body: tokenBlob,
  mode: 'cors',
  cache: 'default'
}
fetch(`${BASE_URL}/login/callback`, options).then(r => {
  if (r.headers.get('Content-Type') === 'text/html; charset=utf-8') {
    console.log('error')
    return 
  }
  const token = r.headers.get('x-auth-token')
  r.json().then(user => {
    if (token) {
      this.setState({isAuthenticated: true, user, token, message: `${user.name}`})
      console.log(token)
    }
  });
 })
}

onFailure = (error) => {
  alert(error.data)
} 

 <Route path='/login'>
          <GoogleLogin
            clientId={config.GOOGLE_CLIENT_ID}
            buttonText="Login"
            onSuccess={this.googleResponse}
            onFailure={this.onFailure}
          />
0 Answers
Related