Создание календарного события с помощью ruby ​​outlook

Я пытаюсь создать мероприятие в календаре,

Я могу получить все данные, такие как календарь, контакты и электронные письма, следуя приведенной ниже документации,

https://docs.microsoft.com/en-us/outlook/rest/ruby-tutorial,

Но при попытке создать событие с помощью ruby_outlook получается ошибка ниже

  {"ruby_outlook_error"=>401, 
   "ruby_outlook_response"=>{"error"=>{"code"=>"InvalidAudience", "message"=>"The audience claim value is invalid 'aud'.", 
   "innerError"=>{"requestId"=>"75984820-5241-11ea-b6fc-fc4dd44c1550", "date"=>"2020-02-18T11:26:08"}}}}

Код ниже предназначен для создания события

def def index
   token = get_access_token   //getting access token
   if token
      outlook_client = RubyOutlook::Client.new
      event_payload = 
      {
         "Subject": "Discuss the Calendar REST API",
        "Body": {
        "ContentType": "HTML",
        "Content": "I think it will meet our requirements!"
        },
        "Start": {
        "DateTime": "2020-03-03T18:00:00",
        "TimeZone": "Pacific Standard Time"
        },
        "End": {
        "DateTime": "2020-03-03T19:00:00",
        "TimeZone": "Pacific Standard Time"
        },
        "Attendees": [
        {
        "EmailAddress": {
        "Address": "[email protected]",
        "Name": "John Doe"
        },
        "Type": "Required"
        }
        ]
      }
      outlook_client.create_event(token, event_payload, nil, '[email protected]')
   end
end

person Manjunarth    schedule 18.02.2020    source источник
comment
Я думаю, ваша проблема в том, что полученный вами токен использовал API-интерфейс Microsoft Graph но теперь вы пытаетесь создать даже через Outlook API. Вы не можете использовать маркер, выпущенный для Graph (aud: graph.microsoft.com), с конечной точкой Outlook. Вам нужен токен с aud: outlook.office.com.   -  person Gautam    schedule 18.02.2020
comment
Привет, @Gautam, спасибо за ответ, как получить токен с помощью aud: outlook.office.com   -  person Manjunarth    schedule 18.02.2020
comment
Почему ты хочешь это сделать? Лучше использовать сам API графа для создания события, поскольку у вас уже есть токен, извлеченный из него. Сообщите мне, можете ли вы использовать драгоценный камень графа? У меня есть рабочий код, и я могу опубликовать его как ответ.   -  person Gautam    schedule 18.02.2020
comment
Да, это глупая идея, но я не нашел кода для создания событий в [docs.microsoft.com/en-us/outlook/rest/ruby-tutorial] документация, речь идет о выборке данных.   -  person Manjunarth    schedule 18.02.2020
comment
Да, @Gautam, я использую гем microsoft_graph   -  person Manjunarth    schedule 18.02.2020
comment
Я отправил на него ответ.   -  person Gautam    schedule 18.02.2020


Ответы (1)


Ваша проблема в том, что полученный вами токен использовал Microsoft Graph API, но теперь вы пытаетесь создать даже через Outlook API. Вы не можете использовать token, выданный для Graph ("aud": "graph.microsoft.com"), для конечной точки Outlook. Вам нужен токен с "aud": "outlook.office.com". Лучше использовать сам графический API с помощью графа gem для создания события, поскольку у вас уже есть полученный токен.

Для этого сначала создайте объект MicrosoftGraph

def create_service_auth
  access_token = get_access_token
  callback =  Proc.new do |r|
    r.headers['Authorization'] = "Bearer #{access_token}"
    r.headers['Content-Type']  = 'application/json'
    r.headers['X-AnchorMailbox'] = "#{ email_of_calendar_for_which_to_create_the_event }"
  end
  @graph = ::MicrosoftGraph.new(base_url: 'https://graph.microsoft.com/v1.0',
                            cached_metadata_file: File.join(MicrosoftGraph::CACHED_METADATA_DIRECTORY, 'metadata_v1.0.xml'),
                              &callback)
end

Затем создайте событие -

def create_event
  event = {
    subject: summary,
    body: {
      content_type: "HTML",
      content: description
    },
    start: {
      date_time: start_time,
      time_zone: timezone
    },
    end: {
      date_time: end_time,
      time_zone: timezone
    },
    response_requested: true,
    organizer: {emailAddress: { name: "#{organizer.full_name}", address: email_of_calendar_for_which_to_create_the_event }},
    attendees: [
      {
        email_address: {
          address: attendee_email,
          name: "#{attendee.full_name}"
        },
        type: "required"
      }
    ]
  }

  result = @graph.me.events.create(event)
end
person Gautam    schedule 18.02.2020