Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Django
  • » Проблемы с авторизацией через Steam OpenID Django [RSS Feed]

#1 Ноя. 13, 2019 20:25:09

Gasplyak
Зарегистрирован: 2019-09-09
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблемы с авторизацией через Steam OpenID Django

Всем привет! Может вы видели мой прошлый топик о том, как я ищу решение проблемы авторизации через стим на своём сайте. Так вот, в кратце, я нашёл верное решение, огромный респект человеку, который смог создать примитивное решение и выложить в сеть.
Перейду к делу, изучив код я понял, что он был написан ещё в 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')),
]

Прикреплённый файлы:
attachment 213.png (103,3 KБ)

Офлайн

  • Начало
  • » Django
  • » Проблемы с авторизацией через Steam OpenID Django[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version