我正在尝试列出我的Google Apps for Business帐户中的组。我设置了一个服务帐户,并为其提供了服务目录管理员角色。我现在想在我的本地机器上测试它(我正在使用RubyMine通过Rspec运行它(。测试如下所示:
require 'rails_helper'
describe GoogleApiHelper, type: :helper do
it 'should authenticate successfully to Google' do
google_auth_creds = OpenStruct.new authenticate(Api::Application.config.google[:auth][:scopes])
expect(google_auth_creds).to_not be_nil
expect(google_auth_creds.access_token).to match(/[A-Za-z._-]*/)
puts(google_auth_creds)
end
it 'should list all of the groups in the sinkingmoon.com domain' do
groups = OpenStruct.new list_groups 'mydomain.com'
puts(groups)
end
end
测试中的实现如下所示:
require 'googleauth'
require 'google/apis/admin_directory_v1'
module GoogleApiHelper
def authenticate(scopes)
authorizer = Google::Auth::ServiceAccountCredentials.make_creds(
json_key_io: File.open(Api::Application.config.google[:auth][:json_file]),
scope: scopes)
authorizer.fetch_access_token!
end
def retrieve_group(domain, groupId)
authorizer = authenticate(Api::Application.config.google[:scopes])
directory_service = Google::Apis::AdminDirectoryV1::DirectoryService.new
directory_service.authorization = authorizer
directory_service.get_group groupId
end
def list_groups(domain)
authorizer = authenticate(Api::Application.config.google[:scopes])
directory_service = Google::Apis::AdminDirectoryV1::DirectoryService.new
directory_service.authorization = authorizer
directory_service.list_groups(domain: domain)
end
end
身份验证测试的工作方式与我预期的那样,因为它为我提供了授权令牌和过期时间。但是,列表组的测试失败,并显示以下消息:
Google::Apis::AuthorizationError: Unauthorized
0) GoogleApiHelper should retrieve a group by the domain
Failure/Error: directory_service.get_group groupId
Google::Apis::AuthorizationError:
Unauthorized
我不太确定我做错了什么。我的凭据存储在 .json 文件中,配置在 environment/test.rb 文件中设置:
Api::Application.config.google = {
:auth => {
:json_file => 'config/auth/credentials.json',
:scopes => [ 'https://www.googleapis.com/auth/admin.directory.group', 'https://www.googleapis.com/auth/admin.directory.domain' ]
},
:group => 'mygroup@mydomain.com'
}
我想知道我是否真的错误地设置了此服务帐户的范围。或者,我是否尝试从本地计算机访问 API,而不是从已注册域上的服务器访问 API?如果是后者,在将其部署到生产或暂存 Web 应用之前,我该如何对其进行测试?
更新我打印出了应用程序正在使用的范围,它们是:["https://www.googleapis.com/auth/admin.directory.group", "https://www.googleapis.com/auth/admin.directory.domain"]
.我相信这些是正确的。我已将这些添加到管理控制台的安全 -> 高级设置 ->管理 API 客户端访问下,并输入我的服务帐户的名称,恰好类似于test-account@myprojectname.iam.gserviceaccount.com
和上面列出的范围。这将转换为服务帐户的唯一 ID。
您是否尝试过是否真的从开发环境中得到响应? 这是我用的,你可以试一试
require 'google/apis/analyticsreporting_v4'
AP = Google::Apis::AnalyticsreportingV4
credentials = Google::Auth::ServiceAccountCredentials.make_creds(json_key_io: IO.new(IO.sysopen('./config/credentials.json')))
credentials.scope = "https://www.googleapis.com/auth/analytics.readonly"
ga_reporting_service = AP::AnalyticsReportingService.new
ga_reporting_service.authorization = credentials.fetch_access_token!({})["access_token"]