Skip to content

Commit

Permalink
Token support (#504)
Browse files Browse the repository at this point in the history
Added API support to generate authentication tokens, at `/api/projects/:id/token`
  • Loading branch information
JoseAntonioTorre authored and almet committed Oct 25, 2019
1 parent e30d863 commit b683d06
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 0 deletions.
12 changes: 12 additions & 0 deletions ihatemoney/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -186,8 +186,20 @@ def delete(self, project, bill_id):
return "OK", 200


class TokenHandler(Resource):
method_decorators = [need_auth]

def get(self, project):
if not project:
return "Not Found", 404

token = project.generate_token()
return {"token": token}, 200


restful_api.add_resource(ProjectsHandler, "/projects")
restful_api.add_resource(ProjectHandler, "/projects/<string:project_id>")
restful_api.add_resource(TokenHandler, "/projects/<string:project_id>/token")
restful_api.add_resource(MembersHandler, "/projects/<string:project_id>/members")
restful_api.add_resource(
ProjectStatsHandler, "/projects/<string:project_id>/statistics"
Expand Down
36 changes: 36 additions & 0 deletions ihatemoney/tests/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -1357,6 +1357,42 @@ def test_project(self):
)
self.assertEqual(401, resp.status_code)

def test_token_creation(self):
"""Test that token of project is generated
"""

# Create project
resp = self.api_create("raclette")
self.assertTrue(201, resp.status_code)

# Get token
resp = self.client.get(
"/api/projects/raclette/token", headers=self.get_auth("raclette")
)

self.assertEqual(200, resp.status_code)

decoded_resp = json.loads(resp.data.decode("utf-8"))

# Access with token
resp = self.client.get(
"/api/projects/raclette/token",
headers={"Authorization": "Basic %s" % decoded_resp["token"]},
)

self.assertEqual(200, resp.status_code)

def test_token_login(self):
resp = self.api_create("raclette")
# Get token
resp = self.client.get(
"/api/projects/raclette/token", headers=self.get_auth("raclette")
)
decoded_resp = json.loads(resp.data.decode("utf-8"))
resp = self.client.get("/authenticate?token={}".format(decoded_resp["token"]))
# Test that we are redirected.
self.assertEqual(302, resp.status_code)

def test_member(self):
# create a project
self.api_create("raclette")
Expand Down

0 comments on commit b683d06

Please sign in to comment.