Rails加载Google API Client失败:client_secrets.json找不到求助
解决Rails中Google Client Secrets文件找不到的问题
首先,咱们先搞清楚为啥会出现这个错误:Google::APIClient::ClientSecrets.load方法默认只会在当前工作目录或者通过环境变量GOOGLE_CLIENT_SECRETS指定的路径查找文件,它并不会自动去Rails的config/目录下搜索,这就是你明明放了文件却找不到的核心原因。
下面给你几个可行的解决方案:
方案1:显式指定文件路径
最直接的办法就是在调用load方法时,传入client_secrets.json的完整路径,利用Rails的Rails.root来拼接绝对路径,确保能精准找到文件:
require 'google/apis/drive_v2' require 'google/api_client/client_secrets' # 显式指定config目录下的文件路径 client_secrets = Google::APIClient::ClientSecrets.load(Rails.root.join('config', 'client_secrets.json')) auth_client = client_secrets.to_authorization auth_client.update!( :scope => 'https://www.googleapis.com/auth/drive.metadata.readonly', :redirect_uri => 'http://www.example.com/oauth2callback', :additional_parameters => { "access_type" => "offline", # offline access "include_granted_scopes" => "true" # incremental auth } )
方案2:检查文件权限
虽然概率不高,但可以确认一下config/client_secrets.json的文件权限是否允许Rails进程读取。在终端执行下面的命令调整权限:
chmod 644 config/client_secrets.json
方案3:直接传入配置信息(不推荐生产环境)
如果只是临时测试,或者不想依赖文件,也可以直接把client_secrets.json里的内容硬编码到代码中:
require 'google/apis/drive_v2' require 'google/api_client/client_secrets' # 直接构造ClientSecrets对象 client_secrets = Google::APIClient::ClientSecrets.new( { "web" => { "client_id" => "你的客户端ID", "client_secret" => "你的客户端密钥", "redirect_uris" => ["http://www.example.com/oauth2callback"], "auth_uri" => "https://accounts.google.com/o/oauth2/auth", "token_uri" => "https://oauth2.googleapis.com/token" } } ) auth_client = client_secrets.to_authorization # 后续配置和之前一样...
额外建议:使用官方推荐的新库
注意:google-api-client这个旧库已经不再被Google积极维护了,官方现在推荐使用google-auth-library-ruby和对应的API客户端库。这里给你一个新库的使用示例,同样支持读取config/下的密钥文件:
require 'googleauth' require 'google/apis/drive_v2' # 指定权限范围 scopes = ['https://www.googleapis.com/auth/drive.metadata.readonly'] # 从config目录加载客户端密钥 client_id = Google::Auth::ClientId.from_file(Rails.root.join('config', 'client_secrets.json')) # 可选:设置令牌存储(用于持久化刷新令牌) token_store = Google::Auth::Stores::FileTokenStore.new(file: Rails.root.join('config', 'tokens.yaml')) authorizer = Google::Auth::UserAuthorizer.new(client_id, scopes, token_store) # 获取凭证(如果没有则会触发授权流程) user_id = 'default' credentials = authorizer.get_credentials(user_id)
这个新库的API设计更简洁,也更符合当前Google OAuth2的最佳实践,推荐你迁移过去。
内容的提问来源于stack exchange,提问作者rony
相关产品推荐
相关产品推荐

