Languages/Ruby or Rails2008.07.29 09:06
Openid를 사용한 로그인 기능을 Rails를 사용하여 구현하면 굉장히 간단히 구현가능한 것으로 알려져 있습니다. http://www.aproxacs.com/122 를 보면 잘 알수 있는데요, 그런데 시키는대로 따라하다보면 뭔가 이상한 문제들이 한두가지 생기는 것을 발견할 수 있습니다.

Web Password 팝업 창이 뜬다

http://www.aproxacs.com/122 이 글에 나온 대로 구현을 하다 보면, application controller (application.rb) 를 변경해서 login_required를 before_filter로 적용하는 부분을 볼 수 있습니다. 그 의미인 즉슨 login이 안된 상태에서 action을 실행하려고 하면 (sessions 컨트롤러의 메소드들은 제외) 전부 login 창으로 redirection 되도록 만들기 위함인데, 문제는 IE 상에서 가끔 sessions 컨트롤러의 액션이 아닌 다른 액션에 접근하려고 해 보면, Openid로그인창으로 redirection이 되는게 아니라, Web Password 팝업 창이 떠버린다는 점입니다.

이 문제는 lib/ 디렉터리 아래에 있는 authenticated_system.rb 파일에 정의되어 있는 다음 메소드 때문에 발생합니다.

    def access_denied
      respond_to do |format|
        format.html do
          store_location
          redirect_to new_session_path
        end
# bjlee:
# block following 3 lines to remove annoying 'Web Password' Popup
# is displayed on the screen especially for IE.
#
#        format.any do
#          request_http_basic_authentication 'Web Password'
#        end

      end
    end

이 문제를 가장 '간단하게' 해결하려면, 위에서 보는 것 처럼 format.any do 부터 end까지를 comment 처리해주면 됩니다. (물론, 그다지 바람직한 해결책이라고는 볼 수 없습니다만...)

로그인 후에 로그인 전에 마지막으로 방문했던 페이지로 돌아가지 못한다

보통 사람들이 기대하는 것이, 로그인이 되고 나면 그 전에 마지막으로 보고 있었던 페이지로 돌아가는 것일텐데요. http://www.aproxacs.com/122 에 나온대로 해 두고 따라해 보면 그 이전 페이지로 돌아가려다가 메소드가 없다느니 객체가 nil이라느니 하는 등등의 오류 메시지가 뜰 때가 있습니다.

그것은 app/controllers/sessions_controller.rb 파일에 있는 successful_login 메소드에 포함된 오류 때문입니다. 다음과 같이 수정하면 해결됩니다.

    def successful_login
        if params[:remember_me] == "1"
            self.current_user.remember_me
            cookies[:auth_token] = {
                :value => self.current_user.remember_token ,
                :expires => self.current_user.remember_token_expires_at
            }
        end
        if ( session[:return_to] != nil )
            redirect_to session[:return_to]
        else
            redirect_to( '/' )
        end
    end

적색으로 표시한 부분이 수정한 부분입니다.



신고
Posted by 이병준

소중한 의견, 감사합니다. ^^

Languages/Erlang2008.07.04 12:28

yaws를 설치했다면 Erlyweb도 설치해보고 싶은 것이 인지상정일 터인데, 설치 방법이 간단하긴 하지만 그렇다고 한방에 잘 되지도 않는다. 다음과 같이 하면 큰 무리 없이 잘 될 것.

BASIC TROUBLESHOOTING : 설치시 생기는 문제들

우선, http://erlyweb.org/ 에 가서 최신 버전의 erlyweb distribution을 받는다. 그런 다음에 erlang의 lib 디렉터리 아래에다 이 파일의 압축을 푼다. 필자의 경우, /usr/lib/erlang/lib 아래에 풀어주었다. erlang library가 어디에 설치되어 있는지 모르겠다면, erl 프롬프트상에서 code:lib_dir(). 를 입력하고 리턴 키를 눌러주면 된다.

원래는 (?) 압축을 풀어주는 것 만으로 모든 것이 해결되어야 한다. 제대로 되었다면, 이제 작업 디렉터리로 가서 erl 셸을 실행한 다음에 다음과 같이 해 본다.

1> erlyweb:create_app("testapp", ".").


이렇게 하면 다음과 같은 메시지가 나오면서 해당 디렉터리 아래에 src,www, ebin 등의 디렉터리가 생성되어야 한다.

1> erlyweb:create_app("testapp", ".").
info:erlyweb_util:39: creating "./testapp"
info:erlyweb_util:39: creating "./testapp/src"
info:erlyweb_util:39: creating "./testapp/src/components"
info:erlyweb_util:39: creating "./testapp/www"
info:erlyweb_util:39: creating "./testapp/ebin"
info:erlyweb_util:70: creating "./testapp/src/components/html_container_view.et"
info:erlyweb_util:70: creating "./testapp/src/components/html_container_controller.erl"
info:erlyweb_util:70: creating "./testapp/src/mh20_app_controller.erl"
info:erlyweb_util:70: creating "./testapp/www/index.html"
info:erlyweb_util:70: creating "./testapp/www/style.css"
ok


그런데 잘 되지 않고, 간혹(?)

=ERROR REPORT==== 17-May-2007::11:43:31 ===
beam/beam_load.c(1097): Error loading module erlyweb:
  use of opcode 136; this emulator supports only up to 129


위와 유사한 오류 메시자가 뜨는 경우가 있다. 그럴 때는 erlyweb 빌드를 다시 해 주어야 한다. /usr/lib/erlang/lib/erlyweb-1.76 (필자의 경우) 로 cd 한 다음에, make clean ; make를 때려주자. 십중팔구는 그것도 잘 안될 것이다. 오류 메시지를 유심히 보면, yaws_api.hrl 파일을 찾지 못하는 것이 원인임을 알 수 있다.

그 때는 cd src/erlyweb을 일단 하자. 위의 문제를 해결하는 데는 여러 가지 우아한 다른 방법이 있을 수 있겠지만, 성질급한 사람에게 추천하는 가장 빠른 방법은, 이 디렉터리 안에서

ln -s <yaws 헤더 파일이 있는 디렉터리>/yaws_api.hrl .


를 해 주는 것이다. 필자의 경우 저 디렉터리는 yaws를 local home directory에 설치했기 때문에 /home/bjlee/packages/yaws-1.76/include 였다.

이렇게 한 다음에 다시 cd ../.. 해서 /usr/lib/erlang/lib/erlyweb-1.76 (필자의 경우) 로 간 다음에 make를 때려보면 정상적으로 컴파일이 될 것이다.

그 다음으로 남은 일은 http://www.ibm.com/developerworks/kr/library/opendw/20080617/ 여기를 참고하면 될 것이다. :-)

MORE TROUBLESHOOTING : 설치 이후

1. 컴파일 문제

그런데 만일 yaws를 띄우는건 잘 되는데 erlyweb app가 컴파일이 잘 안된다면? 특히 다음과 같은 오류 메시지를 내는 경우에는 어떻게 해야 좋을까?

3> erlyweb:compile("testapp", [{erlydb_driver, mysql}, {auto_compile, true}]).
debug:erlyweb_compile:379: Compiling Erlang file "testapp_app_controller"
error:erlyweb_compile:89: Error compiling app controller
** exited: {error,{invalid_module,"testapp/src/testapp_app_controller.erl"}} **

그럴 경우에는 yaws의 interactive command prompt 상에서 pwd().를 해 본다. 아마 testapp를 생성한 디렉터리가 아니게 되어 있을 것이다. 그럴 경우에는

4> cd("/home/bjlee/work/yaws/erlyweb/").


와 같이 해 주면 된다. 필자의 경우에는 저 디렉터리 아래에 testapp 디렉터리가 있었다.

2. MySQL 문제

erlyweb:compile을 처음으로 실행할때는 MySQL을 쓰던 mnesia를 쓰던 사실 별 상관은 없지만, 본격적으로 모델을 만들고 데이터베이스를 붙이려고 하다 보면 이제 문제가 조금씩 발생한다. 가장 크게 문제가 되는 것은 erlyweb:compile이 정상적으로 실행되려면 시스템에 MySQL이 깔려 있어야 한다는 것. (mnesia를 쓰겠다면 아무 문제 없겠지만...)

MySQL을 깔고 나서 yaws interactive shell에서 다음과 같이 해 보자. 이렇게 해 두어야 erlyweb:compile 과정에서 발생하는 문제가 사라진다. 아래의 과정은 mysql server에의 접속 정보를 확인하는 과정과 같은 것이라고 보아도 일단은 무방하다.

erlydb:start(mysql, [{hostname, "localhost"}, {username, "xxxx"}, {password, "yyyy"}, {database, "testdb"}]).

username의 "xxxx" 부분에는 데이터베이스 접근에 사용될 아이디를 적어주시고, password의 "yyyy" 부분에는 해당 사용자의 암호를 적어주시면 된다. database의 "testdb" 부분에는 mysqladmin create <데이터베이스이름> 명령으로 생성한 mysql database 이름을 적어주면 된다.

그런 다음에 erlyweb:compile을 다시 돌려보면 되는데, auto_compile을 true로 해두었다면 사실 안해주어도 무방해야 하지만, 직접 돌려보면 어떤 문제가 있는지를 직접 확인할 수도 있다.

보통 이 단계에서 발생하는 문제는, 다음과 같은 증상으로 나타난다.

** exited: {no_such_table,{{module,test},{table,test}}} **

즉, 모델에 대한 데이터베이스 테이블이 아직 만들어지지 않았다는 것. 이 문제는 mysql 상에서 테이블을 적절히 생성해서 해결해주면 된다.





 

신고
Posted by 이병준

소중한 의견, 감사합니다. ^^