vgrem / Office365-REST-Python-Client

Microsoft 365 & Microsoft Graph Library for Python
MIT License
1.35k stars 336 forks source link

Sharepoint Binary Security Token #333

Open cwripley1 opened 3 years ago

cwripley1 commented 3 years ago

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 commented 3 years ago

Did anyone figure out a way to handle this issue?

themattmorris commented 3 years ago

I am running into the same issue.

vj68 commented 3 years ago

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

s-corbett commented 3 years ago

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 commented 2 years ago

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

bhargav933 commented 2 years ago

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 commented 2 years ago

Anyone fixed the issue?

ikothidar commented 2 years ago

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

juangallegonuvu commented 2 years ago

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 commented 2 years ago

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

mrtoadsc commented 2 years ago

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 commented 1 year ago

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 commented 1 year ago

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 commented 1 year ago

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 commented 1 year ago

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 commented 1 year ago

@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 commented 1 year ago

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 commented 10 months ago

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 commented 10 months ago

@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 commented 10 months ago

@ValberRodr @masum13 same issue with me also

kg208 commented 10 months ago

i haven't tried to troubleshoot the issue for a few months now. hate to admit but i gave up on trying to resolve this 😳On Jan 19, 2024, at 06:10, Piyush-CompufyTechnolab @.***> wrote: @ValberRodr @masum13 same issue with me also

—Reply to this email directly, view it on GitHub, or unsubscribe.You are receiving this because you commented.Message ID: @.***>

konnerthg commented 9 months ago

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 commented 9 months ago

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 commented 9 months ago

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 commented 8 months ago

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 commented 7 months ago

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

mouyang commented 3 months ago

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 commented 3 months ago

I really wish I knew. I haven't worked on troubleshooting this issue for quite some time now...On Aug 7, 2024, at 12:55, Matthew Ouyang @.***> wrote:

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?

—Reply to this email directly, view it on GitHub, or unsubscribe.You are receiving this because you commented.Message ID: @.***>

fanti1 commented 4 weeks ago

Anyone could solve this without disabling ENTRA ID security defaults?

ClearSafety commented 2 weeks ago

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())