auth vk
This commit is contained in:
parent
1a6bf13b96
commit
d4d7474d9a
24
Main/views/CheckNew.py
Normal file
24
Main/views/CheckNew.py
Normal file
@ -0,0 +1,24 @@
|
||||
from django.contrib.auth.models import User
|
||||
from django.http import HttpResponse
|
||||
|
||||
from SprintLib.BaseView import BaseView
|
||||
|
||||
|
||||
class CheckNew(BaseView):
|
||||
endpoint = "check_new"
|
||||
|
||||
def post_check_username(self):
|
||||
username = self.request.POST['username']
|
||||
user = User.objects.filter(username=username).first()
|
||||
if len(username) < 8:
|
||||
user = 'incorrect'
|
||||
return HttpResponse(status=400 if user else 200)
|
||||
|
||||
def post_check_email(self):
|
||||
email = self.request.POST['email']
|
||||
user = User.objects.filter(email=email).first()
|
||||
if email.count('.') == 0 or email.count('@') != 1:
|
||||
user = 'incorrect'
|
||||
if email.find('@') > email.rfind('.'):
|
||||
user = 'incorrect'
|
||||
return HttpResponse(status=400 if user else 200)
|
@ -1,3 +1,7 @@
|
||||
from django.contrib.auth import authenticate, login
|
||||
from django.contrib.auth.models import User
|
||||
from django.db.models import Q
|
||||
|
||||
from SprintLib.BaseView import BaseView
|
||||
|
||||
|
||||
@ -5,3 +9,14 @@ class EnterView(BaseView):
|
||||
view_file = "enter.html"
|
||||
required_login = False
|
||||
endpoint = "enter"
|
||||
|
||||
def post(self):
|
||||
username = self.request.POST['username']
|
||||
user = User.objects.filter(Q(username=username) | Q(email=username)).first()
|
||||
if user is None:
|
||||
return "/enter"
|
||||
user = authenticate(username=user.username, password=self.request.POST['password'])
|
||||
if user is None:
|
||||
return "/enter"
|
||||
login(self.request, user)
|
||||
return "/"
|
||||
|
@ -15,7 +15,7 @@ class MainView(BaseView):
|
||||
|
||||
@property
|
||||
def view_file(self):
|
||||
if self.request.user.is_authenticated:
|
||||
if self.request.user.is_authenticated and self.request.user.userinfo.verified:
|
||||
return "main.html"
|
||||
return "landing.html"
|
||||
|
||||
|
34
Main/views/RegisterView.py
Normal file
34
Main/views/RegisterView.py
Normal file
@ -0,0 +1,34 @@
|
||||
from django.contrib.auth import login
|
||||
from django.contrib.auth.models import User
|
||||
from django.db.models import Q
|
||||
|
||||
from Main.models import UserInfo
|
||||
from SprintLib.BaseView import BaseView
|
||||
|
||||
|
||||
class RegisterView(BaseView):
|
||||
view_file = "register.html"
|
||||
required_login = False
|
||||
endpoint = "register"
|
||||
|
||||
def post(self):
|
||||
username = self.request.POST['username']
|
||||
email = self.request.POST['email']
|
||||
surname = self.request.POST['surname']
|
||||
name = self.request.POST['name']
|
||||
password = self.request.POST['password']
|
||||
if User.objects.filter(Q(email=email) | Q(username=username)):
|
||||
return '/register'
|
||||
user = User.objects.create_user(
|
||||
username=username,
|
||||
email=email,
|
||||
password=password
|
||||
)
|
||||
UserInfo.objects.create(
|
||||
surname=surname,
|
||||
name=name,
|
||||
user=user,
|
||||
verified=True
|
||||
)
|
||||
login(self.request, user)
|
||||
return "/"
|
28
Main/views/SetUsernameView.py
Normal file
28
Main/views/SetUsernameView.py
Normal file
@ -0,0 +1,28 @@
|
||||
from django.contrib.auth import login
|
||||
from django.contrib.auth.models import User
|
||||
|
||||
from SprintLib.BaseView import BaseView
|
||||
|
||||
|
||||
class SetUsernameView(BaseView):
|
||||
endpoint = "set_username"
|
||||
view_file = "set_username.html"
|
||||
required_login = False
|
||||
|
||||
def get(self):
|
||||
if not self.request.user.is_authenticated:
|
||||
return "/"
|
||||
|
||||
def post(self):
|
||||
if not self.request.user.is_authenticated:
|
||||
return "/"
|
||||
user = User.objects.filter(username=self.request.POST['username']).first()
|
||||
if user is None:
|
||||
self.request.user.username = self.request.POST['username']
|
||||
self.request.user.userinfo.verified = True
|
||||
self.request.user.save()
|
||||
self.request.user.userinfo.save()
|
||||
login(self.request, self.request.user)
|
||||
return "/"
|
||||
else:
|
||||
return "/set_username"
|
22
Main/views/TelegramEnterView.py
Normal file
22
Main/views/TelegramEnterView.py
Normal file
@ -0,0 +1,22 @@
|
||||
from django.contrib.auth import authenticate, login
|
||||
from django.contrib.auth.models import User
|
||||
from django.db.models import Q
|
||||
|
||||
from SprintLib.BaseView import BaseView
|
||||
|
||||
|
||||
class TelegramEnterView(BaseView):
|
||||
view_file = "telegram_enter.html"
|
||||
required_login = False
|
||||
endpoint = "telegram_enter"
|
||||
|
||||
def post(self):
|
||||
username = self.request.POST['username']
|
||||
user = User.objects.filter(Q(username=username) | Q(email=username)).first()
|
||||
if user is None:
|
||||
return "/enter"
|
||||
user = authenticate(username=user.username, password=self.request.POST['password'])
|
||||
if user is None:
|
||||
return "/enter"
|
||||
login(self.request, user)
|
||||
return "/"
|
@ -18,4 +18,8 @@ from Main.views.SetView import SetView
|
||||
from Main.views.GroupView import GroupView
|
||||
from Main.views.CheckersView import CheckersView
|
||||
from Main.views.DownloadFileView import DownloadFileView
|
||||
from Main.views.RegisterView import RegisterView
|
||||
from Main.views.CheckNew import CheckNew
|
||||
from Main.views.TelegramEnterView import TelegramEnterView
|
||||
from Main.views.SetUsernameView import SetUsernameView
|
||||
from Main.views.social import *
|
||||
|
@ -1,10 +1,13 @@
|
||||
import os
|
||||
import random
|
||||
import string
|
||||
|
||||
from django.contrib.auth import login
|
||||
from django.contrib.auth.models import User
|
||||
from django.core.exceptions import ObjectDoesNotExist
|
||||
from requests import get
|
||||
|
||||
from Main.models import UserInfo
|
||||
from SprintLib.BaseView import BaseView
|
||||
|
||||
|
||||
@ -22,10 +25,26 @@ class VKAuthView(BaseView):
|
||||
resp = get(f'https://api.vk.com/method/secure.checkToken?token={access_token}&access_token={token}&v=5.131').json()
|
||||
if 'response' in resp and 'success' in resp['response'] and resp['response']['success'] == 1:
|
||||
user_id = resp['response']['user_id']
|
||||
random_string = lambda: ''.join(random.choices(string.ascii_uppercase + string.digits, k=100))
|
||||
try:
|
||||
user = User.objects.get(userinfo__vk_user_id=user_id)
|
||||
except ObjectDoesNotExist:
|
||||
return "/enter"
|
||||
resp = get(f'https://api.vk.com/method/users.get?access_token={token}&user_ids={user_id}&v=5.131',
|
||||
headers={"accept-language": "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7"})
|
||||
if resp.status_code != 200:
|
||||
return "/enter"
|
||||
data = resp.json()['response'][0]
|
||||
user = User.objects.create_user(
|
||||
username=random_string(),
|
||||
email='',
|
||||
password=random_string()
|
||||
)
|
||||
UserInfo.objects.create(
|
||||
surname=data['last_name'],
|
||||
name=data['first_name'],
|
||||
vk_user_id=user_id,
|
||||
user=user
|
||||
)
|
||||
login(self.request, user)
|
||||
return "/"
|
||||
return "/set_username"
|
||||
return "/enter"
|
||||
|
@ -33,7 +33,9 @@ class BaseView:
|
||||
if c.required_login is not None:
|
||||
if c.required_login and not request.user.is_authenticated:
|
||||
return HttpResponseRedirect("/enter")
|
||||
if not c.required_login and request.user.is_authenticated:
|
||||
if c.required_login and not request.user.userinfo.verified:
|
||||
return HttpResponseRedirect("/set_username")
|
||||
if not c.required_login and request.user.is_authenticated and request.user.userinfo.verified:
|
||||
return HttpResponseRedirect("/")
|
||||
request_method = request.method.lower()
|
||||
exec("from Main.models import *")
|
||||
|
@ -2,41 +2,6 @@
|
||||
|
||||
{% block title %}Вход{% endblock %}
|
||||
|
||||
{% block scripts %}
|
||||
function send_code() {
|
||||
const p = document.getElementById('message');
|
||||
if (document.getElementById('state').value == 'code') {
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
url: '/send_code',
|
||||
data: {"username": document.getElementById('username').value, "csrfmiddlewaretoken": document.getElementsByName('csrfmiddlewaretoken')[0].value, "action": "create"},
|
||||
success: function(data) {
|
||||
if (data['success']) {
|
||||
document.getElementById('code').hidden = false;
|
||||
document.getElementById('enter').firstChild.data = "Вход";
|
||||
document.getElementById('state').value = "verify";
|
||||
p.innerHTML = '';
|
||||
} else {
|
||||
p.innerHTML = data['message'];
|
||||
}
|
||||
}});
|
||||
} else {
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
url: '/send_code',
|
||||
data: {"username": document.getElementById('username').value, "code": document.getElementById('code').value, "csrfmiddlewaretoken": document.getElementsByName('csrfmiddlewaretoken')[0].value, "action": "check"},
|
||||
success: function(data) {
|
||||
if (data['success']) {
|
||||
window.location.href = '/';
|
||||
} else {
|
||||
p.innerHTML = data['message'];
|
||||
}
|
||||
},
|
||||
});
|
||||
}
|
||||
}
|
||||
{% endblock %}
|
||||
|
||||
{% block body %}
|
||||
<div class="center">
|
||||
<center>
|
||||
@ -44,18 +9,21 @@
|
||||
<table><tr><td><img style="height: 80px; width: 80px;" src="/static/assets/img/brand/dark.svg" /></td><td><h1>Sprint</h1></td></tr></table>
|
||||
</div>
|
||||
<div>
|
||||
<p id="message" style="color: red;"></p>
|
||||
{% csrf_token %}
|
||||
<input type="text" class="form" name="username" id="username" placeholder="username"><br>
|
||||
<input type="password" class="form" name="code" id="code" placeholder="code" hidden><br>
|
||||
<input type="hidden" id="state" value="code">
|
||||
<button type="button" onclick="send_code()" id="enter" class="sub btn btn-dark form">Отправить код</button>
|
||||
<form method="POST">
|
||||
<p id="message" style="color: red;"></p>
|
||||
{% csrf_token %}
|
||||
<input type="text" class="form" name="username" id="username" placeholder="Имя пользователя или email"><br>
|
||||
<input type="password" class="form" name="password" placeholder="пароль"><br>
|
||||
<input type="hidden" id="state" value="code">
|
||||
<button type="submit" id="enter" class="sub btn btn-dark form">Вход</button>
|
||||
</form>
|
||||
</div>
|
||||
<div>
|
||||
<a href="https://t.me/sprint_notifications_bot" target="_blank" class="sub btn btn-dark form">Регистрация</a>
|
||||
<a href="/register" class="sub btn btn-dark form">Регистрация</a>
|
||||
</div><br>
|
||||
или войти с помощью<br><br>
|
||||
<a href="https://oauth.vk.com/authorize?client_id=8123759&redirect_uri=http://dev.sprinthub.ru/vk_auth&display=page&response_type=token&v=5.59"><img style="width: 40px; height: 40px;" src="https://upload.wikimedia.org/wikipedia/commons/thumb/f/f3/VK_Compact_Logo_%282021-present%29.svg/1200px-VK_Compact_Logo_%282021-present%29.svg.png"></a>
|
||||
<a href="https://oauth.vk.com/authorize?client_id=8123759&redirect_uri=http://192.168.0.146:8000/vk_auth&display=page&response_type=token&v=5.59"><img style="width: 40px; height: 40px;" src="https://upload.wikimedia.org/wikipedia/commons/thumb/f/f3/VK_Compact_Logo_%282021-present%29.svg/1200px-VK_Compact_Logo_%282021-present%29.svg.png"></a>
|
||||
<a href="/telegram_enter"><img style="width: 40px; height: 40px; margin-left: 10px;" src="https://upload.wikimedia.org/wikipedia/commons/thumb/8/82/Telegram_logo.svg/640px-Telegram_logo.svg.png"></a>
|
||||
</center>
|
||||
</div>
|
||||
{% endblock %}
|
107
templates/register.html
Normal file
107
templates/register.html
Normal file
@ -0,0 +1,107 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block title %}Вход{% endblock %}
|
||||
|
||||
{% block scripts %}
|
||||
var data = {
|
||||
'username': false,
|
||||
'name': false,
|
||||
'surname': false,
|
||||
'name': false,
|
||||
'password': false
|
||||
}
|
||||
function checkData() {
|
||||
var result = true;
|
||||
for (const [key, value] of Object.entries(data)) {
|
||||
result = result && value;
|
||||
}
|
||||
const button = document.getElementById('register');
|
||||
button.disabled = !result;
|
||||
}
|
||||
function checkUsername() {
|
||||
const username = document.getElementById('username');
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
url: '/check_new',
|
||||
data: {"username": username.value, "csrfmiddlewaretoken": document.getElementsByName('csrfmiddlewaretoken')[0].value, "action": "check_username"},
|
||||
statusCode: {
|
||||
200: function() {
|
||||
username.style.backgroundColor = '#00FF00AA';
|
||||
data['username'] = true;
|
||||
},
|
||||
400: function() {
|
||||
username.style.backgroundColor = '#FF0000AA';
|
||||
data['username'] = false;
|
||||
}
|
||||
}
|
||||
});
|
||||
checkData();
|
||||
}
|
||||
function simpleCheck(element) {
|
||||
const username = document.getElementById(element);
|
||||
if (username.value !== "") {
|
||||
username.style.backgroundColor = '#00FF00AA';
|
||||
data[element] = true;
|
||||
} else {
|
||||
username.style.backgroundColor = '#FF0000AA';
|
||||
data[element] = false;
|
||||
}
|
||||
checkData();
|
||||
}
|
||||
function checkEmail() {
|
||||
const username = document.getElementById('email');
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
url: '/check_new',
|
||||
data: {"email": username.value, "csrfmiddlewaretoken": document.getElementsByName('csrfmiddlewaretoken')[0].value, "action": "check_email"},
|
||||
statusCode: {
|
||||
200: function() {
|
||||
username.style.backgroundColor = '#00FF00AA';
|
||||
data['email'] = true;
|
||||
},
|
||||
400: function() {
|
||||
username.style.backgroundColor = '#FF0000AA';
|
||||
data['email'] = false;
|
||||
}
|
||||
}
|
||||
});
|
||||
checkData();
|
||||
}
|
||||
function checkPassword() {
|
||||
const password = document.getElementById('password');
|
||||
const repeat = document.getElementById('repeat');
|
||||
if (password.value !== repeat.value) {
|
||||
password.style.backgroundColor = '#FF0000AA';
|
||||
repeat.style.backgroundColor = '#FF0000AA';
|
||||
data['password'] = false;
|
||||
} else {
|
||||
password.style.backgroundColor = '#00FF00AA';
|
||||
repeat.style.backgroundColor = '#00FF00AA';
|
||||
data['password'] = true;
|
||||
}
|
||||
checkData();
|
||||
}
|
||||
{% endblock %}
|
||||
|
||||
{% block body %}
|
||||
<div class="center">
|
||||
<center>
|
||||
<div>
|
||||
<table><tr><td><img style="height: 80px; width: 80px;" src="/static/assets/img/brand/dark.svg" /></td><td><h1>Sprint</h1></td></tr></table>
|
||||
</div>
|
||||
<div>
|
||||
<form method="POST">
|
||||
<p id="message" style="color: red;"></p>
|
||||
{% csrf_token %}
|
||||
<input type="text" class="form" name="username" onchange="checkUsername();" id="username" placeholder="username"><br>
|
||||
<input type="email" class="form" name="email" onchange="checkEmail();" id="email" placeholder="email"><br>
|
||||
<input type="text" class="form" name="surname" onchange="simpleCheck('surname');" id="surname" placeholder="Фамилия"><br>
|
||||
<input type="text" class="form" name="name" onchange="simpleCheck('name');" id="name" placeholder="Имя"><br>
|
||||
<input type="password" class="form" name="password" id="password" onchange="checkPassword();" placeholder="Пароль"><br>
|
||||
<input type="password" class="form" name="repeat" id="repeat" onchange="checkPassword();" placeholder="Повторить пароль"><br>
|
||||
<button type="submit" id="register" disabled class="sub btn btn-dark form">Регистрация</button>
|
||||
</form>
|
||||
</div>
|
||||
</center>
|
||||
</div>
|
||||
{% endblock %}
|
55
templates/set_username.html
Normal file
55
templates/set_username.html
Normal file
@ -0,0 +1,55 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block title %}Вход{% endblock %}
|
||||
|
||||
{% block scripts %}
|
||||
var data = {
|
||||
'username': false,
|
||||
}
|
||||
function checkData() {
|
||||
var result = true;
|
||||
for (const [key, value] of Object.entries(data)) {
|
||||
result = result && value;
|
||||
}
|
||||
const button = document.getElementById('register');
|
||||
button.disabled = !result;
|
||||
}
|
||||
function checkUsername() {
|
||||
const username = document.getElementById('username');
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
url: '/check_new',
|
||||
data: {"username": username.value, "csrfmiddlewaretoken": document.getElementsByName('csrfmiddlewaretoken')[0].value, "action": "check_username"},
|
||||
statusCode: {
|
||||
200: function() {
|
||||
username.style.backgroundColor = '#00FF00AA';
|
||||
data['username'] = true;
|
||||
checkData();
|
||||
},
|
||||
400: function() {
|
||||
username.style.backgroundColor = '#FF0000AA';
|
||||
data['username'] = false;
|
||||
checkData();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
{% endblock %}
|
||||
|
||||
{% block body %}
|
||||
<div class="center">
|
||||
<center>
|
||||
<div>
|
||||
<h1><table><tr><td><i class="fa fa-user"></i></td><td>Sprint</td></tr></table></h1>
|
||||
</div>
|
||||
<div>
|
||||
<form method="POST">
|
||||
<p id="message" style="color: red;"></p>
|
||||
{% csrf_token %}
|
||||
<input type="text" class="form" name="username" onchange="checkUsername();" id="username" placeholder="username"><br>
|
||||
<button type="submit" id="register" disabled class="sub btn btn-dark form">Подтвердить</button>
|
||||
</form>
|
||||
</div>
|
||||
</center>
|
||||
</div>
|
||||
{% endblock %}
|
59
templates/telegram_enter.html
Normal file
59
templates/telegram_enter.html
Normal file
@ -0,0 +1,59 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block title %}Вход{% endblock %}
|
||||
|
||||
{% block scripts %}
|
||||
function send_code() {
|
||||
const p = document.getElementById('message');
|
||||
if (document.getElementById('state').value == 'code') {
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
url: '/send_code',
|
||||
data: {"username": document.getElementById('username').value, "csrfmiddlewaretoken": document.getElementsByName('csrfmiddlewaretoken')[0].value, "action": "create"},
|
||||
success: function(data) {
|
||||
if (data['success']) {
|
||||
document.getElementById('code').hidden = false;
|
||||
document.getElementById('enter').firstChild.data = "Вход";
|
||||
document.getElementById('state').value = "verify";
|
||||
p.innerHTML = '';
|
||||
} else {
|
||||
p.innerHTML = data['message'];
|
||||
}
|
||||
}});
|
||||
} else {
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
url: '/send_code',
|
||||
data: {"username": document.getElementById('username').value, "code": document.getElementById('code').value, "csrfmiddlewaretoken": document.getElementsByName('csrfmiddlewaretoken')[0].value, "action": "check"},
|
||||
success: function(data) {
|
||||
if (data['success']) {
|
||||
window.location.href = '/';
|
||||
} else {
|
||||
p.innerHTML = data['message'];
|
||||
}
|
||||
},
|
||||
});
|
||||
}
|
||||
}
|
||||
{% endblock %}
|
||||
|
||||
{% block body %}
|
||||
<div class="center">
|
||||
<center>
|
||||
<div>
|
||||
<table><tr><td><img style="height: 80px; width: 80px;" src="https://upload.wikimedia.org/wikipedia/commons/thumb/8/82/Telegram_logo.svg/640px-Telegram_logo.svg.png" /></td><td><h1><a style="color: black;" href="/enter">Sprint</a></h1></td></tr></table>
|
||||
</div>
|
||||
<div>
|
||||
<p id="message" style="color: red;"></p>
|
||||
{% csrf_token %}
|
||||
<input type="text" class="form" name="username" id="username" placeholder="username"><br>
|
||||
<input type="password" class="form" name="code" id="code" placeholder="code" hidden><br>
|
||||
<input type="hidden" id="state" value="code">
|
||||
<button type="button" onclick="send_code()" id="enter" class="sub btn btn-dark form">Отправить код</button>
|
||||
</div>
|
||||
<div>
|
||||
<a href="https://t.me/sprint_notifications_bot" target="_blank" class="sub btn btn-dark form">Регистрация</a>
|
||||
</div><br>
|
||||
</center>
|
||||
</div>
|
||||
{% endblock %}
|
Loading…
Reference in New Issue
Block a user