2013-04-04 6 views
2

HTTP 다이제스트 인증을 기반으로 사용자를 인증하는 루비 애플리케이션 용 API를 만드는 중입니다. Grape API 라이브러리를 사용하기로 결정한 이유는 Ruby에서 API 클리너를 생성하기 때문입니다. 포도 문서는 다이제스트 인증처럼 사용할 수있는 상태 :포도 API 및 HTTP 다이제스트 인증

위의 포도 구현은 Rack::Auth::Digest::MD5

의 래퍼 지금 또한 보안을 위해 내가 RFC 2617의 당신이 저장하지 않아도 읽을 수있다

http_digest({ :realm => 'Test Api', :opaque => 'app secret' }) do |username| 
    # lookup the user's password here 
    { 'user1' => 'password1' }[username] 
end 

영역 : 당신은 사용자 이름의 MD5 다이제스트를 저장하는 데이터베이스에 일반 텍스트로 암호가에 대한 암호 authticate 그래서 나는 DataMapper 모델 생성 : 지금이 제공하는 것과

class Key 
    include DataMapper::Resource 

    property :id,    Serial 

    property :username,  String 
    property :password,  String 

    property :active,   Boolean, :default => true 
    property :created_at,  DateTime, :default => DateTime.now 
    property :updated_at,  DateTime 
end 

을 나는 방법으로 손실입니다 이들을 연결하는 우와 그것을 작동하게하십시오.

답변

3

불행히도 Rack::Auth::Digest::MD5은 서버 측에서 일반 텍스트 비밀번호가 필요합니다.

포도 예제 코드는 하드 코드 된 암호 검색을 보여줍니다.

당신은 당신이 Key 클래스 일반 텍스트 암호를 저장

Key.first(:username => username).password 

제공과 { 'user1' => 'password1' }[username]을 대체 할 수 있습니다. 열쇠 관리를 위해 상대적으로 복잡하고 비용이 많이 드는 계획을 세우지 않는 한 이러한 가역적으로 암호화 된 데이터를 저장할 수 있습니다.

해시 암호를 저장할 수있는 방법이 있는지 잘 모릅니다. MD5는 가장 안전한 해싱 선택이 아닙니다. 보안이 API의 중요한 관심사 인 경우 다이제스트 인증 이외에도 https를 사용하는 것이 좋습니다.

편집 :

auth :http_digest, { :realm => { :realm => 'Llama', :passwords_hashed => true, :opaque => "7302c32d39bbacb5ed0ace096723fd" } } do |username| 
    Digest::MD5.hexdigest('fred:Llama:654321') 
end 

이 예제는 하드 -을 제공합니다 : 당신이 MD5'd 암호를 저장할 수 않는 포도의 예를 들면 다음과 같은 변화가 왕복 토론의 비트에 따라 코드화 된 사용자 이름 : 'fred', 암호 : '654321'응답. 그래서 나는 당신의 목표 코드가 같은 생각 :

auth :http_digest, { :realm => { :realm => 'Llama', :passwords_hashed => true, :opaque => "7302c32d39bbacb5ed0ace096723fd" } } do |username| 
    k = Key.first(:username => username) 
    k ? k.password : nil 
end 

을 그리고 당신은 각 사용자의 암호 속성에 Digest::MD5.hexdigest("#{username}:#{realm}:#{password}")의 결과를 저장합니다.

:realm을 두 번 사용하여 더블 레벨 해시에 유의하십시오. 이것은 약간 해키지만, 적어도 자신의 미들웨어를 작성할 필요는 없지만, Grape은 여전히 ​​그것을 처리하고 있습니다. 이것은 이 아니며 포도의 문서화 된 기능이거나 테스트가 포함되어 있으므로 이후 버전에서는 작동하지 않을 수 있습니다.

+0

[Rack Digest MD5] (https://github.com/rack/rack/blob/master/lib/rack/auth/digest/md5.rb)를 둘러보고 난 후에'attr_writer : passwords_hashed' 'true'로 설정되면'username : realm : password' 형식으로 이미 해시 된 암호를 받아 들일 것입니다.이 암호는 Grape API 래퍼에서 해당 속성을 설정하는 데 문제가 있습니다. 어떤 제안? – ny95

+0

포도 코드를 살펴보면': realm, : opaque, : passwords_hashed' 키가 포함 된': realm' 심볼에 해시를 제공 할 수 있습니다. . . Grape에서는 문서화되지 않았거나 테스트되지 않았으므로 원하는 뒷문이 약간 있습니다.나는 그것을 테스트했지만, 그것은 나를 위해 작동하지 않았다. –

+0

나는 무슨 일이 일어나는지 보려고 노력할 것입니다. 불투명 한 값에 대해서는 무엇이 중요합니까, 예를 들어'SecureRandom.hex (15)'로 설정할 수 있습니까? – ny95