Development Tip

Sinatra-API-인증

yourdevel 2020. 12. 8. 20:08
반응형

Sinatra-API-인증


Sinatra에서 작은 API 애플리케이션을 개발할 것입니다. API 호출을 보호하는 데 사용할 수있는 인증 옵션은 무엇입니까?


Sinatra에는 기본 제공 인증 지원이 없습니다. 사용할 수있는 일부 gem이 있지만 대부분은 사용자 인증 (예 : 웹 사이트 용)을 위해 설계되었습니다. API의 경우 과잉처럼 보입니다. 직접 만드는 것은 쉽습니다. 각 경로의 요청 매개 변수를 확인하여 유효한 API 키가 포함되어 있는지 확인하고 그렇지 않은 경우 401 오류를 반환합니다.

helpers do
  def valid_key? (key)
    false
  end
end

get "/" do
  error 401 unless valid_key?(params[:key])

  "Hello, world."
end

#  $ irb -r open-uri
#  >> open("http://yourapp.com/api/?key=123")
#  OpenURI::HTTPError: 401 Unauthorized

호출 후 아무것도하는 error당신의 일이 일어날 것 valid_key?- 잘못된 방법 반환  error호출 halt계속의 요청을 중지하는 내부.

물론 각 경로의 시작 부분에서 확인을 반복하는 것은 이상적이지 않습니다. 대신 경로에 조건을 추가하는 작은 확장을 만들 수 있습니다.

class App < Sinatra::Base
  register do
    def check (name)
      condition do
        error 401 unless send(name) == true
      end
    end
  end

  helpers do
    def valid_key?
      params[:key].to_i % 2 > 0
    end
  end

  get "/", :check => :valid_key? do
    [1, 2, 3].to_json
  end
end

모든 경로에 대한 인증 만 원하면 before핸들러를 사용하십시오 .

before do
  error 401 unless params[:key] =~ /^xyz/
end

get "/" do
  {"e" => mc**2}.to_json
end

http://www.secondforge.com/blog/2014/11/05/simple-api-authentication-in-sinatra/ 에는 사용자 토큰을 사용하는 약간 더 자세한 답변이 있습니다.

이는 API 키보다 한 단계 더 복잡하지만 이름 / 이메일 / 비밀번호 편집 또는 사용자 별 정보 액세스와 같은 작업을 수행하기 위해 사용자 로그인을 위해 API에 인증이 필요한 경우 필요합니다. (예 : "비공개"API 작업). 사람들이 로그 아웃 할 수 있도록 사용자 토큰을 취소 / 만료 할 수도 있습니다.

class App < Sinatra::Base

  before do
    begin
      if request.body.read(1)
        request.body.rewind
        @request_payload = JSON.parse request.body.read, { symbolize_names: true }
      end
    rescue JSON::ParserError => e
      request.body.rewind
      puts "The body #{request.body.read} was not JSON"
    end
  end

  post '/login' do
    params = @request_payload[:user]

    user = User.find(email: params[:email])
    if user.password == params[:password] #compare the hash to the string; magic
      #log the user in
    else
      #tell the user they aren't logged in
    end
  end
end

(JSON 본문 대신 HTTP 헤더에서 자격 증명을 읽는 것이 더 일반적이지만 작성자가 언급합니다.)


최신 정보

Nowadays Token Based Authentication are getting popular. I'd recommend to use the ruby implementation of the JWT Standard by ruby-jwt for simple authentication and authorization.

gem 'jwt'

참고URL : https://stackoverflow.com/questions/3479737/sinatra-api-authentication

반응형