【Rails】Sorcery에서 Twitter 인증

소개



Sorcery를 사용한 Twitter 로그인 인증 설정입니다.
기본적으로는 위키 대로 하면 됩니다.

(2020/4/23 추가) 메일 주소의 취득 방법에 대해 추가했습니다.

(2021/4/29 추가) 개인 블로그로 이동했습니다.
【Rails】Sorcery에서 Twitter 인증 – blog.aiandrox

다음은 조금 시도해 보았거나 오류와의 분투입니다.

callback_url을 설정하지 않는 경우



For OAuth 1.0a compliance this parameter(주석: oauth_callback 의 것) is required .
POST oauth/request_token — Twitter Developers

그렇기 때문에 callback_url 를 설정하지 않으면 어떻게 되는지 시험해 보았다.

config/sorcery.rb
  # config.twitter.callback_url = 'http://localhost:3000/oauth/callback?provider=twitter'

인증 화면 URL
https://api.twitter.com/oauth/authenticate?oauth_callback&oauth_token=vyYZbQAAAAABDRHmAAABcRsW6zQ

쿼리를 보면 oauth_callback에 값이 없습니다.
인증을 누르면 PIN 코드를 입력하라는 메시지가 표시되고 리디렉션이 중단됩니다.


다양한 오류



NoMethodError at /oauth/callback



인증 후에 /oauth/callback 에 가지 않는다.

NoMethodError at /oauth/callback
undefined method `original_callback_url' for nil:NilClass

콜백시 URL
http://127.0.0.1:3000/oauth/callback?provider=twitter&oauth_token=EHBQ4wAAAAABDRHmAAABcRr4LwQ&oauth_verifier=zFvTO1ay9G316hmbPMcbexTfckA45M4j

화면만 보고 「어째서 oauths액션에 날고 있는 것일까」라고 생각하고 있었습니다만, 원래 NoMethodError 였습니다.

해결책



config/routes.rb
  post "oauth/callback", to: "oauths#callback"
  get 'oauth/callback', to: 'oauths#callback' # この行がなかったので追加
  get "oauth/:provider", to: "oauths#oauth", as: :auth_at_provider

Mysql2::Error - Field 'twitter_id' doesn't have a default value:


Started GET "/oauth/callback?provider=twitter&oauth_token=qvWE_gAAAAABDRHmAAABcSFi3bQ&oauth_verifier=nUb5kYYSryTHA03FepYw2xSLNzVFMmTc" for 127.0.0.1 at 2020-03-28 22:44:22 +0900
Processing by OauthsController#callback as HTML
  Parameters: {"provider"=>"twitter", "oauth_token"=>"qvWE_gAAAAABDRHmAAABcSFi3bQ", "oauth_verifier"=>"nUb5kYYSryTHA03FepYw2xSLNzVFMmTc"}
Unpermitted parameters: :oauth_token, :oauth_verifier
  Authentication Load (0.8ms)  SELECT  `authentications`.* FROM `authentications` WHERE `authentications`.`uid` = '1048451188209770497' AND `authentications`.`provider` = 'twitter' ORDER BY `authentications`.`id` ASC LIMIT 1
  ↳ app/controllers/oauths_controller.rb:8
   (0.2ms)  BEGIN
  ↳ app/controllers/oauths_controller.rb:13
  User Exists (3.4ms)  SELECT  1 AS one FROM `users` WHERE `users`.`uuid` = '7gl0ZsQ_tTbl' LIMIT 1
  ↳ app/models/user.rb:21
  User Create (1.5ms)  INSERT INTO `users` (`uuid`, `name`, `description`, `created_at`, `updated_at`) VALUES ('7gl0ZsQ_tTbl', 'aiandrox', '小学校の先生やってた。エンジニア目指してRailsとか頑張ってる。#RUNTEQ 1月生。謎解き好き。', '2020-03-28 22:44:24', '2020-03-28 22:44:24')
  ↳ app/controllers/oauths_controller.rb:13
   (0.2ms)  ROLLBACK
  ↳ app/controllers/oauths_controller.rb:13
Completed 500 Internal Server Error in 1349ms (ActiveRecord: 42.5ms)

Mysql2::Error - Field 'twitter_id' doesn't have a default value:
  app/controllers/oauths_controller.rb:13:in `callback'

데이터베이스 측에서 twitter_id 열에 null: false 제약을 가했기 때문에이 오류가 발생했습니다.
확실히 로그를 보면 twitter_id 컬럼에는 아무것도 들어 있지 않다.

해결책



config/sorcery.rb
  config.twitter.user_info_mapping = {
-   twitter_id: 'user_id',
+   twitter_id: 'id',
    name: 'name',
    description: 'description'
  }

Twitter에서 가져오는 데이터 매개변수가 잘못되었습니다.
참고 : User Object (사용자 개체) 설명

결론



특별한 내용은 아니지만 참고가 되시면 다행입니다.
지적 등이 있으면 댓글이나 편집 요청으로 부탁드립니다.

기타 참고 사이트


  • 【Rails】Sorcery에서 Twitter 인증 [2] | Artefact | note
  • 좋은 웹페이지 즐겨찾기