Desde un Entorno de INTEGRACION conectar a otro de PREPRODUCCION para acceder al Servidor de Recursos que Valida Token JWT
Buenos días,
Hemos estado indagando de qué manera activar un Servidor para Generar Tokens y un Servidor de Recursos asociado para Validar el Token. Este paso, actualmente lo hemos averiguado con el inestimable apoyo de @Alberto Fuentes de Intersystems.
A continuación la necesidad es la siguiente: Para centralizar en 1 único Entorno ( PREPRODUCCION ) y en 1 único Namespace el Servidor de Recursos ( por ejemplo en un NAMESPACE dedicado llamado AUTHSERVER ) ; necesitaríamos de alguna manera "llamar", "invocar", "comunicar" desde los otros entornos ( por ejemplo INTEGRACION ) con el Servidor de Recursos de PREPRODUCCION con el fin de Validar el Token. ¿Por favor, ustedes nos podrían orientar, guiar, pautar, instruir al respecto?
📍¿Qué vía existe para "llamar", "invocar", "comunicar" desde los otros entornos ( por ejemplo INTEGRACION ) con el Servidor de Recursos de PREPRODUCCION con el fin de Validar el Token?
En concreto, disponemos en Integracion de un Servicio REST llamado "Servicios.REST.Radiologia.CConcertadosv01r00", y dentro un método denominado "ResServer". Nuestras pesquisas nos han llevado a profundizar en el siguiente código:
ClassMethod ResServer(accessToken As %String(MAXLEN="")) As %Status
{
$$$LOGINFO("Entra en método ResServer")
// This is a dummy resource server which just gets the access token from the request
// and uses the introspection endpoint to ensure that the access token is valid.
// Normally the response would not be security related, but would contain some interesting
// data based on the request parameters.
// retrieve access token from HTTP request
;set accessToken = ##class(%SYS.OAuth2.AccessToken).GetAccessTokenFromRequest(.status) /*
if $$$ISERR(status) {
set %response.Status = ..#HTTP401UNAUTHORIZED
write "[Error] GetAccessTokenFromRequest: "_$system.Status.GetErrorText(status),!
quit $$$OK
}
*/ $$$LOGALERT("Antes de set isJWTValid = ##class(%SYS.OAuth2.Validation).ValidateJWT('resserver',accessToken,'','',.jwtPayload ,.securityParameters,.sc)")
// validate token
;set isJWTValid = ##class(%SYS.OAuth2.Validation).ValidateJWT("resserver",accessToken,"","",.jwtPayload ,.securityParameters,.sc)
set isJWTValid = ##class(%SYS.OAuth2.Validation).ValidateJWT("https://[Servidor de PRE]:57773/resserver/",accessToken,"","",.jwtPayload ,.securityParameters,.sc)
$$$LOGALERT("Despues de isJWTValid ... apuntando a https://[Servidor de PRE]:57773/resserver/")
$$$LOGINFO("Antes de if (('isJWTValid) || ($$$ISERR(sc))) {")
$$$LOGINFO("Imprimir ('isJWTValid): "_('isJWTValid))
$$$LOGINFO("Imprimir ($$$ISERR(sc): "_($$$ISERR(sc)))
$$$LOGINFO("Imprimir $system.Status.GetErrorText(sc): "_$system.Status.GetErrorText(sc))
if (('isJWTValid) || ($$$ISERR(sc))) {
/*
set %response.Status = ..#HTTP401UNAUTHORIZED
write "Error Getting Access Token="_$system.Status.GetErrorText(sc),!
*/
quit '$$$OK
} $$$LOGINFO("Antes de set sc = ##class(%SYS.OAuth2.AccessToken).GetIntrospection('resserver', accessToken, .jsonObject)")
// introspection
set sc = ##class(%SYS.OAuth2.AccessToken).GetIntrospection("resserver", accessToken, .jsonObject)
if $$$ISERR(sc) {
/*
set %response.Status = ..#HTTP401UNAUTHORIZED
write "Introspection Error="_..EscapeHTML($system.Status.GetErrorText(sc)),!
*/
quit '$$$OK
}
$$$LOGINFO("Antes de write 'OAuth 2.0 access token used to authorize resource server (RFC 6749)<br>'")
/*
write "OAuth 2.0 access token used to authorize resource server (RFC 6749)<br>"
write "Access token validated using introspection endpoint (RFC 7662)<br>"
write " scope='"_jsonObject.scope_"'<br>"
write " user='"_jsonObject.username_"'",!
*/
$$$LOGINFO("Antes del final quit $$$OK")
quit $$$OK
}
Seguidamente nuestras indagaciones nos llevan a:
Ésta línea si llama desde PREPRODUCCION al Servidor de Recursos de PREPRODUCCION y Valida el Token de manera correcta:
Sin embargo si nosotros tratamos invocar desde INTEGRACION al Servidor de Recursos de PREPRODUCCION calificando el primer parámetro, el "client" con la Dirección completa del Servidor de Recursos de PRE ; da Excepción:
En particular la Excepción que observamos en los LOGS del Servicio REST es:
ERROR #5002: Error de cache: <UNDEFINED>zValidateJWT+22^%SYS.OAuth2.Validation.1 *client
Lo cual parece que se debe al hecho de que en la función interna de la clase: "
Se genera una Excepción basada en el hecho de que le cuesta abrir el Servidor de Recursos; en la clase:
¿Por favor, ustedes nos podrían orientar, guiar, pautar, instruir al respecto?
📍 La cuestión es ¿Qué vía existe para "llamar", "invocar", "comunicar" desde los otros entornos ( por ejemplo INTEGRACION ) con el Servidor de Recursos de PREPRODUCCION con el fin de Validar el Token?
Muchísimas gracias de antemano a ustedes por su tiempo, apoyo y auxilio.
Un saludo