Skip to content

Instantly share code, notes, and snippets.

@donnoman
Last active October 5, 2015 21:32
Show Gist options
  • Save donnoman/954918f135fa6db86b64 to your computer and use it in GitHub Desktop.
Save donnoman/954918f135fa6db86b64 to your computer and use it in GitHub Desktop.
Ruby HTTParty Example of retrieving all Google Apps Domain Users via admin-sdk/directory/v1
#!/usr/bin/env ruby
require 'googleauth'
require 'httparty'
require 'active_support/all'
class GDirectory
# https://github.com/jnunemaker/httparty
include HTTParty
# https://developers.google.com/admin-sdk/directory/v1/guides/manage-users
base_uri 'https://www.googleapis.com'
format :json
class << self
# https://developers.google.com/admin-sdk/directory/v1/guides/manage-users#get_all_domain_users
def users_unpaginated
options = {
:query => {
'domain' => ENV['GOOGLE_DOMAIN'],
'maxResults' => 300,
'fields' => 'users(id,primaryEmail,aliases,name,isAdmin,isDelegatedAdmin),nextPageToken',
'query' => 'isSuspended=false',
'orderBy' => 'email',
'sortOrder' => 'ASCENDING',
'viewType' => 'admin_view'
}
}
users = []
response = {}
begin
options.merge!(:headers => { 'Authorization' => authorization_header } )
options[:query].merge!('pageToken'=> response['nextPageToken']) if response['nextPageToken']
response = get('/admin/directory/v1/users',options)
users += response['users']
end while response['nextPageToken']
users
end
def users_normalized
users_unpaginated.map do |user|
user['aliases'] = user['aliases'] ? user['aliases'].join(',') : nil
names=user.delete('name')
user.merge!(names)
user.transform_keys!{ |key| key.underscore.to_sym }
end
end
def users
users_normalized
end
private
# https://developers.google.com/identity/protocols/application-default-credentials
# The ACT_ON_BEHALF_EMAIL can be any google admin email address, but must be an admin.
def ensure_google_application_credentials
raise unless ENV['GOOGLE_DOMAIN']
raise unless ENV['GOOGLE_APPLICATION_CREDENTIALS']
raise unless ENV['ACT_ON_BEHALF_EMAIL']
end
def scopes
['https://www.googleapis.com/auth/admin.directory.user.readonly']
end
# https://github.com/google/google-auth-library-ruby
# https://github.com/google/google-api-ruby-client/issues/249
def authorization
ensure_google_application_credentials
auth = Google::Auth.get_application_default(scopes)
auth.sub = ENV['ACT_ON_BEHALF_EMAIL']
auth.fetch_access_token!
auth
end
# httparty chokes on the capitalized symbol thats introduced by googleauth
def authorization_header
headers_reference = {}
authorization.apply!(headers_reference)
headers_reference[:Authorization]
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment