루비 온 레일즈에서 OpenID 로그인
해봤더니 기본적인 기능은 무척 쉽게 작동시킬 수 있었다.
설치
먼저 openid_login_generator를 설치한다. 이건 login_generator의 openid버전이고 login_generator와 거의 똑같은 방법으로 쓸 수 있다고 한다.
- gem install openid_login_generator
생성기를 실행한다.
- ./script/generate openid_login auth
다음과 같은 파일들이 생성된다.
- create lib/openid_login_system.rb
create app/controllers/auth_controller.rb
create test/functional/auth_controller_test.rb
create app/helpers/auth_helper.rb
create app/models/user.rb
create test/unit/user_test.rb
create test/fixtures/users.yml
create app/views/layouts/scaffold.rhtml
create public/stylesheets/scaffold.css
create app/views/auth
create app/views/auth/welcome.rhtml
create app/views/auth/login.rhtml
create app/views/auth/logout.rhtml
create README_LOGIN
'README_LOGIN' 파일에 필요한 것들은 거의 기록되어 있다. 열어서 따라한다. 애플리케이션 콘트롤러 ('app/controllers/application.rb')를 열어서 다음과 같이 보이도록 바꾼다.
- require_dependency "openid_login_system"
class ApplicationController < ActionController::Base
include OpenidLoginSystem
model :user
테이블 만들기
'app/models/user.rb'파일은 만들어져 있지만, db에는 아무것도 없기 때문에 users 테이블을 추가해야 한다. user.rb를 열어보면 이런 메쏘드 딱 하나가 있다.
- def self.get(openid_url)
find_first(["openid_url = ?", openid_url])
end
users 테이블에 'openid_url'라는 컬럼만 만들어주면 openid login이 작동한다. migration을 하나 만들어서 테이블을 만들어 준다.
- class InitialSchema < ActiveRecord::Migration
def self.up
create_table "users" do |t|
t.column "openid_url", :string
t.column "name", :string
t.column "email", :string - end
- end
- def self.down
- drop_table "users"
- end
이제 마이그레이션을 실행하고
- rake db:migrate
편한 툴로 테이블이 잘 만들어졌는지 본다.
뷰 손보기
이제 http://localhost:3000/auth/login 으로 접근하면 로그인폼이 나올 것이다. 근데 오픈아이디 로고도 없고 영 멋이 없다. 먼저 뷰를 모범답안으로 수정한다. app/views/login.rhtml의 input 태그를 다음처럼 바꾼다.
- <input type="text" name="openid_identifier" class="openid_login" size="30" value=""/><br/>
name 속성을 바꾸었으니 컨트롤러('auth_controller.rb')를 열어서
- @params[:openid_url]
를
- @params[:openid_identifier]
로 고쳐준다.
그 다음에 'public/stylesheets/scaffold.css'나 아니면 자신의 레이아웃에서 사용하는 css파일에 다음을 추가한다.
- input.openid_login {
background: url(http://openid.net/login-bg.gif) no-repeat;
background-color: #fff;
background-position: 0 50%;
color:#000;
padding-left: 18px;
}
이제 다시 페이지를 열어보면 폼이 이뻐졌을 것이다. ㅎㅎ
사용하기
사용은 간단하다. 접근을 제한하고 싶은 컨트롤러에다가
- class SomeController < ApplicationController
before_filter :login_required
라고 써 주면 된다. 메쏘드별로 접근을 제한하고 싶으면 :only, :except를 쓸 수 있다.
- before_filter :login_required, :only => [:myaccount, :changepassword]
before_filter :login_required, :except => [:index]
현재 사용자의 아이디는
- @session[:user_id]
에 저장되어 있다. 예를 들어
- user = User.find(@session[:user_id])
이런 식으로 사용하면 된다.
이 글은 스프링노트에서 작성되었습니다.