Google OAuth 2 authorization - Error: redirect_uri_mismatch
AuthenticationOauth 2.0Google SigninAuthentication Problem Overview
On the website https://code.google.com/apis/console I have registered my application, set up generated Client ID: and Client Secret to my app and tried to log in with Google. Unfortunately, I got the error message:
Error: redirect_uri_mismatch
The redirect URI in the request: http://127.0.0.1:3000/auth/google_oauth2/callback did not match a registered redirect URI
scope=https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email
response_type=code
redirect_uri=http://127.0.0.1:3000/auth/google_oauth2/callback
access_type=offline
approval_prompt=force
client_id=generated_id
What does mean this message, and how can I fix it? I use the gem omniauth-google-oauth2.
Authentication Solutions
Solution 1 - Authentication
The redirect URI (where the response is returned to) has to be registered in the APIs console, and the error is indicating that you haven't done that, or haven't done it correctly.
Go to the console for your project and look under API Access. You should see your client ID
& client secret
there, along with a list of redirect URIs. If the URI you want isn't listed, click edit settings and add the URI to the list.
EDIT: (From a highly rated comment below) Note that updating the google api console and that change being present can take some time. Generally only a few minutes but sometimes it seems longer.
Solution 2 - Authentication
In my case it was www
and non-www
URL. Actual site had www
URL and the Authorized Redirect URIs in Google Developer Console had non-www
URL. Hence, there was mismatch in redirect URI. I solved it by updating Authorized Redirect URIs
in Google Developer Console to www
URL.
Other common URI mismatch are:
- Using
http://
in Authorized Redirect URIs andhttps://
as actual URL, or vice-versa - Using trailing slash (
http://example.com/
) in Authorized Redirect URIs and not using trailing slash (http://example.com
) as actual URL, or vice-versa
Here are the step-by-step screenshots of Google Developer Console so that it would be helpful for those who are getting it difficult to locate the developer console page to update redirect URIs.
> 1. Go to https://console.developers.google.com > > 2. Select your Project
> 3. Click on the menu icon
> 4. Click on API Manager
menu
> 5. Click on Credentials
menu. And under OAuth 2.0 Client IDs
, you will find your client name. In my case, it is Web Client 1
. Click on it and a popup will appear where you can edit Authorized Javascript Origin and Authorized redirect URIs.
Note: The Authorized URI includes all localhost links by default, and any live version needs to include the full path, not just the domain, e.g. https://example.com/path/to/oauth/url
Here is a Google article on creating project and client ID.
Solution 3 - Authentication
If you're using Google+ javascript button, then you have to use postmessage
instead of the actual URI. It took me almost the whole day to figure this out since Google's docs do not clearly state it for some reason.
Solution 4 - Authentication
In any flow where you retrieved an authorization code on the client side, such as the GoogleAuth.grantOfflineAccess()
API, and now you want to pass the code to your server, redeem it, and store the access and refresh tokens, then you have to use the literal string postmessage
instead of the redirect_uri.
For example, building on the snippet in the Ruby doc:
client_secrets = Google::APIClient::ClientSecrets.load('client_secrets.json')
auth_client = client_secrets.to_authorization
auth_client.update!(
:scope => 'profile https://www.googleapis.com/auth/drive.metadata.readonly',
:redirect_uri => 'postmessage' # <---- HERE
)
# Inject user's auth_code here:
auth_client.code = "4/lRCuOXzLMIzqrG4XU9RmWw8k1n3jvUgsI790Hk1s3FI"
tokens = auth_client.fetch_access_token!
# { "access_token"=>..., "expires_in"=>3587, "id_token"=>..., "refresh_token"=>..., "token_type"=>"Bearer"}
The only Google documentation to even mention postmessage
is this old Google+ sign-in doc. Here's a screenshot and archive link since G+ is closing and this link will likely go away:
It is absolutely unforgivable that the doc page for Offline Access doesn't mention this. #FacePalm
Solution 5 - Authentication
For my web application i corrected my mistake by writing
instead of : http://localhost:11472/authorize/
type : http://localhost/authorize/
Solution 6 - Authentication
Make sure to check the protocol "http://" or "https://" as google checks protocol as well. Better to add both URL in the list.
Solution 7 - Authentication
1.you would see an error like this
2.then you should click on request details
after this , you have to copy that url and add this on https://console.cloud.google.com/
- click on Menu -> API & Services -> Credentials
-
you would see a dashboard like this ,click on edit OAuth Client
-
now in
Authorized Javascript Origins
andAuthorized redirect URLS
add the url that has shown error calledredirect_uri_mismatch
i.e here it is http://algorithammer.herokuapp.com , so i have added that in both the places inAuthorized Javascript Origins
andAuthorized redirect URLS
-
click on save and wait for 5 min and then try to login again
Solution 8 - Authentication
This seems quite strange and annoying that no "one" solution is there. for me http://localhost:8000 did not worked out but http://localhost:8000/ worked out.
Solution 9 - Authentication
This answer is same as this Mike's answer, and Jeff's answer, both sets redirect_uri
to postmessage
on client side. I want to add more about the server side, and also the special circumstance applying to this configuration.
Tech Stack
Backend
- Python 3.6
- Django 1.11
- Django REST Framework 3.9: server as API, not rendering template, not doing much elsewhere.
- Django REST Framework JWT 1.11
- Django REST Social Auth < 2.1
Frontend
- React: 16.8.3,
create-react-app
version 2.1.5 - react-google-login: 5.0.2
The "Code" Flow (Specifically for Google OAuth2)
Summary: React --> request social auth "code" --> request jwt token to acquire "login" status in terms of your own backend server/database.
- Frontend (React) uses a "Google sign in button" with
responseType="code"
to get an authorization code. (it's not token, not access token!)
- The google sign in button is from
react-google-login
mentioned above. - Click on the button will bring up a popup window for user to select account. After user select one and the window closes, you'll get the code from the button's callback function.
- Frontend send this to backend server's JWT endpoint.
- POST request, with
{ "provider": "google-oauth2", "code": "your retrieved code here", "redirect_uri": "postmessage" }
- For my Django server I use Django REST Framework JWT + Django REST Social Auth. Django receives the code from frontend, verify it with Google's service (done for you). Once verified, it'll send the JWT (the token) back to frontend. Frontend can now harvest the token and store it somewhere.
- All of
REST_SOCIAL_OAUTH_ABSOLUTE_REDIRECT_URI
,REST_SOCIAL_DOMAIN_FROM_ORIGIN
andREST_SOCIAL_OAUTH_REDIRECT_URI
in Django'ssettings.py
are unnecessary. (They are constants used by Django REST Social Auth) In short, you don't have to setup anything related to redirect url in Django. The"redirect_uri": "postmessage"
in React frontend suffice. This makes sense because the social auth work you have to do on your side is all Ajax-style POST request in frontend, not submitting any form whatsoever, so actually no redirection occur by default. That's why the redirect url becomes useless if you're using the code + JWT flow, and the server-side redirect url setting is not taking any effect.
- The Django REST Social Auth handles account creation. This means it'll check the google account email/last first name, and see if it match any account in database. If not, it'll create one for you, using the exact email & first last name. But, the username will be something like
youremailprefix717e248c5b924d60
if your email is[email protected]
. It appends some random string to make a unique username. This is the default behavior, I believe you can customize it and feel free to dig into their documentation. - The frontend stores that token and when it has to perform CRUD to the backend server, especially create/delete/update, if you attach the token in your
Authorization
header and send request to backend, Django backend will now recognize that as a login, i.e. authenticated user. Of course, if your token expire, you have to refresh it by making another request.
Oh my goodness, I've spent more than 6 hours and finally got this right! I believe this is the 1st time I saw this postmessage
thing. Anyone working on a Django + DRF + JWT + Social Auth + React
combination will definitely crash into this. I can't believe none of the article out there mentions this except answers here. But I really hope this post can save you tons of time if you're using the Django + React stack.
Solution 10 - Authentication
In my case, my credential Application type is "Other". So I can't find Authorized redirect URIs
in the credentials page. It seems appears in Application type:"Web application". But you can click the Download JSON
button to get the client_secret.json
file.
Open the json file, and you can find the parameter like this: "redirect_uris":["urn:ietf:wg:oauth:2.0:oob","http://localhost"]
. I choose to use http://localhost and it works fine for me.
Solution 11 - Authentication
When you register your app at https://code.google.com/apis/console and
make a Client ID, you get a chance to specify one or more redirect
URIs. The value of the redirect_uri
parameter on your auth URI has to
match one of them exactly.
Solution 12 - Authentication
Checklist:
http
orhttps
?&
or&
?- trailing slash(
/
) or open (CMD/CTRL)+F
, search for the exact match in the credential page. If not found then search for the missing one.- Wait until google refreshes it. May happen in each half an hour if you are changing frequently or it may stay in the pool. For my case it was almost half an hour to take effect.
Solution 13 - Authentication
2015July15 - the signin that was working last week with this script on login
<script src="https://apis.google.com/js/platform.js" async defer></script>
stopped working and started causing Error 400 with Error: redirect_uri_mismatch
and in the DETAILS section: redirect_uri=storagerelay://...
i solved it by changing to:
<script src="https://apis.google.com/js/client:platform.js?onload=startApp"></script>
Solution 14 - Authentication
If you use this tutorial: https://developers.google.com/identity/sign-in/web/server-side-flow then you should use "postmessage".
In GO this fixed the problem:
confg = &oauth2.Config{
RedirectURL: "postmessage",
ClientID: ...,
ClientSecret: ...,
Scopes: ...,
Endpoint: google.Endpoint,
}
Solution 15 - Authentication
beware of the extra /
at the end of the url
http://localhost:8000
is different from http://localhost:8000/
Solution 16 - Authentication
for me it was because in the 'Authorized redirect URIs' list I've incorrectly put https://developers.google.com/oauthplayground/
instead of https://developers.google.com/oauthplayground
(without /
at the end).
Solution 17 - Authentication
It has been answered thoroughly but recently (like, a month ago) Google stopped accepting my URI and it would not worked. I know for a fact it did before because there is a user registered with it.
Anyways, the problem was the regular 400: redirect_uri_mismatch but the only difference was that it was changing from https:// to http://, and Google will not allow you to register http:// redirect URI as they are production publishing status (as opposed to localhost).
The problem was in my callback (I use Passport for auth) and I only did
callbackURL: "/register/google/redirect"
Read docs and they used a full URL, so I changed it to
callbackURL: "https://" + process.env.MY_URL+ "/register/google/redirect"
Added https localhost to my accepted URI so I could test locally, and it started working again.
TL;DR use the full URL so you know where you're redirecting
Solution 18 - Authentication
The redirect url is case sensitive.
In my case I added both: http://localhost:5023/AuthCallback/IndexAsync http://localhost:5023/authcallback/indexasync
Solution 19 - Authentication
Rails users (from the omniauth-google-oauth2 docs):
> # Fixing Protocol Mismatch for redirect_uri in Rails
> Just set the full_host in OmniAuth based on the Rails.env.
> # config/initializers/omniauth.rb
> OmniAuth.config.full_host = Rails.env.production? ? 'https://domain.com'; : 'http://localhost:3000';
REMEMBER: Do not include the trailing "/"
Solution 20 - Authentication
None of the above solutions worked for me. below did
change authorised Redirect urls to - https://localhost:44377/signin-google
Hope this helps someone.
Solution 21 - Authentication
My problem was that I had http://localhost:3000/ in the address bar and had http://127.0.0.1:3000/ in the console.developers.google.com
Solution 22 - Authentication
Just make sure that you are entering URL and not just a domain. So instead of: domain.com it should be domain.com/somePathWhereYouHadleYourRedirect
Solution 23 - Authentication
Anyone struggling to find where to set redirect urls in the new console: APIs & Auth -> Credentials -> OAuth 2.0 client IDs -> Click the link to find all your redirect urls
Solution 24 - Authentication
My two cents:
If using the Google_Client library do not forget to update the JSON file on your server after updating the redirect URI's.
Solution 25 - Authentication
I needed to create a new client ID under APIs & Services -> Credentials -> Create credentials -> OAuth -> Other
Then I downloaded and used the client_secret.json with my command line program that is uploading to my youtube account. I was trying to use a Web App OAuth client ID which was giving me the redirect URI error in browser.
Solution 26 - Authentication
I have frontend app and backend api.
From my backend server I was testing by hitting google api and was facing this error. During my whole time I was wondering of why should I need to give redirect_uri
as this is just the backend, for frontend it makes sense.
What I was doing was giving different redirect_uri
(though valid) from server (assuming this is just placeholder, it just has only to be registered to google) but my frontend url that created token code was different. So when I was passing this code in my server side testing(for which redirect-uri was different), I was facing this error.
So don't do this mistake. Make sure your frontend redirect_uri
is same as your server's as google use it to validate the authenticity.
Solution 27 - Authentication
The main reason for this issue will only come from chrome and chrome handles WWW and non www differently depending on how you entered your URL in the browsers and it searches from google and directly shows the results, so the redirection URL sent is different in a different case
Add all the possible combinations you can find the exact url sent from fiddler , the 400 error pop up will not give you the exact http and www infromation
Solution 28 - Authentication
Try to do these checks:
- Bundle ID in console and in your application. I prefer set Bundle ID of application like this "org.peredovik.${PRODUCT_NAME:rfc1034identifier}"
- Check if you added URL types at tab Info just type your Bundle ID in Identifier and URL Schemes, role set to Editor
- In console at cloud.google.com "APIs & auth" -> "Consent screen" fill form about your application. "Product name" is required field.
Enjoy :)
Solution 29 - Authentication
Let me complete @Bazyl's answer: in the message I received, they mentioned the URI
"http://localhost:8080/"
(which of course, seems an internal google configuration). I changed the authorized URI for that one,
"http://localhost:8080/"
, and the message didn't appear anymore... And the video got uploaded... The APIS documentation is VERY lame... Every time I have something working with google apis, I simply feel "lucky", but there's a lack of good documentation about it.... :( Yes, I got it working, but I don't yet understand neither why it failed, nor why it worked... There was only ONE place to confirm the URI in the web, and it got copied in the client_secrets.json... I don't get if there's a THIRD place where one should write the same URI... I find nor only the documentation but also the GUI design of Google's api quite lame...
Solution 30 - Authentication
In my case I had to check the Client ID type for web applications/installed applications.
installed applications: http://localhost [Redirect URIs] In this case localhost simply works
web applications: You need valid domain name [Redirect URIs:]
Solution 31 - Authentication
What you need to do is go back to your Developer Console and go to APIs & Auth > Consent Screen and fill that out. Specifically, the product name.
Solution 32 - Authentication
I had two request URIs in the Console, http://xxxxx/client/api/spreadsheet/authredirect and http://localhost.
I tried all the top responses to this question and confirmed that none of them were my problem.
I removed localhost from the Console, updated my client_secret.json in my project, and the mismatch error went away.
Solution 33 - Authentication
I had the same issue with google sign in.
I had correctly entered my callbacks in google Credential panel at google developer console here was my redirect urls :
https://www.example.com/signin-google
https://www.example.com/signin-google/
https://www.example.com/oauth2callback
https://www.example.com/oauth2callback/
Everything seems fine right? But it still didn't work until I added one more magical Url I added signin-google URL (which is default google callback) without www and problem solved.
Take it into account (depending on your domain) you may or may not need to add both with and without www URLs
Solution 34 - Authentication
Below are the reasons of Error: redirect_uri_mismatch issue occurs :
- Redirect URL field blank at your google project.
- Redirect URL does not match with your site
- Important! It will work only with working domain like example.com, book.com etc (Not work with local host or AWS LB URL)
Recommended to use domain URL
Solution 35 - Authentication
The trick is to input the right redirect url at the point of creating the ID. I found that updating the redirect url once the ID has been created via an 'Edit' just doesn't get the job done. What also worked for me is duplicating the entire 'vendor' folder and copying it to the same location where the 'oauth' file is (just until you successfully generate the token and then you can delete the duplicate 'vendor' folder). This is because trying to point to the vendor folder via '../vendor/autoload' didn't work for me.
So, delete your existing troublesome Client OAuth ID and try this approach, it will work.
Solution 36 - Authentication
To make it work on localhost and if using for web-server, do provide
Authorized JavaScript origins (Client ID for web appication)
e.g. http://localhost:4200
Solution 37 - Authentication
I had this problem using Meteor and Ngrok, while trying to login with Google.
I put the Ngrok URL in the Google Developer Console as redirect URLs, and went to the Ngrok URL page. The thing was that I didn't use Meteor's ROOT_URL
when executing the app, so any redirect would go to localhost:3000
insted of the Ngrok URL.
Just fixed it by adding the Ngrok URL as ROOT_URL
on Meteor's configuration or by exporting it before executing the app on the terminal like: export ROOT_URL=https://my_ngrok_url
Solution 38 - Authentication
I had the same issue to authorize in Reactjs app on my local machine with port 3000.
I have added lvh.me
in authorized domains and http://lvh.me:3000
for authorized origin and authorized redirect URL as shown in following images respectively.
Note: You can add multiple sites for verified domains. i-e for your local machine, staging or other environments
Solution 39 - Authentication
In my case I added
https://websitename.com/sociallogin/social/callback/?hauth.done=Google
in Authorized redirect URIs
section and it worked for me
Solution 40 - Authentication
Important addition: I discovered that on cross-client server auth flow you should use "postmessage" when you received your serverAuthCode
from Web SDK and set redirect_uri
empty when you received serverAuthCode
from Android or iOS SDK.
Solution 41 - Authentication
if you are using passport js and you are deploying your app in heroku you need to add this setting proxy: true in passport strategy
passport.use(new GoogleStrategy(
{
clientID: keys.googleClientID,
clientSecret: keys.googleClientSecret,
callbackURL: '/auth/google/callback',
proxy: true
})
or check your authorized url
Solution 42 - Authentication
Don't forget to include the path after your domain and ip. In my case, I forgot:
/oauth2callback
Solution 43 - Authentication
In my case the redirect-uri is http://127.0.0.1:5000/auth/google/callback
and I keep requesting through http://localhost:5000/auth/google
Make sure if you use localhost
or 127.0.0.1
.
Solution 44 - Authentication
UPDATED --> WORKING for Android apps
Just use:
> http://localhost/oauth2callback
if you handle your own logic without redirect link for web apps