Как стать автором
Обновить

Комментарии 33

Картинки не хватает в завершении
Я похожие вещи делал на rusrails.ru для авторизации через твиттер, гугл и гитхаб — код можно посмотреть тут github.com/morsbox/rusrails

В принципе все очень похоже.
Ваш пост как нельзя вовремя)
Хороший топик, спасибо за труд!
Есть вопрос по gem 'twitter-bootstrap-rails', у вас команда rails g bootstrap:layout application fixed сгенерировала haml код?
Вроде при подключении haml-rails так происходит, гем twitter-bootstrap-rails поддерживает haml.
О спасип, а я юзал просто haml
В файл инициализации devise.rb не забываем дописываем строчку:
config.omniauth :vkontakte, 'APP_ID', 'APP_SECRET'
Вот так не очень хорошо поступать, стоит сразу привыкать делать правильно, тем более никакой сложности это не вносит. А именно, с oauth секрет кеями вести себя так же, как и с креденшелами к базам данным — выносить в отдельный конфиг, чтобы оно не светилось в репозитории.

config/initializers/devise.rb:
OAUTH_CREDENTIALS_PATH = "#{ENV['HOME']}/mysite/oauth.yml"
OAUTH_CREDENTIALS = YAML.load_file(OAUTH_CREDENTIALS_PATH)[Rails.env]


~/mysite/oauth.yml:

development: &defaults
  :vkontakte:
    :app_id: 1111111
    :app_secret: 11111111111111111111
    :app_permissions: "notify,wall,offline"

test:
  <<: *defaults

staging:
  <<: *defaults

production:
  <<: *defaults
  :vkontakte:
    :app_id: 2222222
    :app_secret: 22222222222222222222
    :app_permissions: "notify,wall,offline"

спасибо за совет
Тогда уж лучше
Rails.root.join("config", "oauth.yml")
/ Le HTML5 shim, for IE6-8 support of HTML elements — лол

Мсье знает толк.
Тема не раскрыта до конца, сделать аутентификацию из социальных сетей действительно не сложно и можно. Самое интересное начинается когда задумываться о том что было бы не плохо что бы система логинила меня в один и тот же аккаунт в не зависимости от того из какой сети я зашел, конечно при условии что я предварительно привязал другие аккаунты либо система видит что они относятся к одному и тому же человеку.

Так например, Логинов через социальные сети очень актуальная штука для ресурсов на которые пользователь ходит редко, соответственно и регестрироваться ему лениво. Так вот при таком раскладе, если я захожу редко, я уже не вспоминаю через что я логинился в прошлый раз.

Если социальная сеть отдает почту то система должна сверяться по ней и логинить меня в соответствующий аккаунт, причем если второй раз я за логинился через другую социальную сеть, то система должна дополнить мой профиль информацией из этой сети.

Ну и самое веселое начинается при подключении профилей из социалок. Если я добавлю профиль, аккаунт которого уже существует, система должна их смерджить

Это я все к тому что если задуматься о том как надо бы все это дело сделать то задача далеко не тривиальная
Позвольте не согласиться: система Вам ничего не должна (-: Не перекладывайте ответственность — помнить сеть, из какой логинились — на чужие плечи. Единственное, что может стоит сделать, — это кукиз какой-то сохранить да и всё, чтоб следующий раз не проходить авторизацию.
Тоже про это подумал, но то, что вы пишете, сделать нельзя. Нет такого признака, по которому можно однозначно определить, принадлежат ли два профиля в фейсбуке и контакте одному и тому же человеку или нет (даже если контакт почту бы давал, у многих соц. сети на разные почты зарегестрированы).
Просто когда уже вошел в аккаунт, подключаешь дополнительные аккаунты уже из своего профиля. Много где это реализовано.
Для теста вконтакта локально не обязательно использовать localtunnel, можно прописать:
Адрес сайта: 127.0.0.1:3000
Базовый домен: 127.0.0.1
Адрес сайта: h t t p ://127.0.0.1:3000
Можно, но при этом callback на production не будет происходить. У Facebook в настройках приложения можно указать два домена (сайт, мобильный сайт), один из которых можно указать свой сайт, а второй — локалхост. А у ВК — только один.
я обычно использую 2 приложения, одно для локального теста, другое для продакшена
ИМХО если нужна простая аутентификация, то легче использовать Loginza.

Остается только забирать данные и при необходимости давать пользователю отредактировать.
Логинза отвратительна. И внешне, и по юзабилити. Как минимум нужно три клика, чтобы войти.
Советую использовать first_or_create! вместо if/else.
Спасибо автору за перевод статьи из официальной вики девайза, правда, конечно, отличия есть, например, вместо скафолда использовал бутсрап, ибо это сейчас модно. Но зачем это все не совсем понятно, в реальной жизни требуется привязка к одному аккаунту, и это более показательно и интересно. Для того чтобы оставить коммент, можно использовать виджеты, там и социальность сразу.
И, кстати, create! тут по мне не уместен, он просто вызовет RecordInvalid, что приведет пользователя к 500 странице, можно и нужно использовать create или find_or_create_by_url или first_or_create, тем более что дальше идет проверка на существование записи.
Есть ещё один вариант хранения переменных авторизации, это просто хранить их в переменных окружения системы, тогда не нужны файла, которые все равно желательно включать в репо.
всегда хотел узнать почему omniauth не передает state параметр для защиты
Перестало работать демо-приложение.
У меня очень нубский вопрос. ФБ сейчас требует сертификат при авторизации. Какой самый правильный способ получать его и подпихивать devise`у?
Разобрался )
А как реализовать получение почты юзера из социалки и если не отдает то запрашивать, чтоб привязывать к одному аккаунту на сайте?
Ответил выше
Не нужно получать почту, нужно авторизоваться во всех провайдерах в одном аккаунте.
/home/constantin/testapplication/app/views/users/index.html.haml:13: syntax error, unexpected '<', expecting keyword_end

 <hh user=users>.each do |user|
  ^
/home/constantin/testapplication/app/views/users/index.html.haml:13: syntax error, unexpected '.'

 <hh user=users>.each do |user|
                 ^

/home/constantin/testapplication/app/views/users/index.html.haml:23: syntax error, unexpected keyword_ensure, expecting $end


Уже не знаю что и делать, что это за ошибка?
Это особенность верстки на Хабре.
<hh user=users> необходимо заменить на @users
спасибо, забыл написать что разобрался)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации