Search code examples
ruby-on-railsrubyherokugoogle-oauthomniauth-google-oauth2

Rails Google Oauth2 Working Locally But Not Remotely


I've been struggling with this error for a while now, and haven't quite figured out what I've got wrong.

My site can be found here: https://chaynring.com

My issue: when running the server locally, I'm able to authenticate via Google Oauth2 without issue; however, Google Oauth2 fails on my server (hosted by Heroku) and I don't know why.

Here's a pastebin of my routes: https://pastebin.com/S8piCjcw

And the log that I get on Heroku is:

2021-04-20T02:32:40.506069+00:00 heroku[router]: at=info method=GET path="/auth/google_oauth2" host=chaynring.com request_id=055519f9-9246-4966-8b7a-4b3016a7dee6 fwd="142.147.57.249" dyno=web.1 connect=1ms service=7ms status=404 bytes=1966 protocol=https
2021-04-20T02:32:40.500506+00:00 app[web.1]: I, [2021-04-20T02:32:40.500394 #4]  INFO -- : [055519f9-9246-4966-8b7a-4b3016a7dee6] Started GET "/auth/google_oauth2" for 142.147.57.249 at 2021-04-20 02:32:40 +0000
2021-04-20T02:32:40.502460+00:00 app[web.1]: F, [2021-04-20T02:32:40.502396 #4] FATAL -- : [055519f9-9246-4966-8b7a-4b3016a7dee6]   
2021-04-20T02:32:40.502560+00:00 app[web.1]: F, [2021-04-20T02:32:40.502498 #4] FATAL -- : [055519f9-9246-4966-8b7a-4b3016a7dee6] ActionController::RoutingError (No route matches [GET] "/auth/google_oauth2"):
2021-04-20T02:32:40.502652+00:00 app[web.1]: F, [2021-04-20T02:32:40.502585 #4] FATAL -- : [055519f9-9246-4966-8b7a-4b3016a7dee6]   
2021-04-20T02:32:40.502766+00:00 app[web.1]: F, [2021-04-20T02:32:40.502692 #4] FATAL -- : [055519f9-9246-4966-8b7a-4b3016a7dee6] vendor/bundle/ruby/2.7.0/gems/actionpack-5.2.4.5/lib/action_dispatch/middleware/debug_exceptions.rb:65:in `call'
2021-04-20T02:32:40.502768+00:00 app[web.1]: [055519f9-9246-4966-8b7a-4b3016a7dee6] vendor/bundle/ruby/2.7.0/gems/actionpack-5.2.4.5/lib/action_dispatch/middleware/show_exceptions.rb:33:in `call'
2021-04-20T02:32:40.502769+00:00 app[web.1]: [055519f9-9246-4966-8b7a-4b3016a7dee6] vendor/bundle/ruby/2.7.0/gems/railties-5.2.4.5/lib/rails/rack/logger.rb:38:in `call_app'
2021-04-20T02:32:40.502770+00:00 app[web.1]: [055519f9-9246-4966-8b7a-4b3016a7dee6] vendor/bundle/ruby/2.7.0/gems/railties-5.2.4.5/lib/rails/rack/logger.rb:26:in `block in call'
2021-04-20T02:32:40.502771+00:00 app[web.1]: [055519f9-9246-4966-8b7a-4b3016a7dee6] vendor/bundle/ruby/2.7.0/gems/activesupport-5.2.4.5/lib/active_support/tagged_logging.rb:71:in `block in tagged'
2021-04-20T02:32:40.502771+00:00 app[web.1]: [055519f9-9246-4966-8b7a-4b3016a7dee6] vendor/bundle/ruby/2.7.0/gems/activesupport-5.2.4.5/lib/active_support/tagged_logging.rb:28:in `tagged'
2021-04-20T02:32:40.502772+00:00 app[web.1]: [055519f9-9246-4966-8b7a-4b3016a7dee6] vendor/bundle/ruby/2.7.0/gems/activesupport-5.2.4.5/lib/active_support/tagged_logging.rb:71:in `tagged'
2021-04-20T02:32:40.502772+00:00 app[web.1]: [055519f9-9246-4966-8b7a-4b3016a7dee6] vendor/bundle/ruby/2.7.0/gems/railties-5.2.4.5/lib/rails/rack/logger.rb:26:in `call'
2021-04-20T02:32:40.502773+00:00 app[web.1]: [055519f9-9246-4966-8b7a-4b3016a7dee6] vendor/bundle/ruby/2.7.0/gems/actionpack-5.2.4.5/lib/action_dispatch/middleware/remote_ip.rb:81:in `call'
2021-04-20T02:32:40.502773+00:00 app[web.1]: [055519f9-9246-4966-8b7a-4b3016a7dee6] vendor/bundle/ruby/2.7.0/gems/actionpack-5.2.4.5/lib/action_dispatch/middleware/request_id.rb:27:in `call'
2021-04-20T02:32:40.502774+00:00 app[web.1]: [055519f9-9246-4966-8b7a-4b3016a7dee6] vendor/bundle/ruby/2.7.0/gems/rack-2.2.3/lib/rack/method_override.rb:24:in `call'
2021-04-20T02:32:40.502774+00:00 app[web.1]: [055519f9-9246-4966-8b7a-4b3016a7dee6] vendor/bundle/ruby/2.7.0/gems/rack-2.2.3/lib/rack/runtime.rb:22:in `call'
2021-04-20T02:32:40.502775+00:00 app[web.1]: [055519f9-9246-4966-8b7a-4b3016a7dee6] vendor/bundle/ruby/2.7.0/gems/activesupport-5.2.4.5/lib/active_support/cache/strategy/local_cache_middleware.rb:29:in `call'
2021-04-20T02:32:40.502775+00:00 app[web.1]: [055519f9-9246-4966-8b7a-4b3016a7dee6] vendor/bundle/ruby/2.7.0/gems/actionpack-5.2.4.5/lib/action_dispatch/middleware/executor.rb:14:in `call'
2021-04-20T02:32:40.502776+00:00 app[web.1]: [055519f9-9246-4966-8b7a-4b3016a7dee6] vendor/bundle/ruby/2.7.0/gems/actionpack-5.2.4.5/lib/action_dispatch/middleware/static.rb:127:in `call'
2021-04-20T02:32:40.502776+00:00 app[web.1]: [055519f9-9246-4966-8b7a-4b3016a7dee6] vendor/bundle/ruby/2.7.0/gems/rack-2.2.3/lib/rack/sendfile.rb:110:in `call'
2021-04-20T02:32:40.502776+00:00 app[web.1]: [055519f9-9246-4966-8b7a-4b3016a7dee6] vendor/bundle/ruby/2.7.0/gems/actionpack-5.2.4.5/lib/action_dispatch/middleware/ssl.rb:74:in `call'
2021-04-20T02:32:40.502777+00:00 app[web.1]: [055519f9-9246-4966-8b7a-4b3016a7dee6] vendor/bundle/ruby/2.7.0/gems/railties-5.2.4.5/lib/rails/engine.rb:524:in `call'
2021-04-20T02:32:40.502777+00:00 app[web.1]: [055519f9-9246-4966-8b7a-4b3016a7dee6] vendor/bundle/ruby/2.7.0/gems/puma-3.12.6/lib/puma/configuration.rb:227:in `call'
2021-04-20T02:32:40.502777+00:00 app[web.1]: [055519f9-9246-4966-8b7a-4b3016a7dee6] vendor/bundle/ruby/2.7.0/gems/puma-3.12.6/lib/puma/server.rb:706:in `handle_request'
2021-04-20T02:32:40.502778+00:00 app[web.1]: [055519f9-9246-4966-8b7a-4b3016a7dee6] vendor/bundle/ruby/2.7.0/gems/puma-3.12.6/lib/puma/server.rb:476:in `process_client'
2021-04-20T02:32:40.502778+00:00 app[web.1]: [055519f9-9246-4966-8b7a-4b3016a7dee6] vendor/bundle/ruby/2.7.0/gems/puma-3.12.6/lib/puma/server.rb:334:in `block in run'
2021-04-20T02:32:40.502778+00:00 app[web.1]: [055519f9-9246-4966-8b7a-4b3016a7dee6] vendor/bundle/ruby/2.7.0/gems/puma-3.12.6/lib/puma/thread_pool.rb:135:in `block in spawn_thread'

I feel like this is something with the middleware I have defined on my application because the GET /auth/google_oauth2 route is not explicitly defined in my routes.rb, but it works locally just fine.

For more context, this is the output I get from the rails server when running locally:

Started GET "/auth/google_oauth2" for ::1 at 2021-04-19 21:40:04 -0500
I, [2021-04-19T21:40:04.244529 #40035]  INFO -- omniauth: (google_oauth2) Request phase initiated.

Has anyone had this issue?

Local routes:

$ rails routes
                          Prefix Verb   URI Pattern                                                                              Controller#Action
                            root GET    /                                                                                        static_pages#index
                           login GET    /login(.:format)                                                                         sessions#new
                                 POST   /login(.:format)                                                                         sessions#create
                          logout DELETE /logout(.:format)                                                                        sessions#destroy
                          signup GET    /signup(.:format)                                                                        users#new
                           about GET    /about(.:format)                                                                         static_pages#about
                            help GET    /help(.:format)                                                                          static_pages#help
                unauthed_exports GET    /unauthed_exports/:sale_export_id(.:format)                                              static_pages#unauthed_export
                    contacts_new GET    /contacts/new(.:format)                                                                  contacts#new
                        contacts POST   /contacts(.:format)                                                                      contacts#create
                                 GET    /auth/:provider/callback(.:format)                                                       sessions#omniauth
                   settings_user GET    /users/:id/settings(.:format)                                                            users#settings
                   comments_user GET    /users/:id/comments(.:format)                                                            users#comments
                      admin_user GET    /users/:id/admin(.:format)                                                               users#admin
                    exports_user GET    /users/:id/exports(.:format)                                                             users#exports
        user_permission_requests GET    /users/:user_id/permission_requests(.:format)                                            permission_requests#index
                                 POST   /users/:user_id/permission_requests(.:format)                                            permission_requests#create
     new_user_permission_request GET    /users/:user_id/permission_requests/new(.:format)                                        permission_requests#new
    edit_user_permission_request GET    /users/:user_id/permission_requests/:id/edit(.:format)                                   permission_requests#edit
         user_permission_request GET    /users/:user_id/permission_requests/:id(.:format)                                        permission_requests#show
                                 PATCH  /users/:user_id/permission_requests/:id(.:format)                                        permission_requests#update
                                 PUT    /users/:user_id/permission_requests/:id(.:format)                                        permission_requests#update
                                 DELETE /users/:user_id/permission_requests/:id(.:format)                                        permission_requests#destroy
                           users GET    /users(.:format)                                                                         users#index
                                 POST   /users(.:format)                                                                         users#create
                        new_user GET    /users/new(.:format)                                                                     users#new
                       edit_user GET    /users/:id/edit(.:format)                                                                users#edit
                            user GET    /users/:id(.:format)                                                                     users#show
                                 PATCH  /users/:id(.:format)                                                                     users#update
                                 PUT    /users/:id(.:format)                                                                     users#update
                                 DELETE /users/:id(.:format)                                                                     users#destroy
                        new_bike GET    /bikes/new(.:format)                                                                     bikes#new
                       all_bikes GET    /bikes(.:format)                                                                         bikes#index
                            bike GET    /bikes/:make/:model/:year(.:format)                                                      bikes#show
                           bikes POST   /bikes(.:format)                                                                         bikes#create
                       edit_bike GET    /bikes/:make/:model/:year/edit(.:format)                                                 bikes#edit
                      patch_bike PATCH  /bikes/:make/:model/:year(.:format)                                                      bikes#update
                                 PUT    /bikes/:make/:model/:year(.:format)                                                      bikes#update
                                 DELETE /bikes/:make/:model/:year(.:format)                                                      bikes#destroy
                       bike_make GET    /bikes/:make(.:format)                                                                   bikes#make
                 bike_make_model GET    /bikes/:make/:model(.:format)                                                            bikes#make_model
bikes_new_populate_model_options GET    /bikes/bikes/new/populate_model_options(.:format)                                        bikes#populate_model_options
                                 POST   /bikes/:make/:model/:year/sales/pay_for_csv(.:format)                                    charges#checkout
              successful_payment GET    /bikes/:make/:model/:year/sales/successful_payment(.:format)                             bikes#successful_payment
                 new_bike_review GET    /bikes/:make/:model/:year/review(.:format)                                               bike_reviews#new
               final_bike_review GET    /bikes/:make/:model/:year/review/final(.:format)                                         bike_reviews#edit
                                 POST   /bikes/:bike_id/sale_search(.:format)                                                    bikes#sale_search
                                 POST   /bikes/:bike_id/export_search(.:format)                                                  sales#export_search
                      bike_sales GET    /bikes/:make/:model/:year/sales(.:format)                                                sales#index
                   new_bike_sale GET    /bikes/:make/:model/:year/sales/new(.:format)                                            sales#new
                            sale GET    /bikes/:make/:model/:year/sales/:sale_id(.:format)                                       sales#show
                           sales POST   /bikes/:make/:model/:year/sales(.:format)                                                sales#create
                       edit_sale GET    /bikes/:make/:model/:year/sales/:sale_id/edit(.:format)                                  sales#edit
                      patch_sale PATCH  /bikes/:make/:model/:year/sales/:sale_id(.:format)                                       sales#update
                                 PUT    /bikes/:make/:model/:year/sales/:sale_id(.:format)                                       sales#update
                                 DELETE /bikes/:make/:model/:year/sales/:sale_id(.:format)                                       sales#destroy
                    bike_reviews GET    /bikes/bike_reviews(.:format)                                                            bike_reviews#index
                                 POST   /bikes/bike_reviews(.:format)                                                            bike_reviews#create
                     bike_review GET    /bikes/bike_reviews/:id(.:format)                                                        bike_reviews#show
                                 PATCH  /bikes/bike_reviews/:id(.:format)                                                        bike_reviews#update
                                 PUT    /bikes/bike_reviews/:id(.:format)                                                        bike_reviews#update
                                 DELETE /bikes/bike_reviews/:id(.:format)                                                        bike_reviews#destroy
                all_sale_reviews GET    /sales/:sale_id/reviews(.:format)                                                        sale_reviews#index
                 new_sale_review GET    /sales/:sale_id/reviews/new(.:format)                                                    sale_reviews#new
                     sale_review GET    /sales/:sale_id/reviews/:sale_review_id(.:format)                                        sale_reviews#show
                    sale_reviews POST   /sales/:sale_id/reviews(.:format)                                                        sale_reviews#create
               final_sale_review GET    /sales/:sale_id/reviews/:sale_review_id/final(.:format)                                  sale_reviews#edit
                                 PATCH  /sales/:sale_id/reviews/:sale_review_id(.:format)                                        sale_reviews#update
                                 PUT    /sales/:sale_id/reviews/:sale_review_id(.:format)                                        sale_reviews#update
                                 DELETE /sales/:sale_id/reviews/:sale_review_id(.:format)                                        sale_reviews#destroy
              rails_service_blob GET    /rails/active_storage/blobs/:signed_id/*filename(.:format)                               active_storage/blobs#show
       rails_blob_representation GET    /rails/active_storage/representations/:signed_blob_id/:variation_key/*filename(.:format) active_storage/representations#show
              rails_disk_service GET    /rails/active_storage/disk/:encoded_key/*filename(.:format)                              active_storage/disk#show
       update_rails_disk_service PUT    /rails/active_storage/disk/:encoded_token(.:format)                                      active_storage/disk#update
            rails_direct_uploads POST   /rails/active_storage/direct_uploads(.:format)                                           active_storage/direct_uploads#create

Heroku routes:

$ heroku run rails routes
Running rails routes on ⬢ chaynring... up, run.2521 (Hobby)
                          Prefix Verb   URI Pattern                                                                              Controller#Action
                            root GET    /                                                                                        static_pages#index
                           login GET    /login(.:format)                                                                         sessions#new
                                 POST   /login(.:format)                                                                         sessions#create
                          logout DELETE /logout(.:format)                                                                        sessions#destroy
                          signup GET    /signup(.:format)                                                                        users#new
                           about GET    /about(.:format)                                                                         static_pages#about
                            help GET    /help(.:format)                                                                          static_pages#help
                unauthed_exports GET    /unauthed_exports/:sale_export_id(.:format)                                              static_pages#unauthed_export
                    contacts_new GET    /contacts/new(.:format)                                                                  contacts#new
                        contacts POST   /contacts(.:format)                                                                      contacts#create
                                 GET    /auth/:provider/callback(.:format)                                                       sessions#omniauth
                   settings_user GET    /users/:id/settings(.:format)                                                            users#settings
                   comments_user GET    /users/:id/comments(.:format)                                                            users#comments
                      admin_user GET    /users/:id/admin(.:format)                                                               users#admin
                    exports_user GET    /users/:id/exports(.:format)                                                             users#exports
        user_permission_requests GET    /users/:user_id/permission_requests(.:format)                                            permission_requests#index
                                 POST   /users/:user_id/permission_requests(.:format)                                            permission_requests#create
     new_user_permission_request GET    /users/:user_id/permission_requests/new(.:format)                                        permission_requests#new
    edit_user_permission_request GET    /users/:user_id/permission_requests/:id/edit(.:format)                                   permission_requests#edit
         user_permission_request GET    /users/:user_id/permission_requests/:id(.:format)                                        permission_requests#show
                                 PATCH  /users/:user_id/permission_requests/:id(.:format)                                        permission_requests#update
                                 PUT    /users/:user_id/permission_requests/:id(.:format)                                        permission_requests#update
                                 DELETE /users/:user_id/permission_requests/:id(.:format)                                        permission_requests#destroy
                           users GET    /users(.:format)                                                                         users#index
                                 POST   /users(.:format)                                                                         users#create
                        new_user GET    /users/new(.:format)                                                                     users#new
                       edit_user GET    /users/:id/edit(.:format)                                                                users#edit
                            user GET    /users/:id(.:format)                                                                     users#show
                                 PATCH  /users/:id(.:format)                                                                     users#update
                                 PUT    /users/:id(.:format)                                                                     users#update
                                 DELETE /users/:id(.:format)                                                                     users#destroy
                        new_bike GET    /bikes/new(.:format)                                                                     bikes#new
                       all_bikes GET    /bikes(.:format)                                                                         bikes#index
                            bike GET    /bikes/:make/:model/:year(.:format)                                                      bikes#show
                           bikes POST   /bikes(.:format)                                                                         bikes#create
                       edit_bike GET    /bikes/:make/:model/:year/edit(.:format)                                                 bikes#edit
                      patch_bike PATCH  /bikes/:make/:model/:year(.:format)                                                      bikes#update
                                 PUT    /bikes/:make/:model/:year(.:format)                                                      bikes#update
                                 DELETE /bikes/:make/:model/:year(.:format)                                                      bikes#destroy
                       bike_make GET    /bikes/:make(.:format)                                                                   bikes#make
                 bike_make_model GET    /bikes/:make/:model(.:format)                                                            bikes#make_model
bikes_new_populate_model_options GET    /bikes/bikes/new/populate_model_options(.:format)                                        bikes#populate_model_options
                                 POST   /bikes/:make/:model/:year/sales/pay_for_csv(.:format)                                    charges#checkout
              successful_payment GET    /bikes/:make/:model/:year/sales/successful_payment(.:format)                             bikes#successful_payment
                 new_bike_review GET    /bikes/:make/:model/:year/review(.:format)                                               bike_reviews#new
               final_bike_review GET    /bikes/:make/:model/:year/review/final(.:format)                                         bike_reviews#edit
                                 POST   /bikes/:bike_id/sale_search(.:format)                                                    bikes#sale_search
                                 POST   /bikes/:bike_id/export_search(.:format)                                                  sales#export_search
                      bike_sales GET    /bikes/:make/:model/:year/sales(.:format)                                                sales#index
                   new_bike_sale GET    /bikes/:make/:model/:year/sales/new(.:format)                                            sales#new
                            sale GET    /bikes/:make/:model/:year/sales/:sale_id(.:format)                                       sales#show
                           sales POST   /bikes/:make/:model/:year/sales(.:format)                                                sales#create
                       edit_sale GET    /bikes/:make/:model/:year/sales/:sale_id/edit(.:format)                                  sales#edit
                      patch_sale PATCH  /bikes/:make/:model/:year/sales/:sale_id(.:format)                                       sales#update
                                 PUT    /bikes/:make/:model/:year/sales/:sale_id(.:format)                                       sales#update
                                 DELETE /bikes/:make/:model/:year/sales/:sale_id(.:format)                                       sales#destroy
                    bike_reviews GET    /bikes/bike_reviews(.:format)                                                            bike_reviews#index
                                 POST   /bikes/bike_reviews(.:format)                                                            bike_reviews#create
                     bike_review GET    /bikes/bike_reviews/:id(.:format)                                                        bike_reviews#show
                                 PATCH  /bikes/bike_reviews/:id(.:format)                                                        bike_reviews#update
                                 PUT    /bikes/bike_reviews/:id(.:format)                                                        bike_reviews#update
                                 DELETE /bikes/bike_reviews/:id(.:format)                                                        bike_reviews#destroy
                all_sale_reviews GET    /sales/:sale_id/reviews(.:format)                                                        sale_reviews#index
                 new_sale_review GET    /sales/:sale_id/reviews/new(.:format)                                                    sale_reviews#new
                     sale_review GET    /sales/:sale_id/reviews/:sale_review_id(.:format)                                        sale_reviews#show
                    sale_reviews POST   /sales/:sale_id/reviews(.:format)                                                        sale_reviews#create
               final_sale_review GET    /sales/:sale_id/reviews/:sale_review_id/final(.:format)                                  sale_reviews#edit
                                 PATCH  /sales/:sale_id/reviews/:sale_review_id(.:format)                                        sale_reviews#update
                                 PUT    /sales/:sale_id/reviews/:sale_review_id(.:format)                                        sale_reviews#update
                                 DELETE /sales/:sale_id/reviews/:sale_review_id(.:format)                                        sale_reviews#destroy
              rails_service_blob GET    /rails/active_storage/blobs/:signed_id/*filename(.:format)                               active_storage/blobs#show
       rails_blob_representation GET    /rails/active_storage/representations/:signed_blob_id/:variation_key/*filename(.:format) active_storage/representations#show
              rails_disk_service GET    /rails/active_storage/disk/:encoded_key/*filename(.:format)                              active_storage/disk#show
       update_rails_disk_service PUT    /rails/active_storage/disk/:encoded_token(.:format)                                      active_storage/disk#update
            rails_direct_uploads POST   /rails/active_storage/direct_uploads(.:format)                                           active_storage/direct_uploads#create

My initializers/omniauth.rb:

Rails.application.config.middleware.use OmniAuth::Builder do
  client_id = Rails.application.secrets.GOOGLE_CLIENT_ID
  client_secret = Rails.application.secrets.GOOGLE_CLIENT_SECRET
  provider :google_oauth2, client_id, client_secret
end

5/3 update

I've looked so much at my app, Google Dev Console, and Heroku, that I'm probably missing something really obvious, but I was able to find some potentially helpful information today. Basically I've noticed that when I run my app locally, I get:

  • GET /auth/google_oauth2 -> 302, redirect to Google OAuth screen from the Location in the Response Heades

But I don't get a redirect at all when I try this in production. The code is the same between local and remote, but the config is different. Main thing I've though is this is something weird with Heroku and HTTP (local) vs. HTTPS? I've also added my domains to the Google Dev console so that should be configured.


Solution

  • It looks like you use GET requests to /auth/:provider endpoints.

    There is security concern with it. You need to change the verb to POST.

    See https://stackoverflow.com/a/65785932/2131983 for more details.