2016-08-12 2 views
0

나는 웹 서비스와 상호 작용하는 루비 보석을 썼다. 이 젬은 하드 코드 된 값 client idapplication secret을 포함합니다.비밀 문자열을 GEM에 저장하는 방법은 무엇입니까?

다른 누구나 자신의 스크립트에서 내 데이터를 사용할 수 있으며 그의 요청에 대해 요금이 부과됩니다. :(

다른 손에

그들이 안전한 방법으로 이러한 정보를 저장하는 방법에 대한 새 개인 application secret.

모든 아이디어를 얻기 위해, 새로운 응용 프로그램을 작성해야하는 경우가 누구나 나쁜 것입니까?

답변

0

일반적으로 응용 프로그램에 응용 프로그램에서 변경 값을 하드 코딩하는 것이 바람직하지 않습니다 가장 확실히 비밀번호 나 보안 토큰 내부에서만 값, 초기 단계의 프로토 타입 또는 임시 방편를 하드 확인 될 수도 있지만!

이 값을 다음과 같이 구성 할 것을 권장합니다. 사람들이 표준 환경 변수 (Heroku와 같은 PaaS 환경에서 매우 일반적)를 통해 또는 필요할 경우 초기화 프로그램을 통해 쉽게 설정할 수있는 방법. 예외는 개발 데이터베이스의 URL로 제정신이 기본값입니다 (예 : 레디 스 '기본 127.0.0.1:6379)

module MyGem 
    class Configuration 
    attr_writer :client_id, :application_secret, :url 

    # Expects a MY_GEM_CLIENT_ID env var to be set in production 
    def client_id 
     @client_id ||= ENV.fetch('MY_GEM_CLIENT_ID', 'CLIENT_ID') 
    end 

    # Expects a MY_GEM_APPLICATION_SECRET env var to be set in production  
    def application_secret 
     @application_secret ||= ENV.fetch('MY_GEM_APPLICATION_SECRET', 'SECRET') 
    end 

    # ENV driven config but with working default 
    def url 
     @url ||= ENV.fetch('MY_GEM_URL', 'https://myservice.com/v1/api') 
    end 
    end 

    def self.configure(&block) 
    block.call(configuration) 
    end 

    def self.configuration 
    @configuration ||= Configuration.new 
    end 
end 

# config/initializers/my_gem.rb in Rails 
# CustomConfigObject could be a Mixlib configuration object 
MyGem.configure do |config| 
    config.client_id = CustomConfigObject.my_gem.client_id 
    config.application_sercret = CustomConfigObject.my_gem.application_secret 
    config.url = CustomConfigObject.my_gem.url 
end 

만약 위의 코드의 이니셜 기반 설정 당신 절대적으로은 클라이언트 ID와 응용 프로그램 비밀의 기본 "샌드 박스"세트를 제공해야합니다 위의 코드 (두 번째 인수는 ENV.fetch())의 기본값으로 해당 값을 제공 할 수 있지만 sandbox 부울 설정을 추가하여 true/false로 설정하고 API 호출과 함께 보내면 API가 sandbox/dev 호출로 처리하거나, 바람직하게는 계정 별 샌드 ​​박스 자격 증명에 대한 지원을 추가하십시오.

+0

기본 하드 코딩 된 app_secret의 문제는 사용자가 앱을 읽고 앱에 사용할 수 있다는 것입니다. 다른 예제를 만들 수 있다면 Google API 키를 생각해 봅시다. 열쇠는 비밀로 유지해야하며, 사용자는이를 남용 할 수 있습니다 (모든 요청에 ​​대해 요금이 부과됩니다). 컴파일 된 응용 프로그램을 사용하면 일반적으로 키가 하드 코딩되고 이진 파일에서 난독 화되지만 루비는 컴파일되지 않습니다. – IgnazioC

+0

그 이유는 필자가 내 대답에서 언급하지 않은 것은 보석에 절대 포함하지 말아야한다는 것입니다. 컴파일 된 응용 프로그램에서도 상대적으로 쉽게 메모리를 검사하여 키를 추출합니다 (대부분의 소프트웨어에 금이 간다). 보석이 사용 가능한 Google API 키에 의존한다면 보석 제작자가 아니라 사용자에게 제공해야 할 책임이 있습니다. 그게 네 보석 이냐? – marcelowiermann

+0

예. 다른 개발자를위한 보석을 만들면 나는 동의하지만, 최종 사용자를위한 도구를 만들면 자신의 API 키를 제공해야합니다. 이것이 일반적인 질문이라고 할 수 있습니다. "개인 데이터를 루비 스크립트에 저장할 수 있습니까?" – IgnazioC

관련 문제