일반적으로 응용 프로그램에 응용 프로그램에서 변경 값을 하드 코딩하는 것이 바람직하지 않습니다 가장 확실히 비밀번호 나 보안 토큰 내부에서만 값, 초기 단계의 프로토 타입 또는 임시 방편를 하드 확인 될 수도 있지만!
이 값을 다음과 같이 구성 할 것을 권장합니다. 사람들이 표준 환경 변수 (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 호출로 처리하거나, 바람직하게는 계정 별 샌드 박스 자격 증명에 대한 지원을 추가하십시오.
기본 하드 코딩 된 app_secret의 문제는 사용자가 앱을 읽고 앱에 사용할 수 있다는 것입니다. 다른 예제를 만들 수 있다면 Google API 키를 생각해 봅시다. 열쇠는 비밀로 유지해야하며, 사용자는이를 남용 할 수 있습니다 (모든 요청에 대해 요금이 부과됩니다). 컴파일 된 응용 프로그램을 사용하면 일반적으로 키가 하드 코딩되고 이진 파일에서 난독 화되지만 루비는 컴파일되지 않습니다. – IgnazioC
그 이유는 필자가 내 대답에서 언급하지 않은 것은 보석에 절대 포함하지 말아야한다는 것입니다. 컴파일 된 응용 프로그램에서도 상대적으로 쉽게 메모리를 검사하여 키를 추출합니다 (대부분의 소프트웨어에 금이 간다). 보석이 사용 가능한 Google API 키에 의존한다면 보석 제작자가 아니라 사용자에게 제공해야 할 책임이 있습니다. 그게 네 보석 이냐? – marcelowiermann
예. 다른 개발자를위한 보석을 만들면 나는 동의하지만, 최종 사용자를위한 도구를 만들면 자신의 API 키를 제공해야합니다. 이것이 일반적인 질문이라고 할 수 있습니다. "개인 데이터를 루비 스크립트에 저장할 수 있습니까?" – IgnazioC