Skip to content

Commit

Permalink
update
Browse files Browse the repository at this point in the history
Signed-off-by: viste <[email protected]>
  • Loading branch information
Viste committed Aug 20, 2024
1 parent 76696db commit c8ef455
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 11 deletions.
34 changes: 23 additions & 11 deletions core/routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from flask_login import login_user, logout_user, login_required, current_user

from database.models import db, Project, BlogPost, NavigationLink, User, Comment
from tools.auth import authenticate_vk_user, authenticate_user
from tools.auth import authenticate_user
from tools.config import Config
from tools.utils import generate_code_verifier, generate_code_challenge

Expand Down Expand Up @@ -176,37 +176,43 @@ def login_vk():
def authorize_vk():
code = request.args.get('code')
state = request.args.get('state')
device_id = request.args.get('device_id')

if state != session.get('state'):
flash('State mismatch. Authorization failed.', 'danger')
current_app.logger.debug(f"State mismatch during VK callback. Expected {session.get('state')}, got {state}.")
session.clear()
return redirect(url_for('login'))

if not device_id:
flash('Device ID is missing in the callback response.', 'danger')
current_app.logger.debug("Device ID is missing in the callback response.")
return redirect(url_for('login'))

session['device_id'] = device_id
current_app.logger.debug(f"Received device ID: {device_id}")

data = {
'client_id': Config.VK_CLIENT_ID,
'grant_type': 'authorization_code',
'code_verifier': session.get('code_verifier'),
'code': code,
'device_id': device_id, # Передаем device_id в запросе на получение токена
'redirect_uri': url_for('authorize_vk', _external=True),
}

current_app.logger.debug(f"Exchanging VK code for tokens. Data: {data}")
response = requests.post('https://id.vk.com/oauth2/auth', data=data)
tokens = response.json()

if 'access_token' not in tokens or 'device_id' not in tokens:
flash('Failed to retrieve access token or device ID', 'danger')
if 'access_token' not in tokens:
flash('Failed to retrieve access token.', 'danger')
current_app.logger.debug(f"Failed to retrieve tokens from VK. Response: {tokens}")
logout_vk()
session.clear()
return redirect(url_for('login'))

access_token = tokens['access_token']
device_id = tokens['device_id']
session['device_id'] = device_id
session['access_token'] = access_token
current_app.logger.debug(f"Tokens received. Access Token: {access_token}, Device ID: {device_id}")
refresh_token = tokens.get('refresh_token')

user_info_response = requests.post('https://id.vk.com/oauth2/user_info', data={
'access_token': access_token,
Expand All @@ -219,14 +225,20 @@ def authorize_vk():
current_app.logger.debug(f"Failed to retrieve user info. Response: {user_info}")
return redirect(url_for('login'))

user_id = user_info['user']['user_id']
vk_id = user_info['user']['user_id']
first_name = user_info['user']['first_name']
last_name = user_info['user']['last_name']
email = user_info['user']['email']

current_app.logger.debug(f"User info received from VK. User ID: {user_id}, Name: {first_name} {last_name}")
current_user.vk_id = vk_id
current_user.first_name = first_name
current_user.last_name = last_name
current_user.email = email
current_user.device_id = device_id
current_user.access_token = access_token
current_user.refresh_token = refresh_token

authenticate_vk_user(user_id, first_name, last_name, email)
db.session.commit()

flash(f'Successfully logged in as {first_name} {last_name}', 'success')
current_app.logger.debug(f"User {first_name} {last_name} authenticated and logged in.")
Expand Down
3 changes: 3 additions & 0 deletions database/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,9 @@ class User(db.Model, UserMixin):
provider = db.Column(db.String(50), nullable=True)
is_admin = db.Column(db.Boolean)
is_banned = db.Column(db.Boolean)
device_id = db.Column(db.String(150), nullable=True)
access_token = db.Column(db.String(500), nullable=True)
refresh_token = db.Column(db.String(500), nullable=True)

def set_password(self, password):
self.password_hash = generate_password_hash(password)
Expand Down
35 changes: 35 additions & 0 deletions migrations/versions/2e01f58d11e1_v3_migration.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
"""v3 migration
Revision ID: 2e01f58d11e1
Revises: a919c4f3ac69
Create Date: 2024-08-20 18:33:12.848323
"""
import sqlalchemy as sa
from alembic import op

# revision identifiers, used by Alembic.
revision = '2e01f58d11e1'
down_revision = 'a919c4f3ac69'
branch_labels = None
depends_on = None


def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table('user', schema=None) as batch_op:
batch_op.add_column(sa.Column('device_id', sa.String(length=150), nullable=True))
batch_op.add_column(sa.Column('access_token', sa.String(length=500), nullable=True))
batch_op.add_column(sa.Column('refresh_token', sa.String(length=500), nullable=True))

# ### end Alembic commands ###


def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table('user', schema=None) as batch_op:
batch_op.drop_column('refresh_token')
batch_op.drop_column('access_token')
batch_op.drop_column('device_id')

# ### end Alembic commands ###

0 comments on commit c8ef455

Please sign in to comment.