Pertanyaan Otentikasi Berbasis Token di Django


Saya mencoba mencari tahu cara terbaik untuk menerapkan otentikasi berbasis token di aplikasi Django saya. Aplikasi eksternal, non-Django adalah pengaturan cookie, dengan token, dan saya memiliki webservice yang dapat mengambil informasi pengguna berdasarkan dari token itu. Jika pengguna memiliki kumpulan cookie, mereka tidak perlu mengotentikasi di situs saya dan seharusnya secara otomatis masuk berdasarkan info yang diberikan kembali oleh layanan web. Seperti yang saya lihat, ada beberapa opsi berbeda untuk melakukan pemeriksaan yang sebenarnya dan saya tidak yakin mana yang terbaik:

  1. Tulis penghias khusus seperti yang ada di ini potongan dan menggunakannya sebagai gantinya login_required.
  2. Panggil metode otentikasi khusus di dalam base_site melalui panggilan ajax. Pada setiap halaman, cek akan dibuat dan jika cookie ada dan valid, maka pengguna akan secara otomatis masuk.
  3. Tambahkan beberapa javascript ke LOGIN_REDIRECT_URL halaman yang akan memeriksa / memvalidasi cookie dalam panggilan ajax, dan secara otomatis mengarahkan kembali ke referrer jika cookie diotentikasi.

Apakah ada opsi yang saya lewatkan? Idealnya, akan ada cara untuk membangun ini menjadi login_required, tanpa harus menulis dekorator khusus.


32
2018-02-17 00:14


asal


Jawaban:


Sebelum mencari kode, pastikan Anda membaca dokumentasi. http://docs.djangoproject.com/en/1.2/topics/auth/#other-authentication-sources Juga baca sumber Django yang disediakan.

Anda ingin membuat tiga hal.

  1. Middleware untuk menangkap token. Di sinilah sebagian besar pekerjaan terjadi. Ini memeriksa token, mengotentikasi itu (dengan mengkonfirmasikannya dengan manajer identitas) dan kemudian login di pengguna.

  2. Otentikasi backend untuk menemukan Pengguna. Ini adalah sebuah rintisan. Semua yang dilakukannya adalah membuat pengguna sesuai kebutuhan. Pengelola identitas Anda memiliki detailnya. Anda baru saja menyimpan versi pengguna saat ini di DB lokal Django.

Inilah middleware (diedit).

from django.contrib.auth import authenticate, login

class CookieMiddleware( object ):
    """Authentication Middleware for OpenAM using a cookie with a token.
    Backend will get user.
    """
    def process_request(self, request):
        if not hasattr(request, 'user'):
            raise ImproperlyConfigured() 
        if "thecookiename" not in request.COOKIES:
            return
        token= request.COOKIES["thecookiename"]
        # REST request to OpenAM server for user attributes.
        token, attribute, role = identity_manager.get_attributes( token )
        user = authenticate(remote_user=attribute['uid'][0])
        request.user = user
        login(request, user)

Itu identity_manager.get_attributes adalah kelas terpisah yang kami tulis untuk memvalidasi token dan mendapatkan rincian tentang pengguna dari sumber IM. Ini, tentu saja, harus dipermainkan untuk tujuan pengujian.

Berikut ini backend (diedit)

class Backend( RemoteUserBackend ):
    def authenticate(**credentials):
        """We could authenticate the token by checking with OpenAM
        Server.  We don't do that here, instead we trust the middleware to do it.
        """
        try:
            user= User.objects.get(username=credentials['remote_user'])
        except User.DoesNotExist:
            user= User.objects.create(username=credentials['remote_user'] )
        # Here is a good place to map roles to Django Group instances or other features.
        return user

Ini tidak secara material mengubah dekorator untuk otentikasi atau otorisasi.

Untuk memastikan hal ini, kami benar-benar menyegarkan informasi Pengguna dan Grup dari kami manajer identitas.

Perhatikan bahwa middleware berjalan untuk setiap permintaan tunggal. Terkadang, tidak apa-apa untuk memberikan token kepada yang didukung authenticate metode. Jika token ada di DB pengguna lokal, permintaan dapat dilanjutkan tanpa menghubungi pengelola identitas.

Kami, bagaimanapun, memiliki aturan dan batas waktu yang rumit di pengelola identitas, jadi kami harus memeriksa setiap token untuk memastikan itu valid. Setelah middleware yakin token itu valid, kita dapat mengizinkan backend untuk melakukan pemrosesan tambahan.

Ini bukan kode langsung kami (ini agak terlalu rumit untuk dijadikan contoh yang baik.)


20
2018-02-17 00:38