Rails5 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'
했던 일
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)
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.
, require: 'dotenv/rails-now'
를 후술한다 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 공격을 받기 쉬워져 버리기 때문에 불필요.
Reference
이 문제에 관하여(Rails5 Google 인증 도입 중 오류), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kohji12k/items/8354c83f894b79fff80d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)