0

私はdjango-social-auth(https://github.com/omab/django-social-auth)を使用してきましたが、ある程度の成功を収めています。TwitterとFacebookからのログインは問題なく設定されています。ただし、一部のOpenIDプロバイダーからログインすると、ユーザー名に空の変数が表示され、social-authアプリでこれが許可されます(SOCIAL_AUTH_DEFAULT_USERNAMEを設定しているにもかかわらず)。

SOCIAL_AUTH_DEFAULT_USERNAMEが適切に機能した場合、それは暫定的な解決策になる可能性がありますが、理想的には、openIDプロバイダーから自動的に設定されることをお勧めします。基本的に、私には2つの可能な解決策が残されています。

1)カスタムメソッドを作成して、openIDプロバイダーから送信された追加データの一部を抽出し、そこからユーザー名を設定します。2)ユーザーが最初にログインするときにユーザー名を設定するように強制します。

(2)はあまり洗練されていませんが、ユーザー名が毎回挿入されていることを確認し、ユーザー名に適した形式ではない可能性のある自動情報を後処理する必要もありません。

私の質問は、上記のいずれかを実装するにはどうすればよいですか?完全な回答は必要ありませんが、メソッドへのポインタをいただければ幸いです。

別の方法は、django-socialregistrationで遊んで、それが生活を楽にするかどうかを確認することです!

J

4

1 に答える 1

2

1はおそらく進むべき道です。問題が発生しているソーシャル プロバイダーの Backend クラスの get_user_details メソッドをオーバーライドして、そこからユーザー名を取得できます。

たとえば、Facebook の場合は次のようになります。

from social_auth.backends.facebook import FacebookBackend
class CustomFacebookBackend(FacebookBackend):
    name = 'facebook'

    def get_user_details(self, response):
        """Return user details from Facebook account"""
        return {'username': response['name'],
                'email': response.get('email', ''),
                'first_name': response.get('first_name', ''),
                'last_name': response.get('last_name', '')}

"response" 変数は、リクエストから OAuth プロバイダーに返された、ユーザーの詳細に関する逆シリアル化されたデータであるため、そこから必要なものを取得したり、ここに独自の値を挿入したりできます。social-auth は、「ユーザー名」に入力したものを何でも取得し、それを新しいアカウントのユーザー名として使用します。さらに制御したい場合は、バックエンドの「ユーザー名」メソッドもオーバーライドしてみてください。

バックエンドをオーバーライドするときは、settings.py の AUTHENTICATION_BACKENDS に忘れずに追加してください。また、これがどのように機能するのか正確にはわかりませんが、ソーシャル認証を取得してバックエンドを適切にリンクするには、カスタム バックエンドを含むファイルに次のようなものを追加する必要があると思います。

BACKENDS = {
    'facebook': CustomFacebookAuth,
}
于 2011-07-16T21:51:31.943 に答える