Sphinx를 Shinatra에서 호스팅하면서 Github의 OAuth를 통해 팀 인증을 받았습니다.

Sphinx에서 작성한 문서를 heroku로 호스팅, Continuous Documentation인 추천(Basic 인증 첨부) 의 외전.
『Basic 인증』 => 『Github 인증+ 특정 팀에 속하는가로 열람 가능』으로 변경해 본 코드.

어려움



인증 장소에서 곤란한


  • Basic 인증은 Rack 모듈이었기 때문에 publix 포함한 모든 요청이 대상이었다
  • Github 협력의 sinatra_auth_github는 Sinatra 사양에 따라 다르며 => public에 대한 액세스를 필터링 할 수 없습니다.

    = 1.0/2010-03-23
    - snip -
    * Filters do not run when serving static files anymore. (Ryan Tomayko)
    htps : // 기주 b. 코 m / 시나 t 등 / 시나 t 등 / b b / 마s r / 찬 S

    public에 의존하고있는 Sphinx 호스팅은 sinatra1.0에서이 변화가 매우 힘들다.

    원숭이 패치로 해결되었습니다.



    Important: The following notes on Sinatra::Base and Sinatra::Application are provided for background only - extension authors should not need to modify these classes directly.
    h tp // w w. Shina t 등 rb. 이 m/에 x텐시온 s. HTML

    미안 공식, Sinatra::Base 오픈입니다. before 필터를 public(static) 배달시에도 실행하도록 원숭이했습니다.

    문제 코드



    config.ru
    require 'sinatra'
    require 'sinatra_auth_github'
    set :public_folder, File.dirname(__FILE__) + '/build/html'
    
    use Rack::Session::Cookie,
      :secret => Digest::SHA1.hexdigest(rand.to_s),
      :expire_after => 3600
    
    set :github_options, {
      :scopes    => "user",
      :secret    => ENV['GITHUB_CLIENT_SECRET'],
      :client_id => ENV['GITHUB_CLIENT_ID'],
    }
    
    @@github_team = ENV['GITHUB_TEAM_ID']
    
    register Sinatra::Auth::Github
    
    
    ## Monkey for static filter
    module Sinatra
      class Base
        class_eval do
          alias :org_static! :static!
          def static!
            filter! :before
            org_static!
          end
        end
      end
    end
    
    ## user is team_member?
    before do
      if request.path_info.end_with?('.html')
        begin
          body = github_team_authenticate!(@@github_team)
        rescue
          ## return securocat!
          halt 401, body
        end
      end
      if request.path_info == '/logout'
        logout!
        redirect 'https://github.com'
      end
    end
    
    get '/' do
      redirect "/index.html", 301
    end
    
    not_found do
      unless request.path_info.end_with?('.ico')
        redirect "#{request.path_info}.html", 301
      end
      halt 404
    end
    
    run Sinatra::Application
    

    인증



    우선 *.html 에 대한 요청에 대해, Github 미로그인 or 앱 인증 허가 없이는 Github에 날립니다. Github 인증이 끝나고, 특정 팀에 소속된다면 문서를 열람 OK.

    그렇지 않은 놈은 securocat씨에게 등장 바라는 사양이 되었습니다.



    원숭이 패치 탈출안?


  • Rack의 미들웨어로 Sinatra 앞에서 인증을 받는다
  • public 를 사용하지 않고 어디까지나 get 로 처리해, File.exists?file_send 로 노력한다

  • 무슨 일이야.

    좋은 웹페이지 즐겨찾기