Перейду к делу, изучив код я понял, что он был написан ещё в 2015 году, короче говоря, ещё до глобальных изменений джанге, а именно система юрлов и тд. и тп. Код работает на 2/3, но есть одна небольшая проблема. При переходе на страницу логина через стим, запрашивает логин и пароль от стима, хорошо, авторизируюсь, прохожу стим гвард и после этого мне возвращается ошибка 403(1-й скрин собственно)
У меня есть версия, что это происходит из-за того, что запрос на стим приходит не в том виде, в котором должен. Имею ввиду, с запросе не передаются некоторые параметры, потому что я сравнил свой запрос и запрос с рандомного сайта, на котором есть авторизация через стим. Приложу сюда весь код, надеюсь на вашу помощь! Спасибо!
models.py
from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager from django.contrib.auth.models import PermissionsMixin from django.db import models from django.utils import timezone from django.utils.translation import ugettext_lazy as _ class SteamUserManager(BaseUserManager): def _create_user(self, steamid, password, **extra_fields): """ Creates and saves a User with the given steamid and password. """ try: # python social auth provides an empty email param, which cannot be used here del extra_fields['email'] except KeyError: pass if not steamid: raise ValueError('The given steamid must be set') user = self.model(steamid=steamid, **extra_fields) user.set_password(password) user.save(using=self._db) return user def create_user(self, steamid, password=None, **extra_fields): extra_fields.setdefault('is_staff', False) extra_fields.setdefault('is_superuser', False) return self._create_user(steamid, password, **extra_fields) def create_superuser(self, steamid, password, **extra_fields): extra_fields.setdefault('is_staff', True) extra_fields.setdefault('is_superuser', True) if extra_fields.get('is_staff') is not True: raise ValueError('Superuser must have is_staff=True.') if extra_fields.get('is_superuser') is not True: raise ValueError('Superuser must have is_superuser=True.') return self._create_user(steamid, password, **extra_fields) class SteamUser(AbstractBaseUser, PermissionsMixin): USERNAME_FIELD = 'steamid' steamid = models.CharField(max_length=17, unique=True) personaname = models.CharField(max_length=255) profileurl = models.CharField(max_length=300) avatar = models.CharField(max_length=255) avatarmedium = models.CharField(max_length=255) avatarfull = models.CharField(max_length=255) # Add the other fields that can be retrieved from the Web-API if required date_joined = models.DateTimeField(_('date joined'), default=timezone.now) is_active = models.BooleanField(default=True) is_staff = models.BooleanField(default=False) objects = SteamUserManager() def get_short_name(self): return self.personaname def get_full_name(self): return self.personaname
pipeline.py(используется библиотека social-auth)
from authentication.models import SteamUser
def get_username(strategy, uid, user=None, *args, **kwargs):
"""Removes unnecessary slugification and cleaning of the username since the uid is unique and well formed"""
if not user:
username = uid
else:
username = strategy.storage.user.get_username(user)
return {'username': username}
def user_details(user, details, strategy, *args, **kwargs):
"""Update user details using data from provider."""
if user:
changed = False # flag to track changes
protected = ('steamid', 'id', 'pk') + tuple(strategy.setting('PROTECTED_USER_FIELDS', []))
# Update user model attributes with the new data sent by the current
# provider. Update on some attributes is disabled by default, for
# example username and id fields. It's also possible to disable update
# on fields defined in SOCIAL_AUTH_PROTECTED_FIELDS.
if details['player']:
for name, value in details['player'].items():
if value is not None and hasattr(user, name):
current_value = getattr(user, name, None)
if not current_value or name not in protected:
changed |= current_value != value
setattr(user, name, value)
if changed:
strategy.storage.user.changed(user)
def associate_existing_user(uid, *args, **kwargs):
"""If there already is an user with the given steamid, hand it over to the pipeline"""
if SteamUser.objects.filter(steamid=uid).exists():
return {
'user': SteamUser.objects.get(steamid=uid)
}
urls.py приложения
from django.conf.urls import url from django.contrib.auth.decorators import login_required from authentication.views import IndexView, LogoutView urlpatterns = [ url(r'^$', IndexView.as_view(), name='index'), url(r'^logout', login_required(LogoutView.as_view(), login_url='/'), name='logout') ]
views.py приложения
from django.contrib.auth import logout from django.shortcuts import render, redirect from django.views import View class IndexView(View): def get(self, request): return render(request, 'index.html') class LogoutView(View): def get(self, request): logout(request) return redirect('auth:index')
urls.py основной
from django.conf.urls import url, include from django.contrib import admin urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^', include(('social_django.urls', 'social'), namespace='social')), url(r'^', include(('authentication.urls', 'auth'), namespace='auth')), ]