Python сервер сокетов не может декодировать перенаправление из OAUTH - PullRequest
3 голосов
/ 28 мая 2020

Я не уверен, какую часть кода я могу показать, но концепция проста. Я пишу сценарий python, который работает с TD Ameritrade API. Я получаю URL-адрес портала из API и открываю его в браузере. Затем я настраиваю сервер сокетов для обработки перенаправления портала. Ниже приведен код для сервера:

serversocket = socket.socket(
                socket.AF_INET, socket.SOCK_STREAM) 

    # get local machine name
    host = "localhost"                 

    port = 10120                                          
    serversocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    # bind to the port
    serversocket.bind((host, port))                                  

    print("listening")
    # queue up to 5 requests
    serversocket.listen(5)                                           

    allData = ""

    while True:
        # establish a connection
        try:
            conn,addr = serversocket.accept()
        except KeyboardInterrupt:
            break  

        print("Got a connection from %s" % str(addr))
        while True:
            data = conn.recv(4096)

            if not data:
                print("done")
                break

            print(data.decode('utf-8', "ignore"))
        conn.close()

Когда я go через портал и перенаправляюсь, в консоли я вижу следующее:

Got a connection from ('127.0.0.1', 65505)                                                                              
  |,?2!c[N': [?`XAn] "::+/,0̨̩   / 5                                                              
 jj         localhost                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
     3 + )http/1.1                                                                                                                                                                                                               
    ej\E<zpִ_<%q\r)+ -  +                                                                                   
jj   zz   

Однако, если я нужно было скопировать URL-адрес, открыть новую вкладку, вставить его и go, я получаю следующий (правильный) ответ:

Got a connection from ('127.0.0.1', 49174)                                                                              
GET /?code=<RESPONSE_TOKEN> HTTP/1.1                                                               
Host: localhost:10120                                                                                                   
Connection: keep-alive                                                                                                  
Cache-Control: max-age=0                                                                                                
Upgrade-Insecure-Requests: 1                                                                                            
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) 
Chrome/81.0.4044.138 Safari/537.36 OPR/68.0.3618.125                                                                                               
Accept: 
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-
exchange;v=b3;q=0.9                                                                                                            
Sec-Fetch-Site: none                                                                                                    
Sec-Fetch-Mode: navigate                                                                                                
Sec-Fetch-User: ?1                                                                                                      
Sec-Fetch-Dest: document                                                                                                
Accept-Encoding: gzip, deflate, br                                                                                      
Accept-Language: en-US,en;q=0.9    

Когда я go открываю обзор сети в моем браузере, я при попытке просмотреть заголовки запроса см. следующее предупреждение: Provisional headers are shown

И единственная разница между HTTP-запросом из перенаправления и запросом, когда я вручную вставляю URL-адрес, - это столбец initiator в средство просмотра сети является «клятвой» для перенаправления и «другим» при вставке вручную.

Надеюсь, я предоставил достаточно информации и кода. Я могу попытаться сделать копию для воспроизведения, если это необходимо, но для подключения к API потребуется учетная запись разработчика TD Ameritrade.

Заранее благодарим за любую помощь. Я занимался поиском более 6 часов и ничего не нашел. Надеюсь, я не пропустил ничего очевидного.

1 Ответ

0 голосов
/ 31 мая 2020

Я думаю, сокет не требуется для обработки перенаправления oauth. Сокет предназначен для другого типа требований.

Также, когда вы вручную нажимаете перенаправление, сокет не вызывается. Просто простая конечная точка http.

Попробуйте использовать этот фрагмент , который имеет извлечение кода oauth:

from urlparse import urlparse,parse_qsl
class Handler(BaseHTTPRequestHandler):

    def do_GET(self):
        url = urlparse(self.path)
        code = parse_qsl(url.query)['code']

Или это:

https://gist.github.com/willnix/daed2b57ab8d613f6bfa53c6d0b46fd3

Вы можете получить больше фрагментов простых конечных точек http:

https://gist.github.com/search?q=def+do_GET+python&ref=searchresults

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...