我对 python 和 web 开发相当陌生,试图用烧瓶制作一个 Facebook 应用程序。
使用此网站的代码开始:
http://ryaneshea.com/facebook-authentication-for-flask-apps
当我在 Facebook 之外(从我的网络服务器)运行该应用程序时,我能够让该应用程序正常工作,但是当我将它嵌入 Facebook 时(这就是重点),新用户由于此消息而无法进行身份验证(在浏览器开发人员中看到)安慰) :
“拒绝'https://www.facebook.com/dialog/oauth?scope=email%2C+&redirect_uri=https%3A…F%2Fmywebpage%2Ffacebook_authorized&client_id=1421921424687222'
在框架中显示,因为它将 'X-Frame-Options' 设置为 'DENY'。”
然后我尝试更改我的模板,以便通过添加以下代码以 Facebook 接受的方式打开网站<script>top.location="/facebook_login";</script>
:那种工作,但现在我的应用程序经常打破 Facebook 并显示在网络服务器上。
我想应该做的是只https://www.facebook.com/dialog/oauth?scope=email%2C+&redirect_uri=https%3A…F%2Fmywebpage%2Ffacebook_authorized&client_id=1421921424687222
在 top.location= 中显示,但不确定如何在不破坏应用程序的情况下做到这一点。
我是否需要创建一个引用此 url 的新路由?如果某些特定条件为真,我可以在 facebook_authorized(resp) 方法中创建一个新的 if-else 语句以重定向到 url 吗?如果是这样,如何做到这一点?
我发现了这个与我的问题相关的旧线程,但其中没有特定于 python/flask 的解决方案:Overcoming "Display denied by X-Frame-Options"。
任何建议将不胜感激!
这是相关的python代码:
oauth = OAuth()
facebook = oauth.remote_app('facebook',
base_url='https://graph.facebook.com/',
request_token_url=None,
# access_token_url='/oauth/access_token',
access_token_url='/oauth/access_token',
authorize_url='https://www.facebook.com/dialog/oauth',
consumer_key=FACEBOOK_APP_ID,
consumer_secret=FACEBOOK_APP_SECRET,
request_token_params={'scope': 'email, '}
)
app = Flask(__name__)
@facebook.tokengetter
def get_facebook_token():
return session.get('facebook_token')
def pop_login_session():
session.pop('logged_in', None)
session.pop('facebook_token', None)
@app.route("/", methods=['GET', 'POST'])
def index():
return render_template('index.html')
@app.route("/facebook_login", methods=['GET', 'POST'])
def facebook_login():
return facebook.authorize(callback=url_for('facebook_authorized',
next=request.args.get('next'), _external=True))
@app.route("/facebook_authorized", methods=['GET', 'POST'])
@facebook.authorized_handler
def facebook_authorized(resp):
next_url = request.args.get('next') or url_for('index')
if resp is None or 'access_token' not in resp:
return redirect(next_url)
session['logged_in'] = True
session['facebook_token'] = (resp['access_token'], '')
return redirect(next_url)
以下是模板的相关部分:
<html lang="en">
<head>
{% block head %}
<title>MY_NEW_APP{% block title %}{% endblock %}</title>
<body>
{% block navbar %}
<div class="navbar navbar-fixed-top">
<div class="navbar-inner">
<div class="container">
<a class="brand" href="#">MY_NEW_APP</a>
<div class="nav-collapse">
{% block navbar_right %}
<ul class="nav pull-right">
{% if not session.logged_in %}
<li><a href="/facebook_login">Login or Signup</a></li>
<!-- <script>top.location="/facebook_login";</script>-->
{% else %}
<li><a href="/logout">Logout</a></li>
{% endif %}
</ul>
{% endblock %}
</div><!--/.nav-collapse -->
</div>
</div>
</div>
{% endblock %}
</head>
</html>