Office365-rest-python-client: "TypeError: não é possível concatenar os objetos 'str' e 'NoneType'" a pedido de obter um arquivo.

Criado em 12 jun. 2017  ·  14Comentários  ·  Fonte: vgrem/Office365-REST-Python-Client

Estou tentando fazer download de um arquivo que pode ser acessado (por meio de um navegador) neste URL:
https://test.sharepoint.com/sites/team/team documents / subfolder / document.docx

Estou usando um objeto ClientRequest com o seguinte código:

url = "https://test.sharepoint.com/sites/team"
username="[email protected]"
password="pass"
ctxAuth = AuthenticationContext(url)
if ctxAuth.acquire_token_for_user(username, password):
    print 'authentication successful, proceeding...'
    request = ClientRequest(ctxAuth)
    requestUrl="{0}/_api/web/getfilebyserverrelativeurl('team documents/subfolder/document.docx')"
    options=RequestOptions(requestUrl.format(url))
    data = request.execute_query_direct(options)

Ao executar isso, estou obtendo o seguinte rastreamento:

$ python test.py
No handlers could be found for logger "client.office365.runtime.auth.saml_token_provider.SamlTokenProvider.process_service_token_response"
authentication successful, proceeding...
Traceback (most recent call last):
  File "test.py", line 14, in <module>
    data = request.execute_query_direct(options)
  File "/usr/lib/python2.7/site-packages/client/office365/runtime/client_request.py", line 77, in execute_query_direct
    self.context.authenticate_request(request_options)
  File "/usr/lib/python2.7/site-packages/client/office365/runtime/auth/authentication_context.py", line 20, in authenticate_request
    request_options.set_header('Cookie', self.provider.get_authentication_cookie())
  File "/usr/lib/python2.7/site-packages/client/office365/runtime/auth/saml_token_provider.py", line 65, in get_authentication_cookie
    return 'FedAuth=' + self.FedAuth + '; rtFa=' + self.rtFa
TypeError: cannot concatenate 'str' and 'NoneType' objects

Há algo errado em como uso o módulo?

bug

Comentários muito úteis

Tive um problema semelhante porque nossa instância do SharePoint está sendo executada por trás de um proxy. Tive que criar uma subclasse de SamlTokenProvider para substituir o url de login ( self.sts ) e os nomes dos cookies. Acho que o problema é que durante a inicialização, o código não verifica o resultado de acquire_authentication_cookie portanto, se a autenticação falhar, você não ouvirá sobre isso até que os cookies sejam usados.

Todos 14 comentários

Tive um problema semelhante porque nossa instância do SharePoint está sendo executada por trás de um proxy. Tive que criar uma subclasse de SamlTokenProvider para substituir o url de login ( self.sts ) e os nomes dos cookies. Acho que o problema é que durante a inicialização, o código não verifica o resultado de acquire_authentication_cookie portanto, se a autenticação falhar, você não ouvirá sobre isso até que os cookies sejam usados.

Eu tive o mesmo problema. Parece que as falhas de autenticação não são tratadas por exceções. Ele só surge quando os cookies são consultados. Verifique suas credenciais

Mesmo problema. Credenciais verificadas, mas o problema persiste. Quaisquer outros pensamentos? Obrigado!

Acabei usando OAuth2Session para obter autenticação oauth2 e obter dados da API gráfica. Já faz um tempo e não me lembro mais dos detalhes exatos.

Obrigado, vou verificá-lo.

Olá, estou com o mesmo problema, mas no meu caso acho que é porque tenho o sharepoint configurado com o método FormAuthentication. Não funcionará até que o provedor de token adequado seja implementado

Também estou encontrando esse problema, mas apenas se estiver usando uma conta do outlook.com. Espero que alguém possa explicar o que está acontecendo nos bastidores e talvez oferecer uma solução. Aqui está uma breve explicação:

1) Nosso site do SharePoint está na nuvem (https://mn365.sharepoint.com)
2) Quando eu faço a conexão com o site usando minhas credenciais do estado de Minnesota, ele se conecta perfeitamente.
3) Mas, como não quero ter minhas próprias credenciais incorporadas em meu aplicativo, criei uma "conta de serviço" nos moldes de " [email protected] ". Esta conta falha.

Qual seria a diferença na autenticação entre usar um endereço outlook.com e um emitido por minha organização (neste caso firstName. [email protected]?

Mesmo problema aqui. Estamos usando AD FS para autenticação. Até agora eu não encontrei nenhuma maneira de obter qualquer informação do nosso servidor online do sharepoint. Tentei muitas bibliotecas, mas nada funcionou para mim.

Eu tive o mesmo erro porque o sharepoint estava redirecionando para autenticação no STS / ADFS local.

Criamos um novo usuário do O365 diretamente no O365 para que ele não use o redirecionamento para o STS / ADFS local. Isso resolveu o erro 👍

Mudei para o sharepy, que funciona ootb e cobre minhas condições

Mesmo aqui:
Nenhum manipulador foi encontrado para o logger "office365.runtime.auth.saml_token_provider.SamlTokenProvider._process_service_token_response"

Alguma sorte dos outros?

Talvez o seguinte ajude a restringir ainda mais.

Posso autenticar com sucesso na URL geral do sharepoint, mas não em uma URL que aponta para um canal de equipes específico. O seguinte código funciona bem:

url = "https://COMPANYNAME.sharepoint.com/"
username=raw_input("username: ")
password=raw_input("password: ")
ctx_auth = AuthenticationContext(url=url)
if ctx_auth.acquire_token_for_user(username=username, password=password):

Mas quando eu substituo o URL por:

url = "https://COMPANYNAME.sharepoint.com/sites/TEAMSCHANNEL/"

então recebo o seguinte erro:

No handlers could be found for logger "office365.runtime.auth.saml_token_provider.SamlTokenProvider.acquire_authentication_cookie"

Qualquer solução alternativa apreciada - no meu navegador, posso ver os dois perfeitamente.

Encontramos uma solução alternativa para o caso de uso acima. Basta usar o url de base para obter AuthenticationContext . Novos objetos ClientContext podem ser criados usando diferentes urls.

base_url = "https://COMPANYNAME.sharepoint.com/"
ctx_auth = AuthenticationContext(url=base_url)
if not ctx_auth.acquire_token_for_user(username=user, password=password):
    sys.exit('Error in getting token - quitting')
url = base_url + "sites/TEAMSCHANNEL/"
ctx = ClientContext(url, ctx_auth)
..
..

Ei pessoal!

Desde o momento em que esse problema foi relatado até agora, as seguintes melhorias / correções de bugs foram feitas em termos de _suporte para autenticação federada baseada em SAML com o SharePoint Online_:

  • # 210 - Incapaz de conectar ao SharePoint (erro buyer_authentication_cookie se federado)
  • # 170 - Ocorreu um erro ao recuperar o token: AADSTS50126: Erro ao validar credenciais devido a nome de usuário ou senha inválidos
  • Nº 85 - Usando Office-365-REST com ADFS
  • Nº 84 - Sites com STS local não autenticam (AADSTS70002)

Portanto, o erro fornecido não deve ocorrer mais, apenas certifique-se de obter a versão _lima_ ( 2.1.10.1 ou superior).

Esta página foi útil?
0 / 5 - 0 avaliações