Rails5 Google 인증 도입 중 오류

devise에서 google 인증을 도입했을 때의 에러와 해결까지의 흐름을 망각록으로 남깁니다.
오류 400: invalid_request Missing required parameter: client_id
↑의 에러 기사는 보입니다만, 그것과는 다른 에러였기 때문에 고전했습니다.

인증 오류



브라우저에서 신규 등록 화면에서 Sign in with GoogleOauth2가 추가되었는지 확인.
링크로 날아가면 다음 오류가 발생했습니다.
log/development.log
# gem 'omniauth-rails_csrf_protection' 追加前

(google_oauth2) Callback phase initiated.
(google_oauth2) Authentication failure! csrf_detected: OmniAuth::Strategies::OAuth2::CallbackError, csrf_detected | CSRF detected
Processing by Users::OmniauthCallbacksController#failure as HTML
Redirected to http://localhost:3000/users/sign_in
Completed 302 Found in 2ms (ActiveRecord: 0.0ms)
gem 'omniauth-rails_csrf_protection' 를 넣으면 다음의 로그로 바뀌고 있었다.
log/development.log
# gem 'omniauth-rails_csrf_protection' 追加後

Started POST "/users/auth/google_oauth2" for ::1 at 2020-11-10 11:59:32 +0900
(google_oauth2) Request phase initiated.


Using OAuth 2.0 to Access Google APIs
오류
400: invalid_request
오류 내용을 직역
'redirect_uri의 잘못된 매개변수 값: 스키마 없음:/users/auth/google_oauth2/callback'

했던 일


  • gem 'omniauth-rails_csrf_protection' 추가
  • Contacts API 활성화
  • gem 'dotenv-rails'에 , require: 'dotenv/rails-now' 를 후술한다
  • config/initializers/omniauth.rb 작성, 편집 (※ 마지막 쪽에 보충 있음)

  • config/initializers/omniauth.rb
    Rails.application.config.middleware.use OmniAuth::Builder do
      {:provider_ignores_state => true}
    end
    

    해결 결과와 그 요인



    google 인증할 수 있었습니다! (devise만의 로그인도 OK!)
    다음은 그 때의 로그입니다.
    development.log.rb
    
    Started POST "/users/auth/google_oauth2" for ::1 at 2020-11-10 13:24:48 +0900
    (google_oauth2) Request phase initiated.
    Started GET "/users/auth/google_oauth2/callback?state=9d59b2ef8ca58e1b5f3ceec217cf860863ac548150829df6&code=4%2F0AY0e-g6FAjat7NwD37kS0-qHTDAs3JDPF4fW_SxnloikU9WVpy_oHNDYU3Rn3t07LRm7XQ&scope=email+profile+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile+openid&authuser=0&prompt=consent" for ::1 at 2020-11-10 13:31:31 +0900
    (google_oauth2) Callback phase initiated.
    Processing by Users::OmniauthCallbacksController#google_oauth2 as HTML
      Parameters: {"state"=>"9d59b2ef8ca58e1b5f3ceec217cf860863ac548150829df6", "code"=>"4/0AY0e-g6FAjat7NwD37kS0-qHTDAs3JDPF4fW_SxnloikU9WVpy_oHNDYU3Rn3t07LRm7XQ", "scope"=>"email profile https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile openid", "authuser"=>"0", "prompt"=>"consent"}
      User Load (5.3ms)  SELECT  `users`.* FROM `users` WHERE `users`.`email` = '登録アドレス' ORDER BY `users`.`id` ASC LIMIT 1
       (1.8ms)  BEGIN
      User Exists (5.9ms)  SELECT  1 AS one FROM `users` WHERE `users`.`email` = BINARY '登録アドレス' LIMIT 1
      SQL (10.1ms)  INSERT INTO `users` (`email`, `encrypted_password`, `created_at`, `updated_at`, `name`) VALUES ('登録アドレス', '$2a$12$StAlV8i5S0/ORaZ9DNDPD.6MJaEqY3JGvkIwQb4hulRH5wLazHylm', '2020-11-10 04:31:32', '2020-11-10 04:31:32', '名前')
       (6.1ms)  COMMIT
    Redirected to http://localhost:3000/
    Completed 302 Found in 504ms (ActiveRecord: 29.2ms)
    

    해결 요인



    initializer devise 파일의 코드를 편집하면 오류가 해결되었습니다.

    initializers/devise.rb
    config.omniauth :google_oauth2,ENV['GOOGLE_CLIENT_ID'],
                                   ENV['GOOGLE_CLIENT_SECRET'], 
                                   scope: 'email,calendar', 
                                   redirect_uri: "#{ENV['HOST_DOMAIN']}/users/auth/google_oauth2/callback"
    

    ↓변경 후↓

    initializers/devise.rb
    config.omniauth :google_oauth2,ENV['GOOGLE_CLIENT_ID'],
                                   ENV['GOOGLE_CLIENT_SECRET']
    

    불필요한 것이 쓰여져 버린 것 같습니다. . .

    반성점



    오류 해당 코드가 작성된 의미를 이해하지 못했습니다.
    공식 문서 제대로 읽지 않았다.

    ※보충(11/12 편집)



    config/initializers/omniauth.rb
    Rails.application.config.middleware.use OmniAuth::Builder do
      {:provider_ignores_state => true}
    end
    

    이 코드는 오히려 CSRF 공격을 받기 쉬워져 버리기 때문에 불필요.

    좋은 웹페이지 즐겨찾기