11from __future__ import annotations
22
3+ import os
34from typing import Optional
45
56from typing_extensions import TypedDict
89from .integrations import Integrations
910from .sessions import Sessions
1011
12+ GRANT_TYPE = "urn:ietf:params:oauth:grant-type:token-exchange"
13+ USER_SESSION_TOKEN_TYPE = "urn:posit:connect:user-session-token"
14+ CONTENT_SESSION_TOKEN_TYPE = "urn:posit:connect:content-session-token"
15+
16+ def _get_content_session_token () -> str :
17+ """Return the content session token.
18+
19+ Reads the environment variable 'CONNECT_CONTENT_SESSION_TOKEN'.
20+
21+ Raises
22+ ------
23+ ValueError: If CONNECT_CONTENT_SESSION_TOKEN is not set or invalid
24+
25+ Returns
26+ -------
27+ str
28+ """
29+ value = os .environ .get ("CONNECT_CONTENT_SESSION_TOKEN" )
30+ if not value :
31+ raise ValueError ("Invalid value for 'CONNECT_CONTENT_SESSION_TOKEN': Must be a non-empty string." )
32+ return value
1133
1234class OAuth (Resources ):
1335 def __init__ (self , params : ResourceParameters , api_key : str ) -> None :
@@ -27,14 +49,25 @@ def get_credentials(self, user_session_token: Optional[str] = None) -> Credentia
2749
2850 # craft a credential exchange request
2951 data = {}
30- data ["grant_type" ] = "urn:ietf:params:oauth:grant-type:token-exchange"
31- data ["subject_token_type" ] = "urn:posit:connect:user-session-token"
52+ data ["grant_type" ] = GRANT_TYPE
53+ data ["subject_token_type" ] = USER_SESSION_TOKEN_TYPE
3254 if user_session_token :
3355 data ["subject_token" ] = user_session_token
3456
3557 response = self .params .session .post (url , data = data )
3658 return Credentials (** response .json ())
3759
60+ def get_content_credentials (self , content_session_token : Optional [str ] = None ) -> Credentials :
61+ url = self .params .url + "v1/oauth/integrations/credentials"
62+
63+ # craft a credential exchange request
64+ data = {}
65+ data ["grant_type" ] = GRANT_TYPE
66+ data ["subject_token_type" ] = CONTENT_SESSION_TOKEN_TYPE
67+ data ["subject_token" ] = content_session_token or _get_content_session_token ()
68+
69+ response = self .params .session .post (url , data = data )
70+ return Credentials (** response .json ())
3871
3972class Credentials (TypedDict , total = False ):
4073 access_token : str
0 commit comments