如何设置" next" url收到flask_github.authorized_handler?

时间:2015-08-07 23:57:26

标签: python github flask

Github-flask文档中的示例github.authorized_handler看起来像这样:

@app.route('/github-callback')
@github.authorized_handler
def authorized(oauth_token):
    next_url = request.args.get('next') or url_for('index')

    ### blah blah blah ###

    return redirect(next_url)

据推测,next是我的网络应用程序在登录完成后存放用户的网址,但我无法弄清楚如何控制自授权处理程序以来next的内容调用authorize()时会调用它,但它似乎不会将next作为参数。

我错过了什么?

2 个答案:

答案 0 :(得分:1)

Github-flask的authorize()采用可选参数redirect_uri,我可以使用该参数将next的{​​{1}}参数转发给github_auth_start()回调。

这起初并不起作用,因为我忘记了此处指定的authorized_handler的要求:

https://developer.github.com/v3/oauth/#redirect-urls

特别是:“重定向网址的路径必须引用回调网址的子目录。”

现在看来显而易见的另一个要求 - 但不是在其中 - 是URL必须是带有方案,主机和端口的绝对URL,并且redirect_uri默认返回相对URL,因此我需要通过url_for()

现在,我的_external=True看起来像这样:

github_auth_start()

它终于工作了。

答案 1 :(得分:0)

我在使用rauth库实现OAuth2Service时遇到了类似的问题。我解决问题的方法是使用会话,这将在整个OAuth舞蹈期间保持:

在我的登录路线上:

@main.route('/login', methods=['GET','POST'])
def login():

    if request.args.get('next'):
        session['next_url'] = request.args.get('next')

然后在我的回调路线上:

@main.route('/callback/<provider>')
def oauth_callback(provider):

    ....

    next_url = None
    if session.get('next_url'):
        next_url = session.pop('next_url')
    else:
        next_url = url_for('main.home')

    return redirect(next_url)