Skip to content

Commit 3b41407

Browse files
committed
Первый коммит
Signed-off-by: eduard93 <[email protected]>
1 parent 3afc40c commit 3b41407

13 files changed

+1047
-0
lines changed

isc/esia/OAuthREST.cls

+119
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
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+

isc/esia/Settings.cls

+88
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
Include %syPrompt
2+
3+
Class isc.esia.Settings
4+
{
5+
6+
Parameter GLVN = "^ESIA";
7+
8+
Parameter BASECONFIG = "isc.esia.configuration.Abstract";
9+
10+
Parameter BASESIGNER = "isc.esia.signer.Abstract";
11+
12+
/// Получить настойку
13+
/// config - имя класса реализующего интерфейс isc.esia.Configuration.Abstract
14+
/// signer - имя класса реализующего интерфейс isc.esia.Signer.Abstract
15+
/// write ##class(isc.esia.Settings).getSetting("config")
16+
ClassMethod getSetting(name As %String) As %String [ CodeMode = expression ]
17+
{
18+
$get(@..#GLVN@($zcvt(name, "l")))
19+
}
20+
21+
/// Установить настройку
22+
/// write ##class(isc.esia.Settings).setSetting("config", "isc.esia.configuration.Test")
23+
/// write ##class(isc.esia.Settings).setSetting("signer", "isc.esia.signer.OpenSSL")
24+
ClassMethod setSetting(name As %String = "", value As %String = "") As %Status
25+
{
26+
#dim sc As %Status = $$$OK
27+
28+
if name = "config" {
29+
if '##class(%Dictionary.ClassDefinition).%ExistsId(value) {
30+
set sc = $$$ERROR($$$GeneralError, $$$FormatText("Класс '%1' не существует", value))
31+
}
32+
quit:$$$ISERR(sc) sc
33+
34+
if $classmethod(value, "%Extends", ..#BASECONFIG)=$$$NO {
35+
set sc = $$$ERROR($$$GeneralError, $$$FormatText("Класс '%1' не является потомком %2", value, ..#BASECONFIG))
36+
}
37+
} elseif name = "signer" {
38+
if '##class(%Dictionary.ClassDefinition).%ExistsId(value) {
39+
set sc = $$$ERROR($$$GeneralError, $$$FormatText("Класс '%1' не существует", value))
40+
}
41+
quit:$$$ISERR(sc) sc
42+
43+
if $classmethod(value, "%Extends", ..#BASESIGNER)=$$$NO {
44+
set sc = $$$ERROR($$$GeneralError, $$$FormatText("Класс '%1' не является потомком %2", value, ..#BASESIGNER))
45+
}
46+
} else {
47+
set sc = $$$ERROR($$$GeneralError, $$$FormatText("Свойство '%1' не существует", name))
48+
}
49+
50+
set:$$$ISOK(sc) @..#GLVN@($zcvt(name, "l")) = value
51+
return sc
52+
}
53+
54+
/// do ##class(isc.esia.Settings).subclassQueryFunc().%Display()
55+
Query subclassQuery(base = {..#BASECONFIG}) As %SQLQuery
56+
{
57+
SELECT
58+
c.Name || ': ' || p._Default
59+
FROM %Dictionary.ClassDefinitionQuery_SubclassOf(:base) c
60+
JOIN %Dictionary.CompiledParameter p ON c.Name = p.parent AND p.Name = 'NAME'
61+
}
62+
63+
/// Интерактивная установка конфигурации и криптопровайдера.
64+
/// do ##class(isc.esia.Settings).install()
65+
ClassMethod install() As %Status
66+
{
67+
#dim sc,sc1 As %Status = $$$OK
68+
69+
do ##class(%Prompt).GetArray("Выберите конфигурацию", .choice, $lb($classname() _ ":subclassQuery", ..#BASECONFIG),,,,$$$InitialDisplayMask)
70+
set config = $piece(choice, ":")
71+
72+
set sc = ..setSetting("config", config)
73+
write !
74+
write:$$$ISERR(sc) $System.Status.GetErrorText(sc)
75+
76+
kill choice
77+
78+
do ##class(%Prompt).GetArray("Выберите криптопровайдер", .choice, $lb($classname() _ ":subclassQuery", ..#BASESIGNER),,,,$$$InitialDisplayMask)
79+
set signer = $piece(choice, ":")
80+
81+
set sc1 = ..setSetting("signer", signer)
82+
write:$$$ISERR(sc1) $System.Status.GetErrorText(sc1)
83+
84+
quit $$$ADDSC(sc, sc1)
85+
}
86+
87+
}
88+

0 commit comments

Comments
 (0)