99import apps .logging .request_logger as bb2logging
1010
1111logger = logging .getLogger (bb2logging .HHS_SERVER_LOGNAME_FMT .format (__name__ ))
12+ SCOPES_SUPPORTED = ["profile" , "patient/Patient.read" , "patient/ExplanationOfBenefit.read" , "patient/Coverage.read" ]
13+ CODE_CHALLENGE_METHODS_SUPPORTED = ["S256" ]
14+ CAPABILITIES = [
15+ "client-confidential-symmetric" ,
16+ "sso-openid-connect" ,
17+ "launch-standalone" ,
18+ "permission-offline" ,
19+ "permission-patient" ,
20+ "permission-v1" ,
21+ "authorize-post"
22+ ]
1223
1324
1425@require_GET
@@ -18,8 +29,18 @@ def openid_configuration(request):
1829 """
1930 data = OrderedDict ()
2031 issuer = base_issuer (request )
21- v2 = request .path .endswith ('openid-configuration-v2' ) or request .path .endswith ('openidConfigV2' )
22- data = build_endpoint_info (data , issuer = issuer , v2 = v2 )
32+ data = build_endpoint_info (data , issuer = issuer )
33+ return JsonResponse (data )
34+
35+
36+ @require_GET
37+ def smart_configuration (request ):
38+ """
39+ Views that returns smart_configuration.
40+ """
41+ data = OrderedDict ()
42+ issuer = base_issuer (request )
43+ data = build_smart_config_endpoint (data , issuer = issuer )
2344 return JsonResponse (data )
2445
2546
@@ -50,7 +71,7 @@ def base_issuer(request):
5071 return issuer
5172
5273
53- def build_endpoint_info (data = OrderedDict (), v2 = False , issuer = "" ):
74+ def build_endpoint_info (data = OrderedDict (), issuer = "" ):
5475 """
5576 construct the data package
5677 issuer should be http: or https:// prefixed url.
@@ -60,12 +81,12 @@ def build_endpoint_info(data=OrderedDict(), v2=False, issuer=""):
6081 """
6182 data ["issuer" ] = issuer
6283 data ["authorization_endpoint" ] = issuer + \
63- reverse ('oauth2_provider:authorize' if not v2 else ' oauth2_provider_v2:authorize-v2' )
64- data ["revocation_endpoint" ] = issuer + reverse ('oauth2_provider :revoke' )
84+ reverse ('oauth2_provider_v2:authorize-v2' )
85+ data ["revocation_endpoint" ] = issuer + reverse ('oauth2_provider_v2 :revoke-token-v2 ' )
6586 data ["token_endpoint" ] = issuer + \
66- reverse ('oauth2_provider:token' if not v2 else ' oauth2_provider_v2:token-v2' )
87+ reverse ('oauth2_provider_v2:token-v2' )
6788 data ["userinfo_endpoint" ] = issuer + \
68- reverse ('openid_connect_userinfo' if not v2 else ' openid_connect_userinfo_v2' )
89+ reverse ('openid_connect_userinfo_v2' )
6990 data ["ui_locales_supported" ] = ["en-US" , ]
7091 data ["service_documentation" ] = getattr (settings ,
7192 'DEVELOPER_DOCS_URI' ,
@@ -82,5 +103,29 @@ def build_endpoint_info(data=OrderedDict(), v2=False, issuer=""):
82103
83104 data ["response_types_supported" ] = ["code" , "token" ]
84105 data ["fhir_metadata_uri" ] = issuer + \
85- reverse ('fhir_conformance_metadata' if not v2 else 'fhir_conformance_metadata_v2' )
106+ reverse ('fhir_conformance_metadata_v2' )
107+ return data
108+
109+
110+ def build_smart_config_endpoint (data = OrderedDict (), issuer = "" ):
111+ """
112+ construct the smart config endpoint response. Takes in output of build_endpoint_info since they share many fields
113+ issuer should be http: or https:// prefixed url.
114+
115+ :param data:
116+ :return:
117+ """
118+
119+ data = build_endpoint_info (data , issuer = issuer )
120+ del (data ["userinfo_endpoint" ])
121+ del (data ["ui_locales_supported" ])
122+ del (data ["service_documentation" ])
123+ del (data ["op_tos_uri" ])
124+ del (data ["fhir_metadata_uri" ])
125+ data ["grant_types_supported" ].remove ("refresh_token" )
126+
127+ data ["scopes_supported" ] = SCOPES_SUPPORTED
128+ data ["code_challenge_methods_supported" ] = CODE_CHALLENGE_METHODS_SUPPORTED
129+ data ["capabilities" ] = CAPABILITIES
130+
86131 return data
0 commit comments