1

私はPythonとWeb開発にかなり慣れていないため、フラスコでFacebookアプリを作成しようとしています。

この Web サイトのコードを使用して開始します。

http://ryaneshea.com/facebook-authentication-for-flask-apps

Facebook の外部で (Web サーバーから) アプリを実行すると、アプリを動作させることができましたが、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 で受け入れられている方法で Web サイトが開くように、テンプレートを変更しようとしました: <script>top.location="/facebook_login";</script>. そのようなことはうまくいきましたが、現在、私のアプリケーションは定期的に Facebook から抜け出し、代わりに Web サーバーに表示されています。

top.location=にのみ表示する必要があると思いますhttps://www.facebook.com/dialog/oauth?scope=email%2C+&redirect_uri=https%3A…F%2Fmywebpage%2Ffacebook_authorized&client_id=1421921424687222が、アプリを壊さずにこれを行う方法はわかりません。

この URL を参照する新しいルートを作成する必要がありますか? facebook_authorized(resp) メソッドで新しい if-else ステートメントを作成して、特定の条件が true の場合に URL にリダイレクトできますか? もしそうなら、どうすればこれを行うことができますか?

私の問題に関連するこの古いスレッドを見つけましたが、そこには python/flask 固有の解決策はありません: Overcoming "Display illegal 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>
4

0 に答える 0