【问题标题】:is there a way to parse python-flask oauth2有没有办法解析 python-flask oauth2
【发布时间】:2021-07-27 00:03:33
【问题描述】:

我有类似下面的代码 -

app = Flask(__name__)


# access token
access_token = None


@app.route('/getcode')
def get_authorization_url():
    oauth = OAuth2Session(client_id, redirect_uri=redirect_uri, scope=scope)
    authorization_url, _state = oauth.authorization_url(authorization_base_url, access_type="authorization_code")
    print('authorization_url')
    print(authorization_url)
    return redirect(authorization_url)


@app.route('/')
def callback():
    global access_token
    oauth = OAuth2Session(client_id, redirect_uri=redirect_uri, scope=scope)
    token = oauth.fetch_token(token_url, authorization_response=request.url, client_secret=client_secret)
    access_token = token['access_token']
    print('access token is:', access_token)

    ## we will be shutting down the server after getting access_token
    ## the thread created here is copied in if __name__ == '__main__' block
    ## and will run after closing the server

    # th = threading.Thread(target=data_from_resource_server, args=(access_token,))
    # th.start()

    func = request.environ.get('werkzeug.server.shutdown')
    if func:
        print('stoping server')
        func()


    return 'see terminal for logs'


if __name__ == '__main__':
    app.secret_key = 'example'
    app.env = 'development'
    print()
    print('Open this url in browser:', 'http://127.0.0.1/getcode', end='\n\n')

    app.run(host='127.0.0.1', port='80')

    print('server stopped')

    ## got access_token, closed the server, now running ray integration code
    if access_token:
        th = threading.Thread(target=data_from_resource_server, args=(access_token,))
        th.start()

在这里当 app.run(host='127.0.0.1', port='80') 运行时给我 URL - http://127.0.0.1/getcode。我需要手动打开输入用户名和密码,然后再打开一个窗口输入 YOB,然后给我类似 -

127.0.0.1 - - [04/May/2021 21:20:23] "GET /**getcode?code=G7h_QL0Cpo3kEqyyNBZ68DTX3JhQ_6E6sl_Sk1x5iBc.oG4JFQiKyZGupTuJ-bV6qE9lA**&scope=orders&state=M6hdb7EJxgNKkuBqbihg1SKaUGAJ7W HTTP/1.1" 302  

这里我的问题是有一种方法可以避免手动打开浏览器并输入凭据并获取代码。我们可以用python解析整个东西吗?

【问题讨论】:

    标签: python flask web-crawler


    【解决方案1】:

    听起来像是 Selenium 的工作!它可以打开网络浏览器并为您解析所需的详细信息。

    启动服务器后运行以下代码

    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys
    
    url = 'http://127.0.0.1/getcode'
    driver = webdriver.Firefox()  # (Or Chrome())
    driver.get(url)
    
    username = driver.find_element_by_id("username")
    password = driver.find_element_by_id("password")
    
    # uncomment this code if your text boxes have pre-populated text
    #username.clear()
    #password.clear()
    
    username.send_keys("YourUsername") # change this to your username
    password.send_keys("PassworD")     # change this to your password
    driver.find_element_by_name("submit").click()
    
    # we can implicitly wait before the page loads
    driver.implicitly_wait(2)
    

    现在,这将处理您问题的第一部分,即自动化登录过程。 现在我不确定你的下一个目标是什么,但我假设你想要 URL 中的 code 变量,我假设它是由 OAuth2 函数返回的。

    我们可以通过简单地获取 URL 并解析代码变量来实现这一点

    获取网址

    current_url = driver.current_url;
    

    现在,您可以简单地使用 urlparse 解析 URL。

    import urllib.parse as urlparse
    from urllib.parse import parse_qs
    
    parsed = urlparse.urlparse(current_url)
    OAuth_code = parse_qs(parsed.query)['code']
    

    您可以参考的一些来源:

    1. https://medium.com/swlh/automate-data-collection-with-selenium-in-python-246a051206e2
    2. Fill username and password using selenium in python
    3. Find URL after clicking a link
    4. https://stackoverflow.com/a/5075477/11029298
    5. https://selenium-python.readthedocs.io/getting-started.html

    【讨论】:

    • 没有硒有没有办法实现这一点?
    • 只有在您接受服务器询问您是否要授权应用程序请求的提示后,才会生成 oauth 代码。即在您的情况下登录。据我所知,似乎真的没有其他方法可以绕过这个Authorization Code Flow
    猜你喜欢
    • 2021-10-28
    • 1970-01-01
    • 2021-07-15
    • 1970-01-01
    • 2012-08-21
    • 2016-07-10
    • 2014-02-25
    • 2013-05-26
    • 1970-01-01
    相关资源
    最近更新 更多