Я использую 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"))
вно / 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"))