12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- # Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
- class ExternalCredential::Facebook
- def self.app_verify(params)
- request_account_to_link(params, false)
- params
- end
- def self.request_account_to_link(credentials = {}, app_required = true)
- external_credential = ExternalCredential.find_by(name: 'facebook')
- raise Exceptions::UnprocessableEntity, __('No Facebook app configured!') if !external_credential && app_required
- if external_credential
- if credentials[:application_id].blank?
- credentials[:application_id] = external_credential.credentials['application_id']
- end
- if credentials[:application_secret].blank?
- credentials[:application_secret] = external_credential.credentials['application_secret']
- end
- end
- raise Exceptions::UnprocessableEntity, __("The required parameter 'application_id' is missing.") if credentials[:application_id].blank?
- raise Exceptions::UnprocessableEntity, __("The required parameter 'application_secret' is missing.") if credentials[:application_secret].blank?
- oauth = Koala::Facebook::OAuth.new(
- credentials[:application_id],
- credentials[:application_secret],
- ExternalCredential.callback_url('facebook'),
- )
- oauth.get_app_access_token.inspect
- state = SecureRandom.uuid
- {
- request_token: state,
- # authorize_url: oauth.url_for_oauth_code(permissions: 'publish_pages, manage_pages, user_posts', state: state),
- # authorize_url: oauth.url_for_oauth_code(permissions: 'publish_pages, manage_pages', state: state),
- authorize_url: oauth.url_for_oauth_code(permissions: 'pages_manage_posts, pages_manage_engagement, pages_manage_metadata, pages_read_engagement, pages_read_user_content', state: state),
- }
- end
- def self.link_account(_request_token, params)
- # fail if request_token.params[:oauth_token] != params[:state]
- external_credential = ExternalCredential.find_by(name: 'facebook')
- raise Exceptions::UnprocessableEntity, __('No Facebook app configured!') if !external_credential
- oauth = Koala::Facebook::OAuth.new(
- external_credential.credentials['application_id'],
- external_credential.credentials['application_secret'],
- ExternalCredential.callback_url('facebook'),
- )
- access_token = oauth.get_access_token(params[:code])
- client = Koala::Facebook::API.new(access_token)
- user = client.get_object('me')
- # p client.get_connections('me', 'accounts').inspect
- pages = client.get_connections('me', 'accounts').map do |page|
- {
- id: page['id'],
- name: page['name'],
- access_token: page['access_token']
- }
- end
- # check if account already exists
- Channel.where(area: 'Facebook::Account').each do |channel|
- next if !channel.options
- next if !channel.options['user']
- next if !channel.options['user']['id']
- next if channel.options['user']['id'] != user['id']
- channel.options['auth']['access_token'] = access_token
- channel.options['pages'] = pages
- channel.save!
- return channel
- end
- # create channel
- Channel.create!(
- area: 'Facebook::Account',
- options: {
- adapter: 'facebook',
- auth: {
- access_token: access_token
- },
- user: user,
- pages: pages,
- sync: {
- pages: [],
- }
- },
- active: true,
- created_by_id: 1,
- updated_by_id: 1,
- )
- end
- end
|