2016-01-19 4 views
0

Я пытаюсь написать серверный процесс, который вызывает API администратора каталога Google, чтобы определить членство в группах для данного пользователя в моем домене.Не удается разрешить вызов API API Google Directory

в следующей области ... https://www.googleapis.com/auth/admin.directory.group.readonly

... этот вызов работает (возвращает 200) в API Playground: GET /admin/directory/v1/[email protected] HTTP/1.1

Однако, я не могу получить разрешение на право за пределами игровая площадка.

Я сделал следующее:

(1) Добавлен "Admin SDK" на "Enabled APIs" в консоли разработчика Google

(2) Создано "учетной записи службы" для моего приложения в Google Разработчики консоли

(3) Проверено «Включить Google Apps общедоменного Делегирование» для этой учетной записи службы

(4) Проверено «Furnish новый закрытый ключ» для этой учетной записи службы

(5) Загрузили учетные данные JSON для этой учетной записи службы

(6) В «admin.google.com» -> Безопасность -> Дополнительные параметры -> Аутентификация -> Управление доступом к клиенту API, I добавили введенный (числовой) идентификатор клиента для моей учетной записи службы в поле «Имя клиента» и ввели поле «Один или несколько API-областей» в следующей области: https://www.googleapis.com/auth/admin.directory.group.readonly

Однако со следующим Ruby код, неудачной авторизации (Google::Apis::ClientError: forbidden: Not Authorized to access this resource/api):

require 'google/apis/admin_directory_v1' 
require 'googleauth' 
ENV['GOOGLE_APPLICATION_CREDENTIALS'] = 'secrets.json' 
scope = [ 'https://www.googleapis.com/auth/admin.directory.group.readonly' ] 
authorization = Google::Auth.get_application_default(scope) 
service = Google::Apis::AdminDirectoryV1::DirectoryService.new 
service.authorization = authorization 
response = service.list_groups(user_key: '[email protected], domain: "mydomain.com") 

(IRB SES sion, вставленный ниже)

Обратите внимание, что для целей редактирования используются пользователь и домен. Также обратите внимание, что дополнительно, если domain не поставляется, Google::Apis::ClientError: notFound: Domain not found. бросается.

IRB сессия выглядит следующим образом:

irb(main):001:0> require 'google/apis/admin_directory_v1' 
=> true 
irb(main):002:0> require 'googleauth' 
=> false 
irb(main):003:0> ENV['GOOGLE_APPLICATION_CREDENTIALS'] = 'secrets.json' 
=> "secrets.json" 
irb(main):004:0> scope = [ 'https://www.googleapis.com/auth/admin.directory.group.readonly' ] 
=> ["https://www.googleapis.com/auth/admin.directory.group.readonly"] 
irb(main):005:0> authorization = Google::Auth.get_application_default(scope) 
=> #<Google::Auth::ServiceAccountCredentials:0x0000000238b1a0 @authorization_uri=nil, @token_credential_uri=#<Addressable::URI:0x11c55ec URI:https://www.googleapis.com/oauth2/v3/token>, @client_id=nil, @client_secret=nil, @code=nil, @expires_at=nil, @expires_in=nil, @issued_at=nil, @issuer="[email protected]", @password=nil, @principal=nil, @redirect_uri=nil, @scope=["https://www.googleapis.com/auth/admin.directory.group.readonly"], @state=nil, @username=nil, @expiry=60, @audience="https://www.googleapis.com/oauth2/v3/token", @signing_key=#<OpenSSL::PKey::RSA:0x0000000238b218>, @extension_parameters={}, @additional_parameters={}> 
irb(main):006:0> service = Google::Apis::AdminDirectoryV1::DirectoryService.new 
=> #<Google::Apis::AdminDirectoryV1::DirectoryService:0x000000023dbdd0 @root_url="https://www.googleapis.com/", @base_path="admin/directory/v1/", @upload_path="upload/admin/directory/v1/", @batch_path="batch", @client_options=#<struct Google::Apis::ClientOptions application_name="unknown", application_version="0.0.0", proxy_url=nil, use_net_http=false>, @request_options=#<struct Google::Apis::RequestOptions authorization=nil, retries=0, header=nil, timeout_sec=nil, open_timeout_sec=20>> 
irb(main):007:0> service.authorization = authorization 
=> #<Google::Auth::ServiceAccountCredentials:0x0000000238b1a0 @authorization_uri=nil, @token_credential_uri=#<Addressable::URI:0x11c55ec URI:https://www.googleapis.com/oauth2/v3/token>, @client_id=nil, @client_secret=nil, @code=nil, @expires_at=nil, @expires_in=nil, @issued_at=nil, @issuer="[email protected]", @password=nil, @principal=nil, @redirect_uri=nil, @scope=["https://www.googleapis.com/auth/admin.directory.group.readonly"], @state=nil, @username=nil, @expiry=60, @audience="https://www.googleapis.com/oauth2/v3/token", @signing_key=#<OpenSSL::PKey::RSA:0x0000000238b218>, @extension_parameters={}, @additional_parameters={}> 
irb(main):008:0> response = service.list_groups(user_key: '[email protected], domain: "mydomain.com") 
Google::Apis::ClientError: forbidden: Not Authorized to access this resource/api 
    from /usr/local/share/ruby/gems/2.0/gems/google-api-client-0.9/lib/google/apis/core/http_command.rb:202:in `check_status' 
    from /usr/local/share/ruby/gems/2.0/gems/google-api-client-0.9/lib/google/apis/core/api_command.rb:103:in `check_status' 
    from /usr/local/share/ruby/gems/2.0/gems/google-api-client-0.9/lib/google/apis/core/http_command.rb:170:in `process_response' 
    from /usr/local/share/ruby/gems/2.0/gems/google-api-client-0.9/lib/google/apis/core/http_command.rb:275:in `execute_once' 
    from /usr/local/share/ruby/gems/2.0/gems/google-api-client-0.9/lib/google/apis/core/http_command.rb:107:in `block (2 levels) in execute' 
    from /usr/local/share/ruby/gems/2.0/gems/retriable-2.1.0/lib/retriable.rb:54:in `block in retriable' 
    from /usr/local/share/ruby/gems/2.0/gems/retriable-2.1.0/lib/retriable.rb:48:in `times' 
    from /usr/local/share/ruby/gems/2.0/gems/retriable-2.1.0/lib/retriable.rb:48:in `retriable' 
    from /usr/local/share/ruby/gems/2.0/gems/google-api-client-0.9/lib/google/apis/core/http_command.rb:104:in `block in execute' 
    from /usr/local/share/ruby/gems/2.0/gems/retriable-2.1.0/lib/retriable.rb:54:in `block in retriable' 
    from /usr/local/share/ruby/gems/2.0/gems/retriable-2.1.0/lib/retriable.rb:48:in `times' 
    from /usr/local/share/ruby/gems/2.0/gems/retriable-2.1.0/lib/retriable.rb:48:in `retriable' 
    from /usr/local/share/ruby/gems/2.0/gems/google-api-client-0.9/lib/google/apis/core/http_command.rb:96:in `execute' 
    from /usr/local/share/ruby/gems/2.0/gems/google-api-client-0.9/lib/google/apis/core/base_service.rb:267:in `execute_or_queue_command' 
    from /usr/local/share/ruby/gems/2.0/gems/google-api-client-0.9/generated/google/apis/admin_directory_v1/service.rb:943:in `list_groups' 
    from (irb):8 
    from /usr/bin/irb:12:in `<main>'irb(main):009:0> 
+0

Я думаю, что вы не выдаете себя за любого пользователя, особенно для этого сценария, администратора. Проверьте эту документацию, пользователь, которому вы хотите выдавать себя, установлен в параметре «sub»: https://developers.google.com/api-client-library/ruby/auth/service-accounts – Gerardo

+0

Я действительно подумал об этом и добавил это: auth_client = authorization.dup auth_client.sub = '[email protected]' service = Google :: Apis :: AdminDirectoryV1 :: DirectoryService.new response = service.list_groups (user_key: 'my.user @ mydomain.com ', домен:' mydomain.com '), и это вызывает эту ошибку: «Запрошенный клиент не авторизовался». Есть идеи? –

+0

Мне интересно, правильная ли эта строка: service.list_groups (user_key: '[email protected], domain: "mydomain.com") ... после [email protected] цитата не закрыто – Gerardo

ответ

0

Вы пропустили вызов authorization.fetch_access_token! перед вызовом службы, как описано в API client docs.

Смежные вопросы