Автоматическое обновление токена UCWA в Skype для бизнеса Online

Я разработал приложение с использованием UCWA и токена пароля. Я читаю все сообщения, приходящие пользователю, прошедшему аутентификацию в приложении с использованием событий, но токен длится недолго, и для обновления используется браузер, что ужасно с точки зрения автоматизации.

Есть ли способ получить токен, который не требует обновления через браузер, чтобы я мог полностью автоматизировать свое приложение? Я прочитал всю документацию на Github и на сайте ucwa.

Это просьба, которую я делаю, чтобы получить токен.

Получить URL для входа

def get_signin_url (redirect_uri, client_id, tenant, resource): xframe, user_discovery_uri, resource = do_autodiscover (config ['domain'])

# Build the query parameters for the signin url
params = {
  'client_id': client_id,
  'redirect_uri': redirect_uri,
  'response_type': 'token',
  'response_mode': 'form_post',
  'resource': resource
}

# The authorize URL that initiates the OAuth2 client credential flow for admin consent
authorize_url = '{0}{1}'.format(authority, '/%s/oauth2/authorize?{0}' % tenant)

# Format the sign-in url for redirection
signin_url = authorize_url.format(urlencode(params))

return signin_url

После нескольких шагов получите токен:

def get_token_from_code(client_id, tenant, auth_code, redirect_uri, resource, client_secret):

  # Build the post form for the token request
  post_data = {
    'grant_type': 'authorization_code',
    'code': auth_code,
    'redirect_uri': redirect_uri,
    'resource': resource,
    'client_id': client_id,
    'client_secret': client_secret
  }

  # The token issuing endpoint
  token_url = '{0}{1}'.format(authority, '/{0}/oauth2/token'.format(tenant))

  # Perform the post to get access token
  response = requests.post(token_url, data=post_data)

  try:
    # try to parse the returned JSON for an access token
    access_token = response.json()['id_token']
    return access_token
  except:
    raise Exception('Error retrieving token: {0} - {1}'.format(
      response.status_code, response.text))

Спасибо!


person Javier Aguirre    schedule 28.02.2017    source источник
comment
Похоже, вы используете python. Есть ли причина, по которой вы не используете библиотеку ADAL для Python приобрести токен без использования брокера?   -  person ShelbyZ    schedule 03.03.2017
comment
Спасибо за ваш ответ! Но моя основная проблема не с токеном Active Directory, а с токеном UCWA, который отличается. Хотя я постараюсь, если смогу улучшить свое решение с помощью ADAL и ответа Андрея Маркеева. : +1:   -  person Javier Aguirre    schedule 13.04.2017


Ответы (1)


Хотя в документации по какой-то причине говорится, что вам нужен неявный поток, на самом деле Skype для бизнеса Online отлично работает с обычным подходом authorization_token + refresh_token.

Я думаю, они просто еще не задокументировали это. Поскольку этот подход работает со всеми другими API-интерфейсами Office365, маловероятно, что он будет удален.

Итак, после того, как вы авторизуете пользователя один раз, вам нужно сделать - точно так же, как в вашем коде:

POST https://login.microsoftonline.com/common/oauth2/token
{
  grant_type: "authorization_code",
  code: authorization_code,
  redirect_uri: redirect_uri,
  client_id: client_id,
  client_secret: client_secret
}

, но тогда из ответа вы получите access_token И refresh_token. refresh_token следует где-то сохранить (например, в базе данных) для дальнейшего использования.

Теперь вы используете access_token, но затем в какой-то момент вы получаете 403, и теперь вы можете обновить его, используя refresh_token, который вы сохранили ранее:

POST https://login.microsoftonline.com/common/oauth2/token
{
    refresh_token: refresh_token,
    grant_type: "refresh_token",
    redirect_uri: redirect_uri,
    client_id: client_id,
    client_secret: client_secret
}

Опыт показывает, что запрос токена обновления может быть выполнен, даже если с момента истечения срока действия access_token прошло значительное время.

Я использую этот подход в нескольких приложениях, использующих API-интерфейсы Office 365, в том числе в том, которое взаимодействует со Skype для бизнеса, и пока с ним не возникло никаких проблем.

Что касается официальной документации, refresh_token задокументирован для многих подсистем (не для Skype для бизнеса на момент написания), и везде он работает почти одинаково. Например, вот такая документация для Azure AD:

person Andrey Markeev    schedule 11.04.2017
comment
Привет! Спасибо за ваш ответ, у меня есть автоматизированное решение, но оно не оптимально, поэтому я попробую то, что вы предложили, и дам вам знать, если все прошло хорошо. Спасибо за помощь! :-) - person Javier Aguirre; 13.04.2017