Skip to content

Commit dfcacbe

Browse files
author
Siddhant Agarwal
authored
Merge pull request #61 from GetStream/CHAT-1650
[CHAT-1650] Add revoke token methods and iat claim while generating tokens
2 parents 3fb49e6 + 4fc0728 commit dfcacbe

File tree

3 files changed

+94
-1
lines changed

3 files changed

+94
-1
lines changed

stream_chat/async_chat/client.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import json
2+
import datetime
23
from types import TracebackType
34
from typing import Optional, Type
45
from urllib.parse import urlparse
@@ -448,6 +449,40 @@ async def list_roles(self):
448449
"""
449450
return await self.get("custom_role")
450451

452+
async def revoke_tokens(self, before):
453+
"""
454+
Revokes tokens for an application
455+
:param before: date before which the tokens are to be revoked, pass None to reset
456+
"""
457+
if isinstance(before, datetime.datetime):
458+
before = before.isoformat()
459+
460+
await self.update_app_settings({"revoke_tokens_issued_before": before})
461+
462+
async def revoke_user_token(self, user_id, before):
463+
"""
464+
Revokes token for a user
465+
:param user_id: user_id of user for which the token needs to be revoked
466+
:param before: date before which the tokens are to be revoked, , pass None to reset
467+
"""
468+
await self.revoke_users_token([user_id], before)
469+
470+
async def revoke_users_token(self, user_ids, before):
471+
"""
472+
Revokes tokens for given users
473+
:param user_ids: user_ids for user for whom the token needs to be revoked
474+
:param before: date before which the tokens are to be revoked, pass None to reset
475+
"""
476+
if isinstance(before, datetime.datetime):
477+
before = before.isoformat()
478+
479+
updates = []
480+
for user_id in user_ids:
481+
updates.append(
482+
{"id": user_id, "set": {"revoke_tokens_issued_before": before}}
483+
)
484+
await self.update_users_partial(updates)
485+
451486
async def close(self):
452487
await self.session.close()
453488

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 an 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: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from urllib.request import Request, urlopen
44

55
import requests
6+
import datetime
67

78
from stream_chat.__pkg__ import __version__
89
from stream_chat.base.client import StreamChatInterface
@@ -435,3 +436,37 @@ def list_roles(self):
435436
List custom roles of the app
436437
"""
437438
return self.get("custom_role")
439+
440+
def revoke_tokens(self, before):
441+
"""
442+
Revokes tokens for an application
443+
:param before: date before which the tokens are to be revoked, to reset pass None
444+
"""
445+
if isinstance(before, datetime.datetime):
446+
before = before.isoformat()
447+
448+
self.update_app_settings({"revoke_tokens_issued_before": before})
449+
450+
def revoke_user_token(self, user_id, before):
451+
"""
452+
Revokes token for a user
453+
:param user_id: user_id of user for which the token needs to be revoked
454+
:param before: date before which the tokens are to be revoked, to reset pass None
455+
"""
456+
self.revoke_users_token([user_id], before)
457+
458+
def revoke_users_token(self, user_ids, before):
459+
"""
460+
Revokes tokens for given users
461+
:param user_ids: user_ids for user for whom the token needs to be revoked
462+
:param before: date before which the tokens are to be revoked, to reset pass None
463+
"""
464+
if isinstance(before, datetime.datetime):
465+
before = before.isoformat()
466+
467+
updates = []
468+
for user_id in user_ids:
469+
updates.append(
470+
{"id": user_id, "set": {"revoke_tokens_issued_before": before}}
471+
)
472+
self.update_users_partial(updates)

0 commit comments

Comments
 (0)