46 lines
1.2 KiB
Ruby
46 lines
1.2 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
class Auth::OmniAuthStrategies
|
||
|
class DiscourseGoogleOauth2 < OmniAuth::Strategies::GoogleOauth2
|
||
|
GROUPS_SCOPE ||= "admin.directory.group.readonly"
|
||
|
GROUPS_DOMAIN ||= "admin.googleapis.com"
|
||
|
GROUPS_PATH ||= "/admin/directory/v1/groups"
|
||
|
|
||
|
def extra
|
||
|
hash = {}
|
||
|
hash[:raw_info] = raw_info
|
||
|
hash[:raw_groups] = raw_groups if options[:request_groups]
|
||
|
hash
|
||
|
end
|
||
|
|
||
|
def raw_groups
|
||
|
@raw_groups ||= begin
|
||
|
groups = []
|
||
|
page_token = nil
|
||
|
groups_url = "https://#{GROUPS_DOMAIN}#{GROUPS_PATH}"
|
||
|
|
||
|
loop do
|
||
|
params = {
|
||
|
userKey: uid
|
||
|
}
|
||
|
params[:pageToken] = page_token if page_token
|
||
|
|
||
|
response = access_token.get(groups_url, params: params, raise_errors: false)
|
||
|
|
||
|
if response.status == 200
|
||
|
response = response.parsed
|
||
|
groups.push(*response['groups'])
|
||
|
page_token = response['nextPageToken']
|
||
|
break if page_token.nil?
|
||
|
else
|
||
|
Rails.logger.error("[Discourse Google OAuth2] failed to retrieve groups for #{uid} - status #{response.status}")
|
||
|
break
|
||
|
end
|
||
|
end
|
||
|
|
||
|
groups
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|