mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-01 07:01:12 +00:00
[api2] Support username login
This commit is contained in:
@@ -1,11 +1,9 @@
|
|||||||
import re
|
|
||||||
|
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
|
||||||
from seahub.auth import authenticate
|
from seahub.auth import authenticate
|
||||||
from seahub.api2.models import Token, TokenV2, DESKTOP_PLATFORMS
|
from seahub.api2.models import Token, TokenV2, DESKTOP_PLATFORMS
|
||||||
from seahub.api2.utils import get_token_v1, get_token_v2
|
from seahub.api2.utils import get_token_v1, get_token_v2
|
||||||
from seahub.utils import is_valid_username
|
from seahub.profile.models import Profile
|
||||||
|
|
||||||
def all_none(values):
|
def all_none(values):
|
||||||
for value in values:
|
for value in values:
|
||||||
@@ -35,7 +33,7 @@ class AuthTokenSerializer(serializers.Serializer):
|
|||||||
platform_version = serializers.CharField(required=False)
|
platform_version = serializers.CharField(required=False)
|
||||||
|
|
||||||
def validate(self, attrs):
|
def validate(self, attrs):
|
||||||
username = attrs.get('username')
|
login_id = attrs.get('username')
|
||||||
password = attrs.get('password')
|
password = attrs.get('password')
|
||||||
|
|
||||||
platform = attrs.get('platform', None)
|
platform = attrs.get('platform', None)
|
||||||
@@ -54,10 +52,9 @@ class AuthTokenSerializer(serializers.Serializer):
|
|||||||
else:
|
else:
|
||||||
raise serializers.ValidationError('invalid params')
|
raise serializers.ValidationError('invalid params')
|
||||||
|
|
||||||
# first check username and password
|
username = Profile.objects.get_username_by_login_id(login_id)
|
||||||
if username:
|
if username is None:
|
||||||
if not is_valid_username(username):
|
username = login_id
|
||||||
raise serializers.ValidationError('username is not valid.')
|
|
||||||
|
|
||||||
if username and password:
|
if username and password:
|
||||||
user = authenticate(username=username, password=password)
|
user = authenticate(username=username, password=password)
|
||||||
|
@@ -47,6 +47,9 @@ class ProfileManager(models.Manager):
|
|||||||
def get_username_by_login_id(self, login_id):
|
def get_username_by_login_id(self, login_id):
|
||||||
"""Convert a user's login id to username(login email).
|
"""Convert a user's login id to username(login email).
|
||||||
"""
|
"""
|
||||||
|
if not login_id:
|
||||||
|
return None
|
||||||
|
|
||||||
try:
|
try:
|
||||||
return super(ProfileManager, self).get(login_id=login_id).user
|
return super(ProfileManager, self).get(login_id=login_id).user
|
||||||
except Profile.DoesNotExist:
|
except Profile.DoesNotExist:
|
||||||
|
54
tests/api/test_obtain_auth_token.py
Normal file
54
tests/api/test_obtain_auth_token.py
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
import json
|
||||||
|
|
||||||
|
from seahub.profile.models import Profile
|
||||||
|
from seahub.test_utils import BaseTestCase
|
||||||
|
from .urls import TOKEN_URL
|
||||||
|
|
||||||
|
class ObtainAuthTokenTest(BaseTestCase):
|
||||||
|
def setUp(self):
|
||||||
|
self.p = Profile.objects.add_or_update(self.user.username, '', '')
|
||||||
|
self.p.login_id = 'test_login_id'
|
||||||
|
self.p.save()
|
||||||
|
|
||||||
|
def test_correct_email_passwd(self):
|
||||||
|
resp = self.client.post(TOKEN_URL, {
|
||||||
|
'username': self.user.username,
|
||||||
|
'password': self.user_password,
|
||||||
|
})
|
||||||
|
|
||||||
|
json_resp = json.loads(resp.content)
|
||||||
|
assert json_resp['token'] is not None
|
||||||
|
assert len(json_resp['token']) == 40
|
||||||
|
|
||||||
|
def test_correct_loginID_password(self):
|
||||||
|
|
||||||
|
resp = self.client.post(TOKEN_URL, {
|
||||||
|
'username': self.p.login_id,
|
||||||
|
'password': self.user_password,
|
||||||
|
})
|
||||||
|
|
||||||
|
json_resp = json.loads(resp.content)
|
||||||
|
assert json_resp['token'] is not None
|
||||||
|
assert len(json_resp['token']) == 40
|
||||||
|
|
||||||
|
def test_invalid_password(self):
|
||||||
|
resp = self.client.post(TOKEN_URL, {
|
||||||
|
'username': self.user.username,
|
||||||
|
'password': 'random_password',
|
||||||
|
})
|
||||||
|
self.assertEqual(400, resp.status_code)
|
||||||
|
json_resp = json.loads(resp.content)
|
||||||
|
assert json_resp['non_field_errors'] == ['Unable to login with provided credentials.']
|
||||||
|
|
||||||
|
def test_empty_login_id(self):
|
||||||
|
self.p.login_id = ""
|
||||||
|
self.p.save()
|
||||||
|
|
||||||
|
resp = self.client.post(TOKEN_URL, {
|
||||||
|
'username': self.p.login_id,
|
||||||
|
'password': self.user_password,
|
||||||
|
})
|
||||||
|
|
||||||
|
self.assertEqual(400, resp.status_code)
|
||||||
|
json_resp = json.loads(resp.content)
|
||||||
|
assert json_resp['non_field_errors'] == ['Must include "username" and "password"']
|
Reference in New Issue
Block a user