Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Sharepoint Binary Security Token #333

Open
cwripley1 opened this issue Mar 24, 2021 · 30 comments
Open

Sharepoint Binary Security Token #333

cwripley1 opened this issue Mar 24, 2021 · 30 comments
Labels

Comments

@cwripley1
Copy link

cwripley1 commented Mar 24, 2021

Hello,
My goal is given a sharepoint link to a site folder, to list the files, and to copy any new files automatically to AWS S3. When I run the simple startup script, I am getting the error:

Cannot get binary security token for from https://login.microsoftonline.com/extSTS.srf
Traceback (most recent call last):
  File "/Users/riple2/PycharmProjects/os365/microsoft/test5.py", line 10, in <module>
    response = ctx.execute_request_direct(request)
  File "/Users/riple2/Library/Python/3.8/lib/python/site-packages/office365/runtime/client_runtime_context.py", line 134, in execute_request_direct
    return self.pending_request().execute_request_direct(request)
  File "/Users/riple2/Library/Python/3.8/lib/python/site-packages/office365/runtime/odata/odata_request.py", line 34, in execute_request_direct
    return super(ODataRequest, self).execute_request_direct(request)
  File "/Users/riple2/Library/Python/3.8/lib/python/site-packages/office365/runtime/client_request.py", line 86, in execute_request_direct
    self.context.authenticate_request(request_options)
  File "/Users/riple2/Library/Python/3.8/lib/python/site-packages/office365/sharepoint/client_context.py", line 153, in authenticate_request
    self._auth_context.authenticate_request(request)
  File "/Users/riple2/Library/Python/3.8/lib/python/site-packages/office365/runtime/auth/authentication_context.py", line 84, in authenticate_request
    self._provider.authenticate_request(request)
  File "/Users/riple2/Library/Python/3.8/lib/python/site-packages/office365/runtime/auth/providers/saml_token_provider.py", line 73, in authenticate_request
    self.ensure_authentication_cookie()
  File "/Users/riple2/Library/Python/3.8/lib/python/site-packages/office365/runtime/auth/providers/saml_token_provider.py", line 80, in ensure_authentication_cookie
    self._cached_auth_cookies = self.get_authentication_cookie()
  File "/Users/riple2/Library/Python/3.8/lib/python/site-packages/office365/runtime/auth/providers/saml_token_provider.py", line 95, in get_authentication_cookie
    token = self._acquire_service_token()
  File "/Users/riple2/Library/Python/3.8/lib/python/site-packages/office365/runtime/auth/providers/saml_token_provider.py", line 172, in _acquire_service_token
    token = self._process_service_token_response(response)
  File "/Users/riple2/Library/Python/3.8/lib/python/site-packages/office365/runtime/auth/providers/saml_token_provider.py", line 207, in _process_service_token_response
    raise ValueError(self.error)
ValueError: Cannot get binary security token for from https://login.microsoftonline.com/extSTS.srf

The simple script I am running is:

import json
from office365.runtime.auth.user_credential import UserCredential
from office365.runtime.http.request_options import RequestOptions
from office365.sharepoint.client_context import ClientContext
site_url="https://levi.sharepoint.com/sites/gdo/"
with open('secrets.json') as f:
  secrets = json.load(f)
ctx = ClientContext(site_url).with_credentials(UserCredential(secrets['user'], secrets['password']))
request = RequestOptions("{0}/_api/web/".format(site_url))
response = ctx.execute_request_direct(request)
json = json.loads(response.content)
web_title = json['d']['Title']
print("Web title: {0}".format(web_title))

I am using my Levi organization's username and password to the same site https://levi.sharepoint.com/sites/gdo/ . I can easily access this site in my browser, but the python package is having this authentication error.

What is needed besides username and password to get programatic access to sharepoint folders?

@vatsaldesai1994
Copy link

Did anyone figure out a way to handle this issue?

@themattmorris
Copy link

I am running into the same issue.

@vj68
Copy link

vj68 commented Aug 30, 2021

I too got this error.
I was using just my "username".
Using "username@xyz.com" worked for me.

@s-corbett
Copy link

I was also having a similar issue when using environment variables. Turns out that os.getenv("USERNAME") will return my computer's username, not the USERNAME variable as specified in my .env file. I renamed the variable in my .env file to USER and it worked.

@RPReddy
Copy link

RPReddy commented Jan 23, 2022

Please provide a solution for this error,I have tried using the mail as the username..but still i see this error.

@bhargav933
Copy link

Please provide a solution for this error,I have tried using the mail as the username..but still i see this error.
@RPReddy , as mentioned by the @rajvijay68 , use the your email address and password,
I got the same error which resolved by that method
.

@linkxu1989
Copy link

Anyone fixed the issue?

@ikothidar
Copy link

Only issue could be with your username value it should be proper email 'xyz@email.com' check this properly.

@juangallegonuvu
Copy link

Hello, has anyone solve it? I face the same error when running the script from Lambda, but not from my local computer. That may me think that it may have something to do with the cookies thing in Lambda (I don't know much about this). I would appreciate any guidence

@babuganesh2000
Copy link

This is an on going issue, if you have Duo enabled on a account, getting the token is not possible

@mrtoadsc
Copy link

I was getting this problem when I used firstname.lastname as the first argument to UserCredential. Using the full user id like firstname.lastname@domain.tld got me past the Cannot get binary security token exception.

I got much further and managed to get a 403 error when trying to upload a file but that's a different problem.

@DieGlueckswurst
Copy link

still getting this error in 2023. Any updates? I tried using firstname.lastname@company.com for username but same error: Cannot get binary security token.

@leadvic
Copy link

leadvic commented Mar 30, 2023

For me it works perfectly when running my script as full username: firstname.lastname@company.com in any Linux computer I use, but I'm trying to containerize my app, and in any docker container I run it I get this same error.

Still not finding something to fix this issue in docker container.

@jsandroos
Copy link

Currently running into the same issue running in a Jupyter notebook from a docker container.

Will investigate behaviour in a direct python script tomorrow.

@cestes
Copy link

cestes commented Apr 11, 2023

I'm having the same issue. I've had a system running for 2 years using shareplum to download a file from sharepoint. A couple of weeks ago it started throwing an error on the download. Doing some research I found that shareplum is not longer actively supported and decided to switch to Office365-REST-Python-Client, which doesn't work.

Since shareplum worked fine for years, and just started breakiing, I'm wondering if this is indicative of anything in my O365 account that our admins changed. Any idea about what would prevent username/password authentication?

@kg208
Copy link

kg208 commented May 25, 2023

@cestes - were you able to resolve the issue? I have been running a weekly python script for several weeks now that uploads data into my SharePoint site. It also uses the shareplum library. The script stopped working on May 15th, 2023.

@VictorlBueno
Copy link

This way worked:

import json
from office365.runtime.auth.user_credential import UserCredential
from office365.runtime.http.request_options import RequestOptions
from office365.sharepoint.client_context import ClientContext

site_url= ""
client_id = ""
client_secret = ""

ctx = ClientContext(site_url).with_credentials(UserCredential("xyz@example.com", "password"))
endpoint_url = "{0}/_api/web/".format(site_url)
response = ctx.execute_request_direct(endpoint_url)

The error you are encountering is due to passing a RequestOptions object to the execute_request_direct method instead of a string representing the endpoint URL. The execute_request_direct method expects a string containing the endpoint URL to which the request should be made.

To fix this issue, you need to pass the URL as a string instead of a RequestOptions object. Here's the corrected code:

@ValberRodr
Copy link

Can anyone confirm if this error ('Cannot get binary security token for from https://login.microsoftonline.com/extSTS.srf') occurs due to a limitation of the Microsoft Developer free account? I am referring to this program: https://developer.microsoft.com/en-us/microsoft-365/dev-program.

@masum13
Copy link

masum13 commented Jan 19, 2024

@ValberRodr Same things is also happaning to me also, I have currently microsoft 365 free account but not able to get token, Don't sure that's due free account.

@Piyush-CompufyTechnolab

@ValberRodr @masum13 same issue with me also

@kg208
Copy link

kg208 commented Jan 19, 2024 via email

@konnerthg
Copy link

konnerthg commented Feb 2, 2024

For anyone else running into a similar problem: Mult-factor Authentication? https://learn.microsoft.com/en-us/answers/questions/1056853/fail-to-access-sharepoint-with-user-credentials

@srishti1004
Copy link

Is this issue resolved? as I'm also getting the same error. Any documentation or link would be appreciated. Tried both the types of username

@sanerspace
Copy link

I received this error today while testing out Sharepoint access from a desktop environment. I was thinking it was due to the Python client codebase attempting to access the cloud, while my org's servers are all on-premise and have no cloud registration. But if it is some lesser issue I would love to see that.

I tried VictorIBueno's suggestion, but unfortunately received the same error.

This way worked:

import json
from office365.runtime.auth.user_credential import UserCredential
from office365.runtime.http.request_options import RequestOptions
from office365.sharepoint.client_context import ClientContext

site_url= ""
client_id = ""
client_secret = ""

ctx = ClientContext(site_url).with_credentials(UserCredential("xyz@example.com", "password"))
endpoint_url = "{0}/_api/web/".format(site_url)
response = ctx.execute_request_direct(endpoint_url)

The error you are encountering is due to passing a RequestOptions object to the execute_request_direct method instead of a string representing the endpoint URL. The execute_request_direct method expects a string containing the endpoint URL to which the request should be made.

To fix this issue, you need to pass the URL as a string instead of a RequestOptions object. Here's the corrected code:

@yasaslive
Copy link

If you open the https://login.microsoftonline.com/extSTS.srf It says 'The endpoint only accepts POST requests. Received a GET request'. Am I missing something? @vgrem

@hitarthnanonets
Copy link

Disabling security defaults from Entra admin center worked for me - https://learn.microsoft.com/en-us/entra/fundamentals/security-defaults

@mouyang
Copy link

mouyang commented Aug 7, 2024

Disabling security defaults from Entra admin center worked for me - https://learn.microsoft.com/en-us/entra/fundamentals/security-defaults

It's likely that this we won't be able to disable security defaults in production environments. What can be done in that situation?

@kg208
Copy link

kg208 commented Aug 9, 2024 via email

@fanti1
Copy link

fanti1 commented Oct 28, 2024

Anyone could solve this without disabling ENTRA ID security defaults?

@ClearSafety
Copy link

The problem is with authentication. In my case, I couldn't use my credentials (user and password) because of the way my company setup the access to the Sharepoint.

The solution can be found in the section "Setting up an app-only principal with tenant permissions" of https://learn.microsoft.com/en-us/sharepoint/dev/solution-guidance/security-apponly-azureacs

Once you have access to client_id and client_secret, use them to create the authentication. Please, see the example below:

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

client_id="{client id}"
client_secret="{client secret}"
url = "https://{tenant}.sharepoint.com/sites/{site}"

ctx_auth = AuthenticationContext(url)
if ctx_auth.acquire_token_for_app(client_id, client_secret):
ctx = ClientContext(url, ctx_auth)
web = ctx.web
ctx.load(web)
ctx.execute_query()
print("Web title: {0}".format(web.properties['Title']))

else:
print(ctx_auth.get_last_error())

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests