gbiz123
gbiz123

Reputation: 158

Google OAuth error 400: redirect_uri_mismatch in Python

first time using OAuth here and I am stuck. I am building a web app that needs to make authorized calls to the YouTube Data API. I am testing the OAuth flow from my local computer.

I am stuck receiving Error 400: redirect_uri_mismatch when I try to run my Google OAuth flow in Python. The error occurs when I access the link generated by flow.run_console()

Here is my code:

os.environ["OAUTHLIB_INSECURE_TRANSPORT"] = "1"
client_secrets_file="./client_secret.json"
scopes = ["https://www.googleapis.com/auth/youtube.readonly"]
flow = google_auth_oauthlib.flow.InstalledAppFlow.from_client_secrets_file(
client_secrets_file, scopes)
flow.redirect_uri = "http://127.0.0.1:8080" # Authorized in my client ID
credentials = flow.run_console() 

This code returns the message:

Please visit this URL to authorize this application: ***google oauth url ***
Enter the authorization code:

Visiting the link results in the following error: URI mismatch error

I tried setting the Authorized Redirect URI in my OAuth Client ID to http://127.0.0.1:8080 since I am testing from my local machine. I also set flow.redirect_uri to http://127.0.0.1:8080 in Python. Using http://127.0.0.1:8080 is currently my only option since the front end has not been set up yet.

I expected the code to authorize my request, since the Authorized URI matches the redirect_uri. But I am still receiving the error.

I have had no issues running the flow from Google's OAuth Playground, if that means anything.

Any help is appreciated, thank you.

Upvotes: 1

Views: 1868

Answers (4)

gbiz123
gbiz123

Reputation: 158

Thanks for your help everyone. I was able to find a working solution for my issue from referencing this documentation: https://googleapis.github.io/google-api-python-client/docs/oauth.html

Here is my solution:

def get_subscribers(channel_id="Channel_id", 
        client_secrets_file="Client_secret_file", n=50):
    os.environ["OAUTHLIB_INSECURE_TRANSPORT"] = "1"
    flow = Flow.from_client_secrets_file(
            client_secrets_file, 
            scopes=["https://www.googleapis.com/auth/youtube.readonly"])
    flow.redirect_uri = "http://localhost"
    auth_url, __ = flow.authorization_url(prompt="consent")
    print('Please go to this URL: {}'.format(auth_url))
    code = input('Enter the authorization code: ')
    flow.fetch_token(code=code)
    youtube = googleapiclient.discovery.build(
        "youtube", "v3", credentials=flow.credentials
    )
    request = youtube.subscriptions().list(
        part="subscriberSnippet",
        forChannelId=channel_id,
        maxResults=n,
        mySubscribers=True
    )
    return request.execute()

Upvotes: 2

Duke Showbiz
Duke Showbiz

Reputation: 252

are you sure this is definitely your redirect uri? go to your client_secrets.json you downloaded when generating your credentials from the API centre and your redirect uris are in there, http://localhost (NOTE - without the trailing slash!) was specified in mine by default - if it isnt in yours then use the one specified in the json.

Upvotes: 0

Andrea
Andrea

Reputation: 1

The library seems to have a bug. I know it is not so good but in this case the hack is

flow._OOB_REDIRECT_URI = = "http://127.0.0.1:8080"

Upvotes: 0

shyamsantoki
shyamsantoki

Reputation: 125

Change redirect_uri to http://127.0.0.1/ or http://localhost/. I have faced a similar issue before with Google Drive API, and removing the port number worked for me.

Upvotes: 0

Related Questions