facebook이 Redirect URI를 위해 Strict Mode를 사용하고 싶어합니다.

facebook에 낯선 경고가.




In 90 days, we're making a security update to Facebook Login that will invalidate calls from URIs not listed in the Valid OAuth redirect URIs field of your Facebook Login settings.
This update comes in response to malicious activity we saw on our platform, and we want to protect your app or website by requiring a new strict mode for redirect URIs. Take action now to ensure your redirect traffic continues to work. Learn More

모뇨 모뇨 말했다.
요컨대 90 일 이내에 strict mode로하지 않으면 안된다는 것일까

좋은 기회이므로 검토하기로 했다.

python-social-auth로 환승


  • 먼저 유지 보수되지 않았습니다 omab/django-social-auth
    로 환승했다.

  • python-social-auth/social-app-django 그래서, settings.py 설정 변경


  • 구현 방법을 결정했다


  • 소스를 읽어 보았지만, facebook에 대해서 무언가 특별한 option이 있는 것은 아니고, 현재 대응할 수 없는 것 같다.
  • issue에 오르고 있었다
  • 문서

  • redirect_state를 고정하거나 제거하는 방법 중 하나이지만 redirect_state를 고정하는 방향으로 구현하기로 결정했습니다.


  • backend를 자작



    그렇다고 해도 전혀 어려운 일은 하지 않고, 클래스를 계승해, 대상 메소드를 덧쓰기했을 뿐.

    custom_backends.py
    from social_core.backends.facebook import FacebookOAuth2
    
    class FacebookOAuth2Override(FacebookOAuth2):
        # 現在はデフォルトでTrueなので、これはなくても良い
        REDIRECT_STATE = True
    
        # get_or_create_stateを上書く
        def get_or_create_state(self):
            if self.STATE_PARAMETER or self.REDIRECT_STATE:
                # Store state in session for further request validation. The state
                # value is passed as state parameter (as specified in OAuth2 spec),
                # but also added to redirect, that way we can still verify the
                # request if the provider doesn't implement the state parameter.
                # Reuse token if any.
                name = self.name + '_state'
                state = self.strategy.session_get(name)
                try:
                    # settings.pyのSOCIAL_AUTH_FACEBOOK_REDIRECT_STATEを見に行く
                    static_state = self.strategy.get_setting('SOCIAL_AUTH_FACEBOOK_REDIRECT_STATE')
                    # sessionに保存する必要があるかどうか
                    if state != static_state:
                        self.strategy.session_set(name, static_state)
                    state = static_state
                except:
                    # SOCIAL_AUTH_FACEBOOK_REDIRECT_STATEがない場合
                    # sessionにも何も保管されていなかったら新たに取得する
                    if state is None:
                        state = self.state_token()
                        self.strategy.session_set(name, state)
            else:
                state = None
            return state
    

    상기를 적당한 곳에서 (예를 들면 myapp/custom_backends.py 하면)

    settings.py
    AUTHENTICATION_BACKENDS = (
        'social_core.backends.twitter.TwitterOAuth',
        # 'social_core.backends.facebook.FacebookOAuth2',
        'myapp.custom_backends.FacebookOAuth2Override',
        'django.contrib.auth.backends.ModelBackend',
    )
    SOCIAL_AUTH_FACEBOOK_REDIRECT_STATE = '{{static_state}}'
    

    지금의 곳 이런 느낌으로 문제 없을 것 같다.

    페이스 북 측 설정도 잊지 마세요 :(

    추가



    위에서 준 이슈지만 fix되었습니다.
    social_core.backends.facebook.FacebookOAuth2 should have REDIRECT_STATE set to False · Issue #141 · python-social-auth/social-core
    그래서 위의 작업은 불필요하네요.
    redirect state를 사용하지 않는 것 같습니다.

    좋은 웹페이지 즐겨찾기