【问题标题】:Python - Getting url a browser was redirected toPython - 获取浏览器重定向到的网址
【发布时间】:2013-03-07 17:44:45
【问题描述】:

我正在尝试使用 API 对应用程序进行身份验证。
方法如下:

  1. 我正在使用 webbrowser.open 打开一个 URL。
  2. 用户对应用程序进行身份验证,并被重定向到另一个 URL,即
    https://stackexchange.com/oauth/login_success,并带有使用此 URL 编码的参数。
    示例重定向 url 是:
    .../login_success#access_token=xyz&expires=00000

我当前的代码:

auth_url = 'https://stackexchange.com/oauth/dialog'
def authenticate():
    scope = "write_access,private_info,read_inbox"
    url = make_url(auth_url,client_id=132,
                   scope=scope,response_type='code',
                   redirect_uri='https://stackexchange.com/oauth/login_success')
    webbrowser.open(url)

用户身份验证后如何获取重定向 URL(用户被带到的 URL)???

【问题讨论】:

  • 难道您不应该重定向到指向 您的 主机的 URL 并使用出现在您服务器上的请求来确定用户是否成功登录?我猜你在一个客户端应用程序中,所以你可能想要启动一个最小的 HTTP 服务器并重定向到localhost:yourport
  • @svckr 是的,但也应该可以从 url 看到发生了什么。如何打开我的localhost 到页面??
  • webbrowser 不能用于那个,它实际上只用于打开浏览器而不是与它们交互。
  • 自己实现 OAuth(使用现有的优秀 Python 实现之一)。
  • @robertklep 什么意思,请详细说明...

标签: python redirect browser urllib2


【解决方案1】:

尝试为一个请求启动您自己的小型 HTTP 服务器,让 API 重定向到它并等待重定向的请求出现。这不是一个完整的例子,只是基本概念:

import BaseHTTPServer
auth_url = 'https://stackexchange.com/oauth/dialog'

# replace with your own http handlers
def wait_for_request(server_class=BaseHTTPServer.HTTPServer,
                     handler_class=BaseHTTPServer.BaseHTTPRequestHandler):
    server_address = ('', 8000)
    httpd = server_class(server_address, handler_class)
    return httpd.handle_request()

def authenticate():
    scope = "write_access,private_info,read_inbox"
    url = make_url(auth_url,client_id=132,
                   scope=scope,response_type='code',
                   redirect_uri='http://localhost:8000/login_success')
    webbrowser.open(url)
    wait_for_request()

您可能需要使用 HTTPS。从长远来看,使用现有的 OAuth 实现可能会更好。

【讨论】:

  • 应用程序登录失败:登录应用程序时出错。错误详细信息:错误描述:应用程序未配置为隐式授权
  • 哦,我的错。 redirect_url 必须在使用 stack-app 注册的域下。所以localhost 不走运。对不起。 :(
【解决方案2】:

用户通过堆栈交换进行身份验证后,SE 页面将重定向回您的页面(下面的“redirect_uri”)。您的代码当前重定向到 https://stackexchange.com/oauth/login_success ;相反,您应该重定向到您控制的页面。

  1. https://stackexchange.com/oauth/dialog 打开一个新窗口,使用这些查询字符串参数
    • client_id
    • 范围
    • redirect_uri
    • 状态 - 可选
  2. 用户批准您的应用
  3. 用户被重定向到redirect_uri,这些参数在散列中
    • access_token
    • expires - 可选,仅当范围不包含 no_expiry 时

来源:https://api.stackexchange.com/docs/authentication

【讨论】:

  • redirect_uri 应该是你服务器上的一个页面
  • 那么就没有办法做oauth了。至少,您可以创建一个在 localhost 上运行的服务器以重定向到
  • 如果你只是想尝试一下,docs.python.org/2/library/simplehttpserver.html。 Rails 和 GAE 等许多环境还带有用于本地测试的简单服务器
猜你喜欢
  • 1970-01-01
  • 2013-03-09
  • 1970-01-01
  • 1970-01-01
  • 2013-02-25
  • 2016-01-02
  • 1970-01-01
  • 2013-04-27
  • 2017-05-15
相关资源
最近更新 更多