如何用Ruby生成无Scope的GCP Bearer Token(类gcloud命令)
Ruby生成等效gcloud默认应用凭证Token的方法
要实现和gcloud auth application-default print-access-token完全等效的Bearer Token生成效果,你可以参考以下两种方法,无需手动指定自定义scope:
方法一:指定默认Cloud Platform范围
gcloud命令生成的默认Token实际上隐含了https://www.googleapis.com/auth/cloud-platform这个通用权限范围,覆盖绝大多数GCP服务的访问需求。你可以直接在Ruby代码中指定这个scope,代码如下:
require 'googleauth' # 引入默认的Cloud Platform通用范围 default_scope = ['https://www.googleapis.com/auth/cloud-platform'] authorizer = Google::Auth::ServiceAccountCredentials.make_creds( json_key_io: File.open('sa.json'), scope: default_scope ) token = authorizer.fetch_access_token! # 输出Token puts token['access_token']
方法二:自动加载应用默认凭证
如果你不想手动指定服务账号文件,还可以利用googleauth库的应用默认凭证机制,和gcloud的行为完全一致——它会自动查找环境变量、本地gcloud生成的凭证文件等,无需显式传入sa.json:
require 'googleauth' # 自动加载默认凭证,同时指定通用scope authorizer = Google::Auth.get_application_default(['https://www.googleapis.com/auth/cloud-platform']) token = authorizer.fetch_access_token! puts token['access_token']
特殊场景:生成无特定scope的Token
如果确实需要生成不带任何scope的Token(注意:绝大多数GCP服务不接受这种Token),可以手动构造并签名JWT,再请求Token接口,示例代码如下:
require 'jwt' require 'json' require 'time' require 'net/http' require 'uri' # 读取服务账号文件 sa_data = JSON.parse(File.read('sa.json')) private_key = OpenSSL::PKey::RSA.new(sa_data['private_key']) # 构造JWT payload payload = { iss: sa_data['client_email'], aud: 'https://oauth2.googleapis.com/token', exp: Time.now.to_i + 3600, # 有效期1小时 iat: Time.now.to_i, sub: sa_data['client_email'] } # 签名生成JWT jwt = JWT.encode(payload, private_key, 'RS256') # 请求Google Token接口获取无scope的Token uri = URI('https://oauth2.googleapis.com/token') params = { grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer', assertion: jwt } response = Net::HTTP.post_form(uri, params) token_data = JSON.parse(response.body) puts token_data['access_token']
内容的提问来源于stack exchange,提问作者v-so14
相关产品推荐
相关产品推荐

