OAuth-Facebook MissingTokenError:(missing_token)缺少访问令牌参数

时间:2019-01-08 00:55:47

标签: flask oauth

我正在使用Flask_Dance扩展名通过我的facebook帐户登录,该应用程序始终返回错误消息:

oauthlib.oauth2.rfc6749.errors.MissingTokenError MissingTokenError: (missing_token) Missing access token parameter.

这是我的配置:

from flask_dance.consumer.backend.sqla import SQLAlchemyBackend
from flask_dance.contrib.facebook import make_facebook_blueprint

facebook_blueprint = make_facebook_blueprint(
    client_id=app.config['FACEBOOK_CLIENT_ID'],
    client_secret=app.config['FACEBOOK_CLIENT_SECRET'],
    scope=["public_profile"]
)

app.register_blueprint(facebook_blueprint)

@oauth_authorized.connect_via(facebook_blueprint)
def facebook_logged_in(blueprint, token):
    resp = blueprint.session.get('me?fields={fields}'.format(fields='id,email,picture,first_name,last_name,verified'))
    if resp.ok:
        account_info_json = resp.json()
        email = account_info_json['email']

        query = User.query.filter_by(email=email)

        try:

            user = query.one()
            user.image = account_info_json['picture']['data']['url']
            db.session.commit()

        except NoResultFound:
            user = User()
            user.image = account_info_json['picture']['data']['url']
            user.fullname = account_info_json['name']
            user.username = account_info_json['name']
            user.email = email
            if account_info_json['verified'] == True:
                user.active = True
                user.confirmed = True
                user.subscribed = True

            default_role = Role.query.filter_by(name="default").first()
            user.roles.append(default_role)

            db.session.add(user)
            db.session.commit()

        login_user(user, remember=True)

        identity_changed.send(
            current_app._get_current_object(),
            identity=Identity(user.id)
        )

facebook_blueprint.backend = SQLAlchemyBackend(OAuth, db.session, user=current_user)

在url中,我可以看到在 code 参数之后的应用程序返回的令牌,如下所示:

https://localhost:5000/facebook/authorized?code=ACCESS_TOKEN#=

以下是扩展程序的版本:

oauthlib==3.0.0
Flask_Dance==1.2.0

回调:

@oauth_blueprint.route("/facebook")
def facebook_login():
    if not facebook.authorized:
        return redirect(url_for("facebook.login"))
    if facebook.authorized:
        next = request.url
        if next is not None:
            return redirect(request.args.get('next') or url_for('home.index'))
    return redirect(url_for("facebook.login"))

contrib / facebook.py

from __future__ import unicode_literals

from flask_dance.consumer import OAuth2ConsumerBlueprint
from functools import partial
from flask.globals import LocalProxy, _lookup_app_object
try:
    from flask import _app_ctx_stack as stack
except ImportError:
    from flask import _request_ctx_stack as stack

def make_facebook_blueprint(
        client_id=None, client_secret=None, scope=None, redirect_url=None,
        redirect_to=None, login_url=None, authorized_url=None,
        session_class=None, backend=None):
    facebook_bp = OAuth2ConsumerBlueprint("facebook", __name__,
        client_id=client_id,
        client_secret=client_secret,
        scope=scope,
        base_url='https://graph.facebook.com/v{version}/'.format(version='3.0'),
        authorization_url='https://www.facebook.com/v{version}/dialog/oauth'.format(version='3.0'),
        token_url='https://graph.facebook.com/v{version}/oauth/access_token'.format(version='3.0'),
        redirect_url= redirect_url,
        redirect_to=redirect_to,
        login_url=login_url,
        authorized_url=authorized_url,
        session_class=session_class,
        backend=backend,
    )
    facebook_bp.from_config["client_id"] = "FACEBOOK_OAUTH_CLIENT_ID"
    facebook_bp.from_config["client_secret"] = "FACEBOOK_OAUTH_CLIENT_SECRET"

    @facebook_bp.before_app_request
    def set_applocal_session():
        ctx = stack.top
        ctx.facebook_oauth = facebook_bp.session

    return facebook_bp

facebook = LocalProxy(partial(_lookup_app_object, "facebook_oauth"))

1 个答案:

答案 0 :(得分:1)

问题是由库期望Python 3 Unicode字符串引起的。

解决方案是在客户端ID和客户端密钥字符串之前添加u,以使字符串进行Unicode编码。