Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Google API OAuth 2 sign in something went wrong with new OAuth 2 client

I am trying to make a discord bot that interacts with the google API specifically the Google Classroom API, so therefore I made a new project from the google console and created a new OAuth client for a web application. I enabled the Classroom API as well and selected all the scopes that I wanted to use:

['https://www.googleapis.com/auth/classroom.course-work.readonly',
 'https://www.googleapis.com/auth/classroom.student-submissions.students.readonly',
 'https://www.googleapis.com/auth/classroom.courses.readonly']

Then I set up my python programme using Google's example (At first I wrote my own using the documentation but got the same result). When I run the example code everything goes fine, it opens the browser and asks me to select my account, I select my school account and when it loads and I expect an Authorization screen to pup up to ask me if I allow the requested data it says something went wrong with no error messages at all. I have downloaded the correct credentials.json folder from the google dashboard and used it in my programme.

I will also provide the simplified code that I wrote maybe it's a problem there.

import pickle
import os
from google_auth_oauthlib.flow import Flow, InstalledAppFlow
from googleapiclient.discovery import build
from google.auth.transport.requests import Request


CLIENTSECRETPATH = "credentials.json"
APISERVICENAME = "classroom"
APIVERSION = "v1"
SCOPES = ['https://www.googleapis.com/auth/classroom.course-work.readonly', 'https://www.googleapis.com/auth/classroom.student-submissions.students.readonly', 'https://www.googleapis.com/auth/classroom.courses.readonly']

cred = None

if os.path.exists("toke.pickle"):
    with open("tiken.pickle", "rb") as token:
        cred = pickle.load(token)

if not cred or not cred.valid:
    if cred and cred.expired and cred.refresh_token:
        cred.refresh(Request())
    else:
        flow = InstalledAppFlow.from_client_secrets_file(CLIENTSECRETPATH, SCOPES)
        cred = flow.run_local_server()

    with open("token.pickle", "wb") as token:
        pickle.dump(cred, token)

try:
    service = build(APISERVICENAME, APIVERSION, credentials=cred)

except Exception as e:
    print(e)

Edit: I tried to change some settings on the google console and randomly decided to click publish as the project was still in the testing state, after doing this I could sign in with no errors. But that still doesn't explain why it didn't work when it was in a testing status, I added my school e-mail address to the test users list and made sure I did everything right for testing.

something went wrong screenshot

like image 324
Hein Gertenbach Avatar asked Jan 21 '21 05:01

Hein Gertenbach


People also ask

How do I fix OAuth error?

When a user tries to login after the session id is expired, the system throws the OAuth error. Solution: Typically, clearing the browser or device cache fixes the problem.

How to connect to Google API using OAuth?

To begin, obtain OAuth 2.0 client credentials from the Google API Console. Then your client application requests an access token from the Google Authorization Server, extracts a token from the response, and sends the token to the Google API that you want to access.

What types of OAuth flows are supported by Google APIs?

Google APIs support OAuth 2.0 flows for different types of client applications. In all of these flows, the client application requests an access token that is associated with only your client application and the owner of the protected data being accessed.

How do I get OAuth credentials from Google?

Obtain OAuth 2.0 credentials from the Google API Console. Visit the Google API Console to obtain OAuth 2.0 credentials such as a client ID and client secret that are known to both Google and your application. The set of values varies based on what type of application you are building.

What version of OAuth does Google use?

Note: Use of Google's implementation of OAuth 2.0 is governed by the OAuth 2.0 Policies. Google APIs use the OAuth 2.0 protocol for authentication and authorization.


Video Answer


2 Answers

I can't reply to the above issue (need more reputation) but can confirm that I am seeing the same behaviour. What makes it even more weird is that the issue only presents itself when the user attempts to perform the OAuth integration with an account that is already signed in. The user is presented with a generic “Sorry, something went wrong there. Try again.” error before even seeing the required scopes list. However if the user is not logged into their account, and logs in as part of the OAuth integration, then there is no error and integration can be completed successfully. The fact that this issue doesn't affect users who aren't logged in shows that the setup (callback API, credentials.json, etc.) is all correct. I believe this issue has been introduced in the last month or so.

like image 116
Alex Avatar answered Oct 21 '22 05:10

Alex


I am seeing a similar Issue to Alex's post. Adding what I've seen so far in hopes to help debug.

When the OAuth flow is initiated in a session that has authenticated accounts (using the Account Picker), the Oauth flow fails with /unknownerror in the forward URL and the user is presented with the generic "Sorry, something went wrong there. Try again."

But, If the OAuth flow is initiated in a session where the User needs to sign-in to their Google account, the flow works as expected.

I do suspect this to be an Error with a Test App and Test Accounts. But hoping this will get fixed or to find some workaround.

I have found that the scopes have an affect as well. With basic scopes (profile,email) the error flow does not occur. But once you add another more restricted scope, the error flow returns.

like image 43
spaceMonkey Avatar answered Oct 21 '22 05:10

spaceMonkey