【问题标题】:How can I store Google API Credentials using Rails Secrets?如何使用 Rails Secrets 存储 Google API 凭据?
【发布时间】:2021-03-30 10:37:41
【问题描述】:

这个问题与How can I authorize a Google Service Account without the default credentials file? 类似,但具体是关于如何使用 Rails 内置的机密/凭据功能。

我意识到它必须是 JSON,但是当我将凭据存储在私有方法中并将该方法传递给 json_key_io 时,我得到了 NoMethodError

def call
  auth = Google::Auth::ServiceAccountCredentials.make_creds(
    json_key_io: credentials,
    scope: Google::Apis::ClassroomV1::AUTH_CLASSROOM_ROSTERS
  )
end

private

  def credentials
    @credentials ||= {
      type: "service_account",
      project_id: Rails.application.credentials.google[:project_id],
      private_key_id: Rails.application.credentials.google[:private_key_id],
      private_key: Rails.application.credentials.google[:private_key],
      client_email: Rails.application.credentials.google[:client_email],
      client_id: Rails.application.credentials.google[:client_id],
      auth_uri: "https://accounts.google.com/o/oauth2/auth",
      token_uri: "https://oauth2.googleapis.com/token",
      auth_provider_x509_cert_url: "https://www.googleapis.com/oauth2/v1/certs",
      client_x509_cert_url: Rails.application.credentials.google[:client_x509_cert_url],
    }.to_json
  end

NoMethodError (undefined method ``read' for "{\"type\":\"service_acco...

【问题讨论】:

    标签: ruby-on-rails google-api-ruby-client


    【解决方案1】:

    我遗漏的关键点(正如this answer 中的miggitymac 所指出的)是客户端需要一个IO 对象(一个文件),而不是一个字符串。

    加上StringIO.new,现在可以按预期工作:

    def call
      auth = Google::Auth::ServiceAccountCredentials.make_creds(
        json_key_io: StringIO.new(credentials),
        scope: Google::Apis::ClassroomV1::AUTH_CLASSROOM_ROSTERS
      )
    end
    
    private
    
      def credentials
        @credentials ||= {
          type: "service_account",
          project_id: Rails.application.credentials.google[:project_id],
          private_key_id: Rails.application.credentials.google[:private_key_id],
          private_key: Rails.application.credentials.google[:private_key],
          client_email: Rails.application.credentials.google[:client_email],
          client_id: Rails.application.credentials.google[:client_id],
          auth_uri: "https://accounts.google.com/o/oauth2/auth",
          token_uri: "https://oauth2.googleapis.com/token",
          auth_provider_x509_cert_url: "https://www.googleapis.com/oauth2/v1/certs",
          client_x509_cert_url: Rails.application.credentials.google[:client_x509_cert_url],
        }.to_json
      end
    

    【讨论】:

    • 我喜欢创建一个辅助方法,所以我不会一遍又一遍地调用Rails.application.credentials。类似:def google_creds(key); Rails.application.credentials[key.to_sym]; end
    • @Int'lManOfCodingMystery 只需在方法中使用局部变量 - creds = Rails.application.credentials.google 就可以完成这项工作。
    • 是的,我建议了这个方法,以防它需要在其他任何地方访问,但是如果只在这里使用变量会更好
    猜你喜欢
    • 2019-12-04
    • 2016-03-25
    • 1970-01-01
    • 2015-05-23
    • 2021-10-12
    • 2016-03-04
    • 2013-11-20
    • 1970-01-01
    • 2013-09-19
    相关资源
    最近更新 更多