Токен доступа SharePoint Online из Python

#python #rest #postman #access-token #sharepoint-online

#python #rest #почтальон #токен доступа #sharepoint-online

Вопрос:

Любая помощь очень ценится! Я перепробовал так много библиотек и способов сделать это, кажется, ничего не работает. Я неопытен в REST API и получаю доступ к SharePoint с их помощью. Я опробовал различные примеры кода, которые используют запросы Python, office365-REST-Python-Client, HttpNtlmAuth, OAuth2, rauth и т.д.

Наш администратор SharePoint настроил для меня надстройку SharePoint для доступа к данным моего сайта. Сказал, что это будет не мое имя пользователя и пароль в API, а использование клиента и сначала получение токена доступа, а затем выполнение вызовов API.

Неприятно, что администратор SharePoint настроил вызовы в Postman, и запросы API вызывают запросы для получения токена доступа, а также для получения данных о файлах и папках сайта, которые я хочу, чтобы там все работало нормально. Я даже могу создавать свои собственные запросы API в Postman, используя те же параметры, которые она создала, и это отлично работает. Но попытка сделать это в моем приложении на Python привела ко всевозможным ошибкам и проблемам. На данный момент я просто пытаюсь получить свой токен доступа в Python.

Вот мой текущий код и ошибка. Весь текст внутри скобок и ВСЕ ЗАГЛАВНЫЕ буквы не являются буквальными / скрытыми по понятным причинам, поскольку я публикую это в Интернете. Ошибка:

Файл «[МОЕ МЕСТОПОЛОЖЕНИЕ НА ЛОКАЛЬНОМ ДИСКЕ …] venvlibsite-packagesoffice365runtimeauthauthentication_context.py «, строка 45, в acquire_token_for_app вызывает ошибку значения (‘Ошибка получения токена: {0}’.format(self.provider.error)) Ошибка значения: ошибка получения токена: Нет

 from office365.runtime.auth.authentication_context import AuthenticationContext
from office365.sharepoint.client_context import ClientContext

class SharepointService:

        site_url = 'https://accounts.accesscontrol.windows.net/[TENANT ID the SP ADMIN GAVE ME]/tokens/OAuth/2?content'
        client_id = '[THE CLIENT ID THE SP ADMIN GAVE ME]'
        client_secret = '[THE CLIENT SECRET THE SP ADMIN GAVE ME]'

        app_principal = {'client_id': client_id, 'client_secret': client_secret}

        context_auth = AuthenticationContext(url=site_url)

        token = context_auth.acquire_token_for_app(client_id=app_principal['client_id'], client_secret=app_principal['client_secret'])
        print(token)

        ctx = ClientContext(site_url, context_auth)

        web = ctx.web
        ctx.load(web)
        ctx.execute_query()
        print("Web site title: {0}".format(web.properties['Title']))


  

Комментарии:

1. ваш код работал для меня, когда shareplum и sharepy не работали, я думаю, может быть, они используют другой метод аутентификации или поддерживают разные API, которые моя компания не использует

Ответ №1:

Похоже, вам следует изменить свой site_url на сайт, к которому вы хотите получить доступ.

 from office365.runtime.auth.authentication_context import AuthenticationContext
from office365.sharepoint.client_context import ClientContext

site_url = 'https://contoso.sharepoint.com/sites/dev'
app_principal = {
  'client_id': 'e53634cb-xxxx-4e3a-8557-026a9393e215',
  'client_secret': 'SKjZHU4Ubr2BTouPsiXXtz9YeHU/yBww/xXxanq1I2k=',
}

context_auth = AuthenticationContext(url=site_url)
context_auth.acquire_token_for_app(client_id=app_principal['client_id'], 
client_secret=app_principal['client_secret'])

ctx = ClientContext(site_url, context_auth)
web=ctx.web
ctx.load(web)
ctx.execute_query()
print("Web site title: {0}".format(web.properties['Title']))
  

Результат теста:
введите описание изображения здесь

Комментарии:

1. Спасибо, но я тоже пробовал это (изменив URL-адрес сайта, к которому я хочу получить доступ) с тем же результатом ошибки, что и указано выше. URL-адрес, показанный в моем вопросе, — это URL-адрес, который работает для получения токена с помощью Postman, который проверил администратор. Она сказала, что именно оттуда получен токен. Он работает в Postman, но не в моем приложении Python, использующем эту конкретную библиотеку.

Ответ №2:

 path('api-auth/',include ('rest_framework.urls',namespace='rest_framework')), path('api/', include('djoser.urls')), ####urls.py
from rest_framework.decorators import api_view
from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import AllowAny
##vies.py
class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = '__all__'
###serializers.py
  

Комментарии:

1. Я не понимаю, как этот код будет работать для получения токена, можете ли вы завершить пример? Спасибо

Ответ №3:

   'DEFAULT_AUTHENTICATION_CLASSES': [ 
        'rest_framework_simplejwt.authentication.JWTAuthentication', 
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.BasicAuthentication',
    ], 
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
        'rest_framework.permissions.AllowAny',
        "rest_framework.permissions.DjangoModelPermissions",
##settings.py  

Комментарии:

1. Я не понимаю, как этот код будет работать для получения токена, можете ли вы завершить пример? Спасибо.

Ответ №4:

Это по-прежнему лучший результат Google для этой ошибки.

Это вызвано двумя причинами:

  • Azure по какой-то причине не удается аутентифицировать вашу надстройку Sharepoint.
  • Вы используете версию office365-rest-python-client < 2.3.0 — до этой версии сбой не отображался

В этой строке (raise_for_status) теперь выводится ошибка аутентификации Azure: https://github.com/vgrem/Office365-REST-Python-Client/blob/2.3.0/office365/runtime/auth/providers/acs_token_provider.py#L69

В моем случае сбой аутентификации произошел из-за истечения срока действия ключей через год.

Вы можете обновить их следующим образом: https://medium.com/@cecildt/renewing-sharepoint-online-provider-add-ins-client-secret-ba2828a49e7