confirm and auth email

This commit is contained in:
knst-kotov 2021-08-26 12:24:46 +03:00
parent 6bdf994a28
commit 730129718b
3 changed files with 22 additions and 7 deletions

View File

@ -67,6 +67,9 @@ class JWTAuthenticate(AuthenticationBackend):
if payload is None: if payload is None:
return AuthCredentials(scopes=[]), AuthUser(user_id=None) return AuthCredentials(scopes=[]), AuthUser(user_id=None)
if not payload.device in ("pc", "mobile"):
return AuthCredentials(scopes=[]), AuthUser(user_id=None)
scopes = User.get_permission(user_id=payload.user_id) scopes = User.get_permission(user_id=payload.user_id)
return AuthCredentials(user_id=payload.user_id, scopes=scopes, logged_in=True), AuthUser(user_id=payload.user_id) return AuthCredentials(user_id=payload.user_id, scopes=scopes, logged_in=True), AuthUser(user_id=payload.user_id)
@ -89,8 +92,11 @@ class EmailAuthenticate:
raise InvalidToken("invalid token") raise InvalidToken("invalid token")
with local_session() as session: with local_session() as session:
user = session.query(User).filter_by(id=payload.user_id).first() user = session.query(User).filter_by(id=payload.user_id).first()
if not user: if not user:
raise Exception("user not exist") raise Exception("user not exist")
if not user.emailConfirmed:
user.emailConfirmed = True
session.commit()
auth_token = await Authorize.authorize(user) auth_token = await Authorize.authorize(user)
return (auth_token, user) return (auth_token, user)

View File

@ -11,11 +11,20 @@ MAILGUN_FROM = "postmaster <postmaster@%s>" % (MAILGUN_DOMAIN)
AUTH_URL = "%s/email_authorize" % (BACKEND_URL) AUTH_URL = "%s/email_authorize" % (BACKEND_URL)
async def send_confirm_email(user):
text = "<html><body>To confirm registration follow the <a href='%s'>link</link></body></html>"
await send_email(user, text)
async def send_auth_email(user): async def send_auth_email(user):
text = "<html><body>To enter the site follow the <a href='%s'>link</link></body></html>"
await send_email(user, text)
async def send_email(user, text):
token = await EmailAuthenticate.get_email_token(user) token = await EmailAuthenticate.get_email_token(user)
to = "%s <%s>" % (user.username, user.email) to = "%s <%s>" % (user.username, user.email)
text = "%s?token=%s" % (AUTH_URL, token) auth_url_with_token = "%s?token=%s" % (AUTH_URL, token)
text = text % (auth_url_with_token)
response = requests.post( response = requests.post(
MAILGUN_API_URL, MAILGUN_API_URL,
auth = ("api", MAILGUN_API_KEY), auth = ("api", MAILGUN_API_KEY),
@ -23,7 +32,7 @@ async def send_auth_email(user):
"from": MAILGUN_FROM, "from": MAILGUN_FROM,
"to": to, "to": to,
"subject": "authorize log in", "subject": "authorize log in",
"text": text "html": text
} }
) )
response.raise_for_status() response.raise_for_status()

View File

@ -5,7 +5,7 @@ from auth.authorize import Authorize
from auth.identity import Identity from auth.identity import Identity
from auth.password import Password from auth.password import Password
from auth.validations import CreateUser from auth.validations import CreateUser
from auth.email import send_auth_email from auth.email import send_confirm_email, send_auth_email
from orm import User from orm import User
from orm.base import local_session from orm.base import local_session
from resolvers.base import mutation, query from resolvers.base import mutation, query
@ -31,7 +31,7 @@ async def register(*_, email: str, password: str = ""):
create_user.username = email.split('@')[0] create_user.username = email.split('@')[0]
if not password: if not password:
user = User.create(**create_user.dict()) user = User.create(**create_user.dict())
await send_auth_email(user) await send_confirm_email(user)
return { "user": user } return { "user": user }
else: else:
create_user.password = Password.encode(create_user.password) create_user.password = Password.encode(create_user.password)
@ -49,7 +49,7 @@ async def login(_, info: GraphQLResolveInfo, email: str, password: str = ""):
if not password: if not password:
await send_auth_email(orm_user) await send_auth_email(orm_user)
return {"error" : ""} return {}
try: try:
device = info.context["request"].headers['device'] device = info.context["request"].headers['device']