Преглед на файлове

Better session api spec : POST instead of GET, Json body instead of query params for login

Guénaël Muller преди 6 години
родител
ревизия
2420e62485
променени са 2 файла, в които са добавени 23 реда и са изтрити 16 реда
  1. 6 5
      tracim/tests/functional/test_session.py
  2. 17 11
      tracim/views/core_api/session_controller.py

+ 6 - 5
tracim/tests/functional/test_session.py Целия файл

7
 class TestLogoutEndpoint(FunctionalTest):
7
 class TestLogoutEndpoint(FunctionalTest):
8
 
8
 
9
     def test_logout(self):
9
     def test_logout(self):
10
+        res = self.testapp.post_json('/api/v2/sessions/logout', status=204)
10
         res = self.testapp.get('/api/v2/sessions/logout', status=204)
11
         res = self.testapp.get('/api/v2/sessions/logout', status=204)
11
 
12
 
12
 
13
 
17
             'email': 'admin@admin.admin',
18
             'email': 'admin@admin.admin',
18
             'password': 'admin@admin.admin',
19
             'password': 'admin@admin.admin',
19
         }
20
         }
20
-        res = self.testapp.get(
21
+        res = self.testapp.post_json(
21
             '/api/v2/sessions/login',
22
             '/api/v2/sessions/login',
23
+            params=params,
22
             status=204,
24
             status=204,
23
-            params=params
24
         )
25
         )
25
 
26
 
26
     def test_bad_password(self):
27
     def test_bad_password(self):
28
             'email': 'admin@admin.admin',
29
             'email': 'admin@admin.admin',
29
             'password': 'bad_password',
30
             'password': 'bad_password',
30
         }
31
         }
31
-        res = self.testapp.get(
32
+        res = self.testapp.post_json(
32
             '/api/v2/sessions/login',
33
             '/api/v2/sessions/login',
33
             status=400,
34
             status=400,
34
             params=params,
35
             params=params,
39
             'email': 'unknown_user@unknown.unknown',
40
             'email': 'unknown_user@unknown.unknown',
40
             'password': 'bad_password',
41
             'password': 'bad_password',
41
         }
42
         }
42
-        res = self.testapp.get(
43
+        res = self.testapp.post_json(
43
             '/api/v2/sessions/login',
44
             '/api/v2/sessions/login',
44
             status=400,
45
             status=400,
45
             params=params,
46
             params=params,
46
         )
47
         )
47
 
48
 
48
     def test_uncomplete(self):
49
     def test_uncomplete(self):
49
-        res = self.testapp.get('/api/v2/sessions/login', status=400)
50
+        res = self.testapp.post_json('/api/v2/sessions/login', status=400)
50
 
51
 
51
 
52
 
52
 class TestWhoamiEndpoint(FunctionalTest):
53
 class TestWhoamiEndpoint(FunctionalTest):

+ 17 - 11
tracim/views/core_api/session_controller.py Целия файл

29
 
29
 
30
     @hapic.with_api_doc()
30
     @hapic.with_api_doc()
31
     @hapic.input_headers(LoginOutputHeaders())
31
     @hapic.input_headers(LoginOutputHeaders())
32
-    @hapic.input_query(BasicAuthSchema())
32
+    @hapic.input_body(BasicAuthSchema())
33
     @hapic.handle_exception(LoginFailed, http_code=HTTPStatus.BAD_REQUEST)
33
     @hapic.handle_exception(LoginFailed, http_code=HTTPStatus.BAD_REQUEST)
34
     # TODO - G.M - 17-04-2018 - fix output header ?
34
     # TODO - G.M - 17-04-2018 - fix output header ?
35
     # @hapic.output_headers()
35
     # @hapic.output_headers()
41
         """
41
         """
42
         Logs user into the system
42
         Logs user into the system
43
         """
43
         """
44
-        email = request.params['email']
45
-        password = request.params['password']
46
-        if not (email and password):
47
-            raise Exception
44
+        email = request.json_body['email']
45
+        password = request.json_body['password']
48
         app_config = request.registry.settings['CFG']
46
         app_config = request.registry.settings['CFG']
49
         try:
47
         try:
50
             uapi = UserApi(
48
             uapi = UserApi(
99
         configurator.add_route(
97
         configurator.add_route(
100
             'login',
98
             'login',
101
             os.path.join(BASE_API_V2, 'sessions', 'login'),
99
             os.path.join(BASE_API_V2, 'sessions', 'login'),
102
-            request_method='GET'
100
+            request_method='POST',
103
         )
101
         )
104
         configurator.add_view(
102
         configurator.add_view(
105
             self.login,
103
             self.login,
107
         )
105
         )
108
         # Logout
106
         # Logout
109
         configurator.add_route(
107
         configurator.add_route(
110
-            'logout',
108
+            'post_logout',
111
             os.path.join(BASE_API_V2, 'sessions', 'logout'),
109
             os.path.join(BASE_API_V2, 'sessions', 'logout'),
112
-            request_method='GET'
110
+            request_method='POST',
111
+        )
112
+        configurator.add_route(
113
+            'get_logout',
114
+            os.path.join(BASE_API_V2, 'sessions', 'logout'),
115
+            request_method='GET',
116
+        )
117
+        configurator.add_view(
118
+            self.logout,
119
+            route_name='get_logout',
113
         )
120
         )
114
-
115
         configurator.add_view(
121
         configurator.add_view(
116
             self.logout,
122
             self.logout,
117
-            route_name='logout',
123
+            route_name='post_logout',
118
         )
124
         )
119
         # Whoami
125
         # Whoami
120
         configurator.add_route(
126
         configurator.add_route(
121
             'whoami',
127
             'whoami',
122
             os.path.join(BASE_API_V2, 'sessions', 'whoami'),
128
             os.path.join(BASE_API_V2, 'sessions', 'whoami'),
123
-            request_method='GET'
129
+            request_method='GET',
124
         )
130
         )
125
         configurator.add_view(
131
         configurator.add_view(
126
             self.whoami,
132
             self.whoami,