В основном я работаю с PHP и ASP.NET. Недавно я связался с Руби и начал интересные отношения с Padrino
. Не слишком похоже на Rails и не менее похоже на Sinatra.
Я делаю первое серьезное приложение, используя Padrino
, и это не заняло много времени, и я был бы признателен за вашу помощь.
Проблема с тем, что я считаю, с Padrino Admin
. Я пытаюсь заставить пользователей входить на мой веб-сайт, используя Facebook
и Omniauth.
Я следовал этому руководству: Обзор Padrino и Omniauth.
Приложение размещено по адресу Heroku
.
Результат: при входе Facebook
учетная запись создается (в базе данных). Но когда я попадаю в запретную зону, меня перенаправляют обратно на страницу входа.
Вот что у меня есть.
app.rb
module PDeen
class App < Padrino::Application
register Padrino::Admin::AccessControl
register SassInitializer
register Padrino::Rendering
register Padrino::Mailer
register Padrino::Helpers
enable :sessions
# get '/' do
# "Welcome to me @ internet"
# end
use OmniAuth::Builder do
provider :facebook, 'xxxx', 'yyyy'
# provider :facebook, 'app_id', 'app_secret'
end
set :login_page, "/login" # determines the url login occurs
access_control.roles_for :any do |role|
role.protect "/profile"
role.protect "/admin" # here a demo path
end
# now we add a role for users
access_control.roles_for :users do |role|
role.allow "/profile"
end
get :index do
'Hi'
end
get :login do
slim :'index'
end
get :profile do
content_type :text
current_account.to_yaml
end
get :destroy do
set_current_account(nil)
redirect url(:index)
end
get :auth, :map => '/auth/:provider/callback' do
auth = request.env["omniauth.auth"]
# account = Account.find_by_provider_and_uid(auth["provider"], auth["uid"]) ||
# Account.create_with_omniauth(auth)
#
account = User.first( :provider => auth["provider"], :uid => auth["uid"] )
if ! account.nil?
set_current_account(account)
redirect :existing
end
if account.nil?
# Create account
account = User.new
account.uid = auth['uid']
account.name = auth['name']
account.provider = auth['provider']
account.email = auth['user_info']['email'] if auth['user_info']
account.role = 'users'
account.save
end
set_current_account(account)
#redirect "http://" + request.env["HTTP_HOST"] + url(:profile)
redirect :new
end
get :existing do
'existing'
end
get '/session/test' do
session[:test] = 'This is a test'
end
get '/session/print' do
"You saved: #{session[:test]}"
end
end
end
User.rb
class User
include DataMapper::Resource
# property <name>, <type>
property :id, Serial
property :name, String
property :email, String
property :role, String
property :uid, String
property :provider, String
end
Что происходит >>
- Пункт списка
- Я иду на
[server]/profile
~> перенаправляет на[server]/login
- Я нажимаю на Facebook ~> переходит на страницу, чтобы принять приложение ~> перенаправляет обратно в приложение
- Я иду на
[server]/profile
~> перенаправляет на[server]/login
Я думал, что сеансы не работают. Когда я работал над своим первым PHP-приложением, у меня была аналогичная проблема с сеансом. Но оказалось, что это работает. Вот тут-то и появились [server]/session/test
и [server]/session/print
.
Когда я вхожу в Padriono console
в Heroku
и использую User.all
, я вижу запись.
Я также вижу, что пользователь проходит аутентификацию. Что-то должно быть с `
Я проверил модальное окно Padrino admin
Accounts
. Я думаю, что важными параметрами будут id
и role
.
Я сделал что-то не так?
Заранее спасибо. Любая помощь высоко ценится.
Accont
. - person Ziyan Junaideen   schedule 15.09.2013