Skip to content

Commit 4e7544e

Browse files
author
Siddhant Agarwal
committed
Add revoke token methods and iat claim while generating tokens
1 parent 3fb49e6 commit 4e7544e

File tree

3 files changed

+120
-3
lines changed

3 files changed

+120
-3
lines changed

stream_chat/async_chat/client.py

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import json
1+
import json, datetime
22
from types import TracebackType
33
from typing import Optional, Type
44
from urllib.parse import urlparse
@@ -448,6 +448,53 @@ async def list_roles(self):
448448
"""
449449
return await self.get("custom_role")
450450

451+
async def revoke_tokens(self, since=datetime.datetime.now()):
452+
"""
453+
Revokes tokens for a application
454+
:param since: date since which the tokens are to be revoked
455+
"""
456+
if isinstance(since, datetime.datetime):
457+
since = since.isoformat()
458+
459+
await self.update_app_settings({
460+
"revoke_tokens_issued_before": since
461+
})
462+
463+
async def revoke_user_token(self, user_id, since=datetime.datetime.now().isoformat()):
464+
"""
465+
Revokes token for a user
466+
:param user_id: user_id of user for which the token needs to be revoked
467+
:param since: date since which the tokens are to be revoked
468+
"""
469+
if isinstance(since, datetime.datetime):
470+
since = since.isoformat()
471+
472+
await self.update_user_partial({
473+
"id": user_id,
474+
"set": {
475+
"revoke_tokens_issued_before": since
476+
}
477+
})
478+
479+
async def revoke_users_token(self, user_ids, since=datetime.datetime.now().isoformat()):
480+
"""
481+
Revokes tokens for given users
482+
:param user_ids: user_ids for user for whom the token needs to be revoked
483+
:param since: date since which the tokens are to be revoked
484+
"""
485+
if isinstance(since, datetime.datetime):
486+
since = since.isoformat()
487+
488+
updates = []
489+
for user_id in user_ids:
490+
updates.append({
491+
"id": user_id,
492+
"set": {
493+
"revoke_tokens_issued_before": since
494+
}
495+
})
496+
await self.update_users_partial(updates)
497+
451498
async def close(self):
452499
await self.session.close()
453500

stream_chat/base/client.py

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,12 @@ def normalize_sort(self, sort=None):
3838
sort_fields.append({"field": k, "direction": v})
3939
return sort_fields
4040

41-
def create_token(self, user_id, exp=None, **claims):
41+
def create_token(self, user_id, exp=None, iat=None, **claims):
4242
payload = {**claims, "user_id": user_id}
4343
if exp is not None:
4444
payload["exp"] = exp
45+
if iat is not None:
46+
payload["iat"] = iat
4547
return jwt.encode(payload, self.api_secret, algorithm="HS256")
4648

4749
def verify_webhook(self, request_body, x_signature):
@@ -413,3 +415,24 @@ def list_roles(self):
413415
List custom roles of the app
414416
"""
415417
pass
418+
419+
@abc.abstractmethod
420+
def revoke_tokens(self, since):
421+
"""
422+
Revoke tokens for a application issued since
423+
"""
424+
pass
425+
426+
@abc.abstractmethod
427+
def revoke_user_token(self, user_id, since):
428+
"""
429+
Revoke tokens for a user issued since
430+
"""
431+
pass
432+
433+
@abc.abstractmethod
434+
def revoke_users_token(self, user_ids, since):
435+
"""
436+
Revoke tokens for users issued since
437+
"""
438+
pass

stream_chat/client.py

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from urllib.parse import urlparse
33
from urllib.request import Request, urlopen
44

5-
import requests
5+
import requests, datetime
66

77
from stream_chat.__pkg__ import __version__
88
from stream_chat.base.client import StreamChatInterface
@@ -435,3 +435,50 @@ def list_roles(self):
435435
List custom roles of the app
436436
"""
437437
return self.get("custom_role")
438+
439+
def revoke_tokens(self, since=datetime.datetime.now()):
440+
"""
441+
Revokes tokens for a application
442+
:param since: date since which the tokens are to be revoked
443+
"""
444+
if isinstance(since, datetime.datetime):
445+
since = since.isoformat()
446+
447+
self.update_app_settings({
448+
"revoke_tokens_issued_before": since
449+
})
450+
451+
def revoke_user_token(self, user_id, since=datetime.datetime.now()):
452+
"""
453+
Revokes token for a user
454+
:param user_id: user_id of user for which the token needs to be revoked
455+
:param since: date since which the tokens are to be revoked
456+
"""
457+
if isinstance(since, datetime.datetime):
458+
since = since.isoformat()
459+
460+
self.update_user_partial({
461+
"id": user_id,
462+
"set": {
463+
"revoke_tokens_issued_before": since
464+
}
465+
})
466+
467+
def revoke_users_token(self, user_ids, since=datetime.datetime.now()):
468+
"""
469+
Revokes tokens for given users
470+
:param user_ids: user_ids for user for whom the token needs to be revoked
471+
:param since: date since which the tokens are to be revoked
472+
"""
473+
if isinstance(since, datetime.datetime):
474+
since = since.isoformat()
475+
476+
updates = []
477+
for user_id in user_ids:
478+
updates.append({
479+
"id": user_id,
480+
"set": {
481+
"revoke_tokens_issued_before": since
482+
}
483+
})
484+
self.update_users_partial(updates)

0 commit comments

Comments
 (0)