Office365-rest-python-client: рд╢реЗрдпрд░рдкреЙрдЗрдВрдЯ рд╕реЗ рдЬреБрдбрд╝рдирд╛

рдХреЛ рдирд┐рд░реНрдорд┐рдд 26 рдорд╛рд░реНрдЪ 2021  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: vgrem/Office365-REST-Python-Client

рдореИрдВ рд╢реЗрдпрд░рдкреЙрдЗрдВрдЯ рдкрд░ рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рд╕реАрдЖрд░рдпреВрдбреА рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВ рдЗрд╕ рдореВрд▓ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:

from office365.sharepoint.client_context import ClientContext

settings = {
    'url': 'https://*****.sharepoint.com/sites/*****',
    'user_credentials': {
        'username': '*****@gmail.com',
        'password': '*****',
    },
}

ctx = ClientContext(settings["url"]).with_user_credentials(settings.get('user_credentials').get('username'),
                                                           settings.get('user_credentials').get('password'))

web = ctx.web.get().execute_query()
print(web.properties["Url"])

рдЬреЛ рдореБрдЭреЗ рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ:

IndexError                                Traceback (most recent call last)
<ipython-input-23-c5907526ff22> in <module>
     12                                                            settings.get('user_credentials').get('password'))
     13 
---> 14 web = ctx.web.get().execute_query()
     15 print(web.properties["Url"])

D:\Anaconda\envs\hplc\lib\site-packages\office365\runtime\client_object.py in execute_query(self)
     31 
     32     def execute_query(self):
---> 33         self.context.execute_query()
     34         return self
     35 

D:\Anaconda\envs\hplc\lib\site-packages\office365\runtime\client_runtime_context.py in execute_query(self)
    136     def execute_query(self):
    137         if self.has_pending_request:
--> 138             self.pending_request().execute_query()
    139 
    140     def add_query(self, query, to_begin=False):

D:\Anaconda\envs\hplc\lib\site-packages\office365\runtime\client_request.py in execute_query(self)
     72                 request = self.build_request()
     73                 self.beforeExecute.notify(request)
---> 74                 response = self.execute_request_direct(request)
     75                 response.raise_for_status()
     76                 self.process_response(response)

D:\Anaconda\envs\hplc\lib\site-packages\office365\runtime\odata\odata_request.py in execute_request_direct(self, request)
     32     def execute_request_direct(self, request):
     33         self.ensure_media_type(request)
---> 34         return super(ODataRequest, self).execute_request_direct(request)
     35 
     36     def build_request(self):

D:\Anaconda\envs\hplc\lib\site-packages\office365\runtime\client_request.py in execute_request_direct(self, request_options)
     84         :type request_options: office365.runtime.http.request_options.RequestOptions
     85         """
---> 86         self.context.authenticate_request(request_options)
     87         if request_options.method == HttpMethod.Post:
     88             if request_options.is_bytes or request_options.is_file:

D:\Anaconda\envs\hplc\lib\site-packages\office365\sharepoint\client_context.py in authenticate_request(self, request)
    151 
    152     def authenticate_request(self, request):
--> 153         self._auth_context.authenticate_request(request)
    154 
    155     def _build_modification_query(self, request):

D:\Anaconda\envs\hplc\lib\site-packages\office365\runtime\auth\authentication_context.py in authenticate_request(self, request)
     82         """Authenticate request
     83         :type request: RequestOptions"""
---> 84         self._provider.authenticate_request(request)

D:\Anaconda\envs\hplc\lib\site-packages\office365\runtime\auth\providers\saml_token_provider.py in authenticate_request(self, request)
     71         """
     72         logger = self.logger(self.authenticate_request.__name__)
---> 73         self.ensure_authentication_cookie()
     74         logger.debug_secrets(self._cached_auth_cookies)
     75         cookie_header_value = "; ".join(["=".join([key, str(val)]) for key, val in self._cached_auth_cookies.items()])

D:\Anaconda\envs\hplc\lib\site-packages\office365\runtime\auth\providers\saml_token_provider.py in ensure_authentication_cookie(self)
     78     def ensure_authentication_cookie(self):
     79         if self._cached_auth_cookies is None:
---> 80             self._cached_auth_cookies = self.get_authentication_cookie()
     81         return True
     82 

D:\Anaconda\envs\hplc\lib\site-packages\office365\runtime\auth\providers\saml_token_provider.py in get_authentication_cookie(self)
     91             user_realm = self._get_user_realm()
     92             if user_realm.IsFederated:
---> 93                 token = self._acquire_service_token_from_adfs(user_realm.STSAuthUrl)
     94             else:
     95                 token = self._acquire_service_token()

D:\Anaconda\envs\hplc\lib\site-packages\office365\runtime\auth\providers\saml_token_provider.py in _acquire_service_token_from_adfs(self, adfs_url)
    134                                  headers={'Content-Type': 'application/soap+xml; charset=utf-8'})
    135         dom = minidom.parseString(response.content.decode())
--> 136         assertion_node = dom.getElementsByTagNameNS("urn:oasis:names:tc:SAML:1.0:assertion", 'Assertion')[0].toxml()
    137 
    138         try:

IndexError: list index out of range

рдХреЛрдИ рд╡рд┐рдЪрд╛рд░? рдпрд╣ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╕рдорд╕реНрдпрд╛ рдХреА рддрд░рд╣ рдорд╣рд╕реВрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

@vgrem , рд╣рдореЗрдВ рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлреНрдЯ рдкрд░ рдорд┐рд▓реЗ рд╕рдВрджрд░реНрдн рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЦрд┐рд▓рд╛рдл рдХреЛрдб рдХреЛ рджреЛрдмрд╛рд░рд╛ рдЬрд╛рдВрдЪрдирд╛ рд╣реЛрдЧрд╛ред рдореИрдВ рдЕрдкрдиреЗ рд╢реЗрдпрд░рдкреЙрдЗрдВрдЯ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ (@Zerg00s) рд╕реЗ рдХреБрдЫ рдкрд░реАрдХреНрд╖рдг рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдореЗрдВ рдореЗрд░реА рд╕рд╣рд╛рдпрддрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реВрдВрдЧрд╛, рдЬрд╣рд╛рдВ рдЗрд╕реЗ рдареАрдХ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

рд╕рднреА 5 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

@ahulist saml_token_provider.py рдХреА рд▓рд╛рдЗрди 135 рд╕реЗ response.content.decode() рд▓реЙрдЧрд┐рдВрдЧ рдХрд░рдирд╛, рдФрд░ рдЗрд╕реЗ рдкрдврд╝рдиреЗ рд╕реЗ рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓ рд╕рдХрддреА рд╣реИ рдХрд┐ рдЕрднрд┐рдХрдерди рдХреНрдпреЛрдВ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛

@vgrem , рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЖрдк рд▓реЛрдЧреЛрдВ рдХреЛ рдореЗрд░реЗ рд╕реБрдЭрд╛рд╡ рд╕реЗ рдорд┐рдиреАрдбреЙрдо рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рд╛рде рдпрд╣ рдХреЛрдб рдорд┐рд▓рд╛ рд╣реИ, рдореИрдВ рд╡рд╣рд╛рдВ рд╕рд╛рдзрд╛рд░рдг рд░реЗрдЧреЗрдХреНрд╕ рдореИрдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдорд╛рдкреНрдд рд╣реБрдЖред рдпрд╣ рд╕рдмрд╕реЗ рдкреНрд░рднрд╛рд╡реА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдорд┐рдиреАрдбреЛрдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЖрдк рдХрд╣реАрдВ рдФрд░ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ:

            match = re.search(r'<saml:Assertion.+</saml:Assertion>', response.content.decode())
            if match is None:
                self.error = 'Cannot get security assertion for user {0} from {1}'.format(self.__username, adfs_url)
                logger.error(self.error)
                return None
            assertion_node = match.group()

рдпрд╣ рдЦрдВрдб рдкреБрд░рд╛рдиреЗ 2.2.1.1 рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рд╣реИ

@nsmcan , рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рд╣рдордиреЗ # 297 рдХрд┐рдпрд╛ :)

@nsmcan , рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдЯреВрдЯреЗ рд╣реБрдП рд▓реЗрдЦ (ADFS рдХреЗ рд╕рд╛рде рдлрд╝реЗрдбрд░реЗрдЯреЗрдб рдмрддрд╛рдП рдЧрдП рд╣реИрдВ:

  • #308
  • #333

@vgrem , рд╣рдореЗрдВ рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлреНрдЯ рдкрд░ рдорд┐рд▓реЗ рд╕рдВрджрд░реНрдн рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЦрд┐рд▓рд╛рдл рдХреЛрдб рдХреЛ рджреЛрдмрд╛рд░рд╛ рдЬрд╛рдВрдЪрдирд╛ рд╣реЛрдЧрд╛ред рдореИрдВ рдЕрдкрдиреЗ рд╢реЗрдпрд░рдкреЙрдЗрдВрдЯ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ (@Zerg00s) рд╕реЗ рдХреБрдЫ рдкрд░реАрдХреНрд╖рдг рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдореЗрдВ рдореЗрд░реА рд╕рд╣рд╛рдпрддрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реВрдВрдЧрд╛, рдЬрд╣рд╛рдВ рдЗрд╕реЗ рдареАрдХ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

BradshawI picture BradshawI  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Bachatero picture Bachatero  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

domdinicola picture domdinicola  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Cesaaar picture Cesaaar  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

pobs93 picture pobs93  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ