Skip to content

Commit

Permalink
Docs update and examples
Browse files Browse the repository at this point in the history
  • Loading branch information
AsabuHere committed Dec 12, 2024
1 parent 6e78c78 commit 677da6c
Show file tree
Hide file tree
Showing 5 changed files with 144 additions and 0 deletions.
7 changes: 7 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,13 @@ After a brief delay, you will receive the text message on your phone.
> **Warning**
> It's okay to hardcode your credentials when testing locally, but you should use environment variables to keep them secret before committing any code or deploying to production. Check out [How to Set Environment Variables](https://www.twilio.com/blog/2017/01/how-to-set-environment-variables.html) for more information.
## OAuth Feature for Twilio APIs
We are introducing Client Credentials Flow-based OAuth 2.0 authentication. This feature is currently in beta and its implementation is subject to change.

API examples [here](https://github.com/twilio/twilio-python/blob/main/examples/public_oauth.py)

Organisation API examples [here](https://github.com/twilio/twilio-python/blob/main/examples/organization_api.py)

## Use the helper library

### API Credentials
Expand Down
31 changes: 31 additions & 0 deletions examples/organization_api.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import os

from twilio.rest import Client
from twilio.credential.orgs_credential_provider import OrgsCredentialProvider

ACCOUNT_SID = os.environ.get("TWILIO_ACCOUNT_SID")
API_KEY = os.environ.get("TWILIO_API_KEY")
API_SECRET = os.environ.get("TWILIO_API_SECRET")

CLIENT_ID = os.environ.get("TWILIO_CLIENT_ID")
CLIENT_SECRET = os.environ.get("CLIENT_SECRET")
ORGS_SID = os.environ.get("ORGS_SID")


def example():
"""
Some example usage of using organization resources
"""
self.client = Client(
username=API_KEY,
password=API_SECRET,
account_sid=ACCOUNT_SID,
credential_provider= OrgsCredentialProvider(CLIENT_ID,CLIENT_SECRET)
)

accounts = self.client.preview_iam.organization(organization_sid="OR64adedc0f4dc99b9113305f725677b47").accounts.stream()
self.assertIsNotNone(accounts)


if __name__ == "__main__":
example()
37 changes: 37 additions & 0 deletions examples/public_oauth.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import os

from twilio.rest import Client
from twilio.credential.client_credential_provider import ClientCredentialProvider

ACCOUNT_SID = os.environ.get("TWILIO_ACCOUNT_SID")
API_KEY = os.environ.get("TWILIO_API_KEY")
API_SECRET = os.environ.get("TWILIO_API_SECRET")
FROM_NUMBER = os.environ.get("TWILIO_FROM_NUMBER")
TO_NUMBER = os.environ.get("TWILIO_TO_NUMBER")

CLIENT_ID = os.environ.get("TWILIO_CLIENT_ID")
CLIENT_SECRET = os.environ.get("CLIENT_SECRET")


def example():
"""
Some example usage of message resources.
"""
self.client = Client(
username=API_KEY,
password=API_SECRET,
account_sid=ACCOUNT_SID,
credential_provider= ClientCredentialProvider(CLIENT_ID,CLIENT_SECRET)
)

msg = self.client.messages.create(
to=self.to_number, from_=self.from_number, body="hello world"
)
self.assertEqual(msg.to, self.to_number)
self.assertEqual(msg.from_, self.from_number)
self.assertEqual(msg.body, "hello world")
self.assertIsNotNone(msg.sid)


if __name__ == "__main__":
example()
28 changes: 28 additions & 0 deletions twilio/credential/client_credential_provider.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
from twilio.http.client_token_manager import ClientTokenManager
from twilio.base.exceptions import TwilioException
from twilio.credential.credential_provider import CredentialProvider
from twilio.auth_strategy.auth_type import AuthType
from twilio.auth_strategy.token_auth_strategy import TokenAuthStrategy


class ClientCredentialProvider(CredentialProvider):
def __init__(self, client_id: str, client_secret: str, token_manager=None):
super().__init__(AuthType.CLIENT_CREDENTIALS)

if client_id is None or client_secret is None:
raise TwilioException("Client id and Client secret are mandatory")

self.grant_type = "client_credentials"
self.client_id = client_id
self.client_secret = client_secret
self.token_manager = token_manager
self.auth_strategy = None

def to_auth_strategy(self):
if self.token_manager is None:
self.token_manager = ClientTokenManager(
self.grant_type, self.client_id, self.client_secret
)
if self.auth_strategy is None:
self.auth_strategy = TokenAuthStrategy(self.token_manager)
return self.auth_strategy
41 changes: 41 additions & 0 deletions twilio/http/client_token_manager.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
from twilio.http.token_manager import TokenManager
from twilio.rest import Client


class ClientTokenManager(TokenManager):
"""
Client Token Manager
"""

def __init__(
self,
grant_type: str,
client_id: str,
client_secret: str,
code: str = None,
redirect_uri: str = None,
audience: str = None,
refreshToken: str = None,
scope: str = None,
):
self.grant_type = grant_type
self.client_id = client_id
self.client_secret = client_secret
self.code = code
self.redirect_uri = redirect_uri
self.audience = audience
self.refreshToken = refreshToken
self.scope = scope
self.client = Client()

def fetch_access_token(self):
token_instance = self.client.preview_iam.v1.token.create(
grant_type=self.grant_type,
client_id=self.client_id,
client_secret=self.client_secret,
code=self.code,
redirect_uri=self.redirect_uri,
audience=self.audience,
scope=self.scope,
)
return token_instance.access_token

0 comments on commit 677da6c

Please sign in to comment.