【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 (사용자 개체) 설명
결론
특별한 내용은 아니지만 참고가 되시면 다행입니다.
지적 등이 있으면 댓글이나 편집 요청으로 부탁드립니다.
기타 참고 사이트
Reference
이 문제에 관하여(【Rails】Sorcery에서 Twitter 인증), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/aiandrox/items/5435c8b285c7dc0c455f텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)