#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