/ / Jak mogę prosić o różne uprawnienia z Facebooka w różnych momentach? - django, facebook, python-social-auth

Jak mogę prosić o różne uprawnienia z Facebooka w różnych momentach? - django, facebook, python-social-auth

Facebook zaleca to podczas korzystania z Facebookalogin powinieneś najpierw poprosić użytkownika o jak najmniejszą liczbę uprawnień, aw szczególności unikać prośby o pozwolenie na publikację, dopóki użytkownik nie będzie musiał opublikować czegoś za pośrednictwem Twojej witryny - https://developers.facebook.com/docs/facebook-login/permissions/#optimizing.

Próbowaliśmy zaimplementować to za pomocąpython-social-auth "django, ale wygląda na to, że nie ma sposobu, aby poprosić o różne uprawnienia w różnych punktach witryny - zakres jest ustawiany za pomocą SOCIAL_AUTH_FACEBOOK_SCOPE ustawienie i nie można później poprosić o inny zakres (np. wykluczając publish_actions od SOCIAL_AUTH_FACEBOOK_SCOPE, a następnie prosząc użytkownika o udzielenie tego pozwolenia, gdy próbuje publikować posty z Twojej witryny na Facebooku).

Czy ktoś wie, czy jest to możliwe w aplikacji python-social-auth, a jeśli tak, to w jaki sposób?

Odpowiedzi:

4 dla odpowiedzi № 1

(Poniższy tekst został wyodrębniony z dokumentów pod adresem http://psa.matiasaguirre.net/docs/use_cases.html#multiple-scopes-per-provider)

W tej chwili python-social-auth nie zapewniametoda definiowania wielu zakresów dla jednego zaplecza, jest to zwykle pożądane, ponieważ zaleca się, aby zapytać użytkownika o minimalny możliwy zakres i zwiększyć dostęp, gdy jest to naprawdę potrzebne. Możliwe jest dodanie nowego zaplecza, rozszerzającego oryginalny, aby osiągnąć to zachowanie, są na to dwa sposoby.

Nadrzędny get_scope() metoda

from social.backends.facebook import FacebookOAuth2


class CustomFacebookOAuth2(FacebookOauth2):
def get_scope(self):
scope = super(CustomFacebookOAuth2, self).get_scope()
if self.data.get("extrascope"):
scope += [("foo", "bar")]
return scope

Ta metoda jest dość prosta, zastępuje metodę, która zwraca wartość zakresu w zapleczu (get_scope()) i dodaje dodatkowe wartości do listy, jeśli zostało to wskazane przez parametr w GET lub POST dane (self.data).

Umieść ten nowy backend w jakimś miejscu w swoim projekcie i zamień oryginał FacebookOAuth2 w AUTHENTICATION_BACKENDS z tą nową wersją.

Definiowanie zaplecza do obsługi zakresu

Można zrobić to samo, definiując sekundębackend, który rozciąga się od oryginału, ale zastępuje nazwę, będzie to oznaczać nowe adresy URL, a także nowe ustawienia dla nowego zaplecza (ponieważ nazwa jest używana do tworzenia nazw ustawień), oznacza również nową aplikację u dostawcy, ponieważ nie wszyscy dostawcy daje możliwość zdefiniowania wielu adresów URL przekierowań. Aby to zrobić, po prostu dodaj backend, taki jak:

from social.backends.facebook import FacebookOAuth2


class CustomFacebookOAuth2(FacebookOauth2):
name = "facebook-custom"

Umieść ten nowy backend w jakimś miejscu w swoim projekcie, zachowując oryginał FacebookOAuth2 w AUTHENTICATION_BACKENDS. Teraz będzie działać nowy zestaw adresów URL:

/login/facebook-custom
/complete/facebook-custom
/disconnect/facebook-custom

A także nowy zestaw ustawień:

SOCIAL_AUTH_FACEBOOK_CUSTOM_KEY = "..."
SOCIAL_AUTH_FACEBOOK_CUSTOM_SECRET = "..."
SOCIAL_AUTH_FACEBOOK_CUSTOM_SCOPE = [...]

Gdy potrzebne są dodatkowe uprawnienia, po prostu przekieruj użytkownika do /login/facebook-custom a następnie pobierz wpis uwierzytelniania społecznościowego dla tego nowego zaplecza za pomocą user.social_auth.get(provider="facebook-custom") i użyj access_token w tym.