Requieren permisos extendidos en aplicación pyfacebook FBML
-
19-09-2019 - |
Pregunta
Estoy tratando de conseguir mi página de lienzo FBML a los nuevos usuarios de la aplicación automáticamente solicitará permiso para publish_stream. Después de documentación de Facebook He intentado utilizar el argumento required_permissions a require_login. Es decir, traté de usar el decorador pyfacebook require_login como esto:
@facebook.require_login(required_permissions='publish_stream')
como en:
@decorator_from_middleware(FacebookMiddleware)
@facebook.require_login(required_permissions='publish_stream')
def canvas(request, template):
...
Solicitando permisos ampliados en un Facebook iFrame aplicación basada en pyfacebook ha sido discutido . Solicitando permisos ampliados en una aplicación FBML también . Mi objetivo es requieren permisos extendidos en una aplicación FBML. Me estoy perdiendo algo o puede alguien sugerir una solución?
Gracias.
Solución
Derecho, pyfacebook
no admite todavía required_permissions
para login
, pero se puede llamar (o más bien, redirigir a) authorize
manualmente. Acabo de escribir la siguiente decorador para mis propósitos:
def require_permissions(*names):
"""Require extended permissions.
XXX: in theory, the facebook.require_login() decorator should support
this, but doesn't in pyfacebook yet."""
def decorator(fn):
required_perms = set(names)
def wrapper(request, *args, **kwargs):
fb = request.facebook
perms = set() if fb.ext_perms is None \
else set(fb.ext_perms.split(','))
if not required_perms.issubset(perms):
missing = required_perms.difference(perms)
url = fb.get_ext_perm_url(','.join(missing),
next='%s%s' % (fb.get_app_url(), request.path[1:]))
print url
return fb.redirect(url)
return fn(request, *args, **kwargs)
return wrapper
return decorator
Es posible que tenga que ajustar el valor de next
ya que se pasa a get_ext_perm_url
, pero esto lo contrario debe estar bien (que funciona para mí). Ejemplo de uso:
@facebook.require_login()
@facebook.require_add()
@require_permissions('email', 'offline_access')
def index(request):
# ...