4
4
#include < library/cpp/string_utils/base64/base64.h>
5
5
#include < ydb/library/actors/http/http.h>
6
6
#include " openid_connect.h"
7
+ #include " oidc_settings.h"
7
8
#include " context.h"
8
9
9
10
namespace NMVP {
10
11
namespace NOIDC {
11
12
12
- TContext::TContext (const TString& state, const TString& requestedAddress, bool isAjaxRequest )
13
- : State(state )
14
- , AjaxRequest(isAjaxRequest )
15
- , RequestedAddress(requestedAddress )
13
+ TContext::TContext (const TInitializer& initializer )
14
+ : State(initializer.State )
15
+ , AjaxRequest(initializer.AjaxRequest )
16
+ , RequestedAddress(initializer.RequestedAddress )
16
17
{}
17
18
18
19
TContext::TContext (const NHttp::THttpIncomingRequestPtr& request)
@@ -21,8 +22,17 @@ TContext::TContext(const NHttp::THttpIncomingRequestPtr& request)
21
22
, RequestedAddress(GetRequestedUrl(request, AjaxRequest))
22
23
{}
23
24
24
- TString TContext::GetState () const {
25
- return State;
25
+ TString TContext::GetState (const TString& key) const {
26
+ static const TDuration STATE_LIFE_TIME = TDuration::Minutes (10 );
27
+ TInstant expirationTime = TInstant::Now () + STATE_LIFE_TIME;
28
+ TStringBuilder json;
29
+ json << " {\" state\" :\" " << State
30
+ << " \" ,\" expiration_time\" :\" " << ToString (expirationTime.TimeT ()) << " \" }" ;
31
+ TString digest = HmacSHA1 (key, json);
32
+ TStringBuilder signedState;
33
+ signedState << " {\" container\" :\" " << Base64Encode (json) << " \" ,"
34
+ " \" digest\" :\" " << Base64Encode (digest) << " \" }" ;
35
+ return Base64EncodeNoPadding (signedState);
26
36
}
27
37
28
38
bool TContext::IsAjaxRequest () const {
@@ -34,25 +44,22 @@ TString TContext::GetRequestedAddress() const {
34
44
}
35
45
36
46
TString TContext::CreateYdbOidcCookie (const TString& secret) const {
37
- static constexpr size_t COOKIE_MAX_AGE_SEC = 420 ;
38
- return TStringBuilder () << CreateNameYdbOidcCookie (secret, State) << " ="
47
+ static constexpr size_t COOKIE_MAX_AGE_SEC = 3600 ;
48
+ return TStringBuilder () << TOpenIdConnectSettings::YDB_OIDC_COOKIE << " ="
39
49
<< GenerateCookie (secret) << " ;"
40
50
" Path=" << GetAuthCallbackUrl () << " ;"
41
51
" Max-Age=" << COOKIE_MAX_AGE_SEC << " ;"
42
52
" SameSite=None; Secure" ;
43
53
}
44
54
45
- TString TContext::GenerateCookie (const TString& secret) const {
46
- const TDuration StateLifeTime = TDuration::Minutes (10 );
47
- TInstant expirationTime = TInstant::Now () + StateLifeTime;
48
- TStringBuilder stateStruct;
49
- stateStruct << " {\" state\" :\" " << State
50
- << " \" ,\" requested_address\" :\" " << RequestedAddress
51
- << " \" ,\" expiration_time\" :" << ToString (expirationTime.TimeT ())
52
- << " ,\" ajax_request\" :" << (AjaxRequest ? " true" : " false" ) << " }" ;
53
- TString digest = HmacSHA256 (secret, stateStruct);
54
- TString cookieStruct {" {\" state_struct\" :\" " + Base64Encode (stateStruct) + " \" ,\" digest\" :\" " + Base64Encode (digest) + " \" }" };
55
- return Base64Encode (cookieStruct);
55
+ TString TContext::GenerateCookie (const TString& key) const {
56
+ TStringBuilder requestedAddressContext;
57
+ requestedAddressContext << " {\" requested_address\" :\" " << RequestedAddress << " \" }" ;
58
+ TString digest = HmacSHA256 (key, requestedAddressContext);
59
+ TStringBuilder signedRequestedAddress;
60
+ signedRequestedAddress << " {\" requested_address_context\" :\" " << Base64Encode (requestedAddressContext)
61
+ << " \" ,\" digest\" :\" " << Base64Encode (digest) << " \" }" ;
62
+ return Base64Encode (signedRequestedAddress);
56
63
}
57
64
58
65
TString TContext::GenerateState () {
0 commit comments