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
作为参数。
我错过了什么?
答案 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)