Jako że tutaj (i wszędzie :)) do autoryzacji i zarządzania użytkownikami poleca się plugin authlogic, to ja nie mogę odstawać od reszty.
Grzecznie przepisałem do swojej aplikacji kod z oficjalnego demo ( http://github.com/binarylogic/authlogic_example/tree/with-openid ) no i wygląda na to że wszystko działa, acz kolwiek nie do końca.
Spróbójcie zalogować się z użyciem OpenId wpisując w pole openid byle co, efektem takiej akcji jest:
[code]Processing UserSessionsController#create (for 79.186.33.37 at 2009-06-12 23:54:51) [POST]
Parameters: {“user_session”=>{“openid_identifier”=>“asdasd”, “password”=>"[FILTERED]", “login”=>"", “remember_me”=>“0”}, “action”=>“create”, “authenticity_token”=>“YS2IQQIpaqKS/1dJlDk+X+FRxO0oqzqR+xD4lwMbTc8=”, “controller”=>“user_sessions”}
User Columns (1.5ms) SHOW FIELDS FROM users
[OPENID] No usable OpenID services were found for “http://asdasd/”
Rendering rescues/layout (internal_server_error)[/code]
Aplikacja chce mnie przekierować do create.erb mimo tego że wcześniej zdeklarowałem że wrazie wypadku mam zostać przeniesiony znowu do akcji new:
def create
@user = User.new(params[:user])
@user.save do |result|
if result
flash[:notice] = "Account registered!"
redirect_back_or_default account_url
else
render :action => :new
end
end
end
Moje pytanie jest następujące, jak przełapać wyjątek ([OPENID] No usable OpenID services were found for “http://asdasd/”)?
Authlogic jest wrapperem na railsowy plugin openid_authentication. Polecam używać go bezpośrednio, bez korzystania z authlogic openid. Z authlogic openid miałem kilka problemów i zrezygnowałem z niego. Pozatym openid_authentication daje większą kontrolę nad tym co robimy.
Co do problemu to spróbuj znormalizować url przed wysłaniem rządania do dostawcy openid:
OpenIdAuthentication.normalize_url(user.identity_url)
Beerkg, normalizacja url niestety nie pomaga, dalej ten sam błąd. Analizuje kod tego plugina i za cholere nie wiem dlaczego w razie niepowodzenia chce wyświetlić akcje create.
Prosiłeś na priwa o udostępnienie tego kodu, ale może komuś jeszcze się przyda więc umieszczę go tutaj:)
Mniej więcej tak:
class UserSessionsController < ApplicationController
def create
if using_open_id?
open_id_authentication
else
password_authentication
end
end
protected
def password_authentication
# Tutaj standardowa autentykacja
end
def open_id_authentication
authenticate_with_open_id do |result, identity_url, registration|
if result.successful? @user = User.find_or_initialize_by_openid_identifier(identity_url)
if @user.new_record? @user.create_user_with_openid
end
user_session = UserSession.new @user # Tutaj ustawiamy sesje authlogic
user_session.save
redirect_user_back_or_default home_path
else
@user_session = UserSession.new
flash.now[:error] = result.message
render :action => :new
end
end
end
end
Wyciągnąłem to z działającego kodu ale zmieniłem kilka nazw i wywaliłem kilka rzeczy żeby było bardziej czytelne, więc mogą być jakieś literówki. Nie gwarantuję że zadziała bez zmian, ale powinien ci dać pojęcie jak powinna wyglądać autentykacja z openid.
Metodę create_user_with_openid możesz wywalić, a zamiast niej po prostu stworzyć usera. Ja w niej ustawiam kilka pól i nic więcej skomplikowanego nie robię.