プログラミング初心者です。
現在、WebアプリをPythonのフレームワークFastAPIで作成中です。
ログイン認証機能を作成していますが、DBのハッシュ化して格納しているパスワードとログイン時に入力したパスワードをハッシュ化して、照合し、ユーザー認証を行いたいのですが、パスワードが一致せず、困っております。
以下のように書いております。
from typing import Optional from datetime import datetime, timedelta from fastapi import APIRouter, Depends, HTTPException from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm from jose import jwt from passlib.context import CryptContext from settings.db import session from models.users import Users from schemas.users import UserResponse from schemas.admin import Tokens router = APIRouter() pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") OAuth2_scheme = OAuth2PasswordBearer(tokenUrl="token") def authenticate(name:Optional[str]=None, password:Optional[str]=None): """ユーザーの認証 """ check_password=pwd_context.hash(password) session.commit() user = session.query(Users).filter(Users.name == name).first() if pwd_context.verify(user.password, check_password) == False: raise HTTPException(status_code=401, detail="パスワードが違います。") return user
hashlib.contextの使い方が良くないのでしょうか。
コードに不備があれば、ぜひ教えて頂きたいです。
下記は、エラー内容です。
api | 2021-03-10 06:52:25,539 INFO sqlalchemy.engine.base.Engine COMMIT api | 2021-03-10 06:52:25,717 INFO sqlalchemy.engine.base.Engine BEGIN (implicit) api | 2021-03-10 06:52:25,725 INFO sqlalchemy.engine.base.Engine SELECT `groups`.id AS groups_id, `groups`.created_at AS groups_created_at, `groups`.updated_at AS groups_updated_at, `groups`.name AS groups_name, `groups`.description AS groups_description, `groups`.capacity AS groups_capacity, `groups`.number_of_members AS groups_number_of_members api | FROM `groups`, users_groups api | WHERE %s = users_groups.user_id AND `groups`.id = users_groups.group_id ORDER BY `groups`.id api | 2021-03-10 06:52:25,726 INFO sqlalchemy.engine.base.Engine (11,) api | 2021-03-10 06:52:25,825 INFO sqlalchemy.engine.base.Engine ROLLBACK api | INFO: 172.18.0.1:36596 - "POST /v0/users HTTP/1.1" 200 OK api | 2021-03-10 06:52:56,551 INFO sqlalchemy.engine.base.Engine BEGIN (implicit) api | 2021-03-10 06:52:56,567 INFO sqlalchemy.engine.base.Engine SELECT users.id AS users_id, users.name AS users_name, users.email AS users_email, users.password AS users_password, users.age AS users_age, users.gender AS users_gender, users.height AS users_height, users.weight AS users_weight, users.kind_of_sport AS users_kind_of_sport, users.type_of_team AS users_type_of_team, users.years_of_experience AS users_years_of_experience, users.group_id AS users_group_id, users.last_login AS users_last_login, users.created_at AS users_created_at, users.updated_at AS users_updated_at api | FROM users api | WHERE users.name = %s api | LIMIT %s api | 2021-03-10 06:52:56,568 INFO sqlalchemy.engine.base.Engine ('Taro', 1) api | INFO: 172.18.0.1:36602 - "POST /v0/admin/token HTTP/1.1" 401 Unauthorized
併せて、user.passwordとcheck_passwordの出力した値も記入しておきます。
2021-03-10 13:17:57,278 INFO sqlalchemy.engine.base.Engine ('Taro', 1) api | $2b$12$QI/qWujhn/eHbSnU2CZv0erEW8hPm.ZLshyl1ovkjVVL9Fz/qWru. api | $2b$12$SZg747mCOKtf1b4928Zz1OIBp5uQOZRoiU72KQyTJxWHAyoIk30dm api | INFO: 172.19.0.1:46922 - "POST /v0/admin/token HTTP/1.1" 401 Unauthorized
この場合、ハッシュの仕方に不備があるのでしょうか?
どちらもハッシュ化前のサンプルパスワードは「baseball11」としています。
回答2件
あなたの回答
tips
プレビュー