|
| 1 | +Class isc.esia.OAuthREST Extends (%CSP.REST, isc.util.ESIAUtils) |
| 2 | +{ |
| 3 | + |
| 4 | +Parameter HandleCorsRequest = 0; |
| 5 | + |
| 6 | +XData UrlMap [ XMLNamespace = "http://www.intersystems.com/urlmap" ] |
| 7 | +{ |
| 8 | +<Routes> |
| 9 | +<Route Url="/login" Method="GET" Call="initialLogin"/> |
| 10 | +<Route Url="/loginResponse" Method="GET" Call="loginResponse"/> |
| 11 | + |
| 12 | +<Route Url="/logout" Method="GET" Call="initialLogout"/> |
| 13 | +<Route Url="/logoutResponse" Method="GET" Call="logoutResponse"/> |
| 14 | +</Routes> |
| 15 | +} |
| 16 | + |
| 17 | +/// Первоначальная точка входа для авторзации пользователя через ЕСИА |
| 18 | +ClassMethod initialLogin() As %Status |
| 19 | +{ |
| 20 | + #dim %response As %CSP.Response |
| 21 | + set %response.Redirect = $classmethod(##class(isc.esia.Settings).getSetting("config"), "getLoginURL") |
| 22 | + quit $$$OK |
| 23 | +} |
| 24 | + |
| 25 | +/// Метод вызывается из ЕСИА через redirect - в ответ на логин из нашего портала |
| 26 | +/// do ##class(isc.esia.OAuthREST).decode() |
| 27 | +ClassMethod loginResponse(debug As %Boolean = {$$$YES}) |
| 28 | +{ |
| 29 | + #dim sc As %Status = $$$OK |
| 30 | + #dim %request As %CSP.Request |
| 31 | + #dim %response As %CSP.Response |
| 32 | + |
| 33 | + set code = %request.Get("code") |
| 34 | + set state = %request.Get("state") |
| 35 | + //set code = "eyJ2ZXIiOjEsInR5cCI6IkpXVCIsInNidCI6ImF1dGhvcml6YXRpb25fY29kZSIsImFsZyI6IlJTMjU2In0.eyJuYmYiOjE1MTg0MzQ3MjYsInNjb3BlIjoiZnVsbG5hbWU_b2lkPTEwMDAzMzA3OTkiLCJhdXRoX3RpbWUiOjE1MTg0MzQ3MjU4NzcsImlzcyI6Imh0dHA6XC9cL2VzaWEuZ29zdXNsdWdpLnJ1XC8iLCJ1cm46ZXNpYTpzaWQiOiIyNjhkYTEzYmFjYjM0MjM4MGRiY2FmYzE2NjdmMDQ3M2FmODY5NGNjY2MxNGViN2I2ZGQ4Yjg3MmEyNDkwOWY2IiwidXJuOmVzaWE6Y2xpZW50OnN0YXRlIjoiMDZmNzRkYzQtNWZiZC00ODljLWI1ZDYtZGU1NjQ5ZmZiODg1IiwiYXV0aF9tdGhkIjoiUFdEIiwidXJuOmVzaWE6c2JqIjp7InVybjplc2lhOnNiajp0eXAiOiJQIiwidXJuOmVzaWE6c2JqOm9pZCI6MTAwMDMzMDc5OSwidXJuOmVzaWE6c2JqOm5hbSI6Ik9JRC4xMDAwMzMwNzk5IiwidXJuOmVzaWE6c2JqOmVpZCI6NzQ0NTQyMX0sImV4cCI6MTUxOTk1MzIyMTE2MiwicGFyYW1zIjp7fSwiaWF0IjoxNTE4NDM0NzI2LCJjbGllbnRfaWQiOiIxMjI3MDEifQ.JdgYTNtgyplAIG3URTxdMIqr0mXdsok9okxTHVfDRq28_7FSiytZV-KDixxH99c_EWx0HOsRCOlcBwD32oL9ou1bQadWGyga9lsRt1A78aAV4W7ewnL7a_uQDBVZROzx6R-PPfdqWuwcR0vCjCUSEqqCUh97WauV3N3PyI1RJLbaup2cqKsYhPcB1o4iqwVyCmvCTkZOKsFI6DFrRbVyXFEH1Xuo5QB2_EJkcoA7RHhTa9KbJy4K1Z2T0wdwO0l2ddg13sXq-kdXzJk9BpW9EsAnyB6zv2uCDHUd8MSo7JbjEcxVby165Xaj3ZDoAh_CdrqjNhCgFdFiKjogJGY0gw" |
| 36 | + |
| 37 | + set header = ..base64URLDecode($p(code, ".")) |
| 38 | + set payload = ..base64URLDecode($p(code, ".", 2)) |
| 39 | + set signature = ..base64URLDecode($p(code, ".", 3)) |
| 40 | + |
| 41 | + set config = ##class(isc.esia.Settings).getSetting("config") |
| 42 | + |
| 43 | + /*do ##class(isc.util.ESIAUtils).createFile("C:\InterSystems\Cache\mgr\Temp\resp.txt", , $p(code, ".", 1, 2)) |
| 44 | + do ##class(isc.util.ESIAUtils).createFile("C:\InterSystems\Cache\mgr\Temp\sig.txt", , signature) |
| 45 | + zzdump signature |
| 46 | + w !,!,! |
| 47 | + zzdump $e($p(code, ".", 1, 2),1,100) |
| 48 | + w !,! |
| 49 | + write:debug "Auth response:",!,! |
| 50 | + zw:debug header, payload ///, signature*/ |
| 51 | + |
| 52 | + set sc = $classmethod(config, "sendTokenRequest", code, .tokenResponse) |
| 53 | + quit:$$$ISERR(sc) sc |
| 54 | + |
| 55 | + write:debug !, "Token response:",!,! |
| 56 | + zw:debug tokenResponse |
| 57 | + |
| 58 | + set payloadObj = {}.%FromJSON(payload) |
| 59 | + set oid = payloadObj."urn:esia:sbj"."urn:esia:sbj:oid" |
| 60 | + |
| 61 | + #dim tokenObj As isc.esia.data.Token |
| 62 | + set tokenObj = ##class(isc.esia.data.Token).fromJSON(tokenResponse) |
| 63 | + |
| 64 | + zw:debug oid,tokenObj |
| 65 | + |
| 66 | + set sc = $classmethod(config, "sendDataRequest", tokenObj.accessToken, oid, .data) |
| 67 | + quit:$$$ISERR(sc) sc |
| 68 | + |
| 69 | + write:debug !, "Data response:",!,! |
| 70 | + |
| 71 | + #dim person As isc.esia.data.Person |
| 72 | + |
| 73 | + if ##class(isc.esia.data.Person).oidIndexExists(oid, .id) { |
| 74 | + set person = ##class(isc.esia.data.Person).%OpenId(id) |
| 75 | + do person.updateFromJSON(data) |
| 76 | + } else { |
| 77 | + set person = ##class(isc.esia.data.Person).fromJSON(data) |
| 78 | + set person.oid = oid |
| 79 | + } |
| 80 | + set person.token = tokenObj |
| 81 | + |
| 82 | + zw:debug data, person |
| 83 | + |
| 84 | + set key = "" |
| 85 | + while 1 { |
| 86 | + set contact = person.contacts.GetNext(.key) |
| 87 | + quit:key="" |
| 88 | + zw:debug contact |
| 89 | + } |
| 90 | + |
| 91 | + set sc = person.%Save() |
| 92 | + |
| 93 | + set redirect = $parameter(##class(isc.esia.Settings).getSetting("config"), "MAINPAGE") |
| 94 | + if debug { |
| 95 | + write !, "Reditect: ", redirect,! |
| 96 | + } else { |
| 97 | + set %response.Redirect = redirect |
| 98 | + } |
| 99 | + quit sc |
| 100 | +} |
| 101 | + |
| 102 | +/// Первоначальная точка входа для выхода пользователя через ЕСИА |
| 103 | +ClassMethod initialLogout() As %Status |
| 104 | +{ |
| 105 | + #dim %response As %CSP.Response |
| 106 | + set %response.Redirect = $classmethod(##class(isc.esia.Settings).getSetting("config"), "getLogoutURL") |
| 107 | + quit $$$OK |
| 108 | +} |
| 109 | + |
| 110 | +/// Метод вызывается из ЕСИА через redirect - в ответ на выход из нашего портала |
| 111 | +ClassMethod logoutResponse() As %Status |
| 112 | +{ |
| 113 | + set %response.Redirect = $parameter(##class(isc.esia.Settings).getSetting("config"), "PUBLICPAGE") |
| 114 | + set %session.EndSession = $$$YES |
| 115 | + quit $$$OK |
| 116 | +} |
| 117 | + |
| 118 | +} |
| 119 | + |
0 commit comments