/
apiImplementation.go
88 lines (74 loc) · 3.17 KB
/
apiImplementation.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
/* Copyright (c) 2021, VRAI Labs and/or its affiliates. All rights reserved.
*
* This software is licensed under the Apache License, Version 2.0 (the
* "License") as published by the Apache Software Foundation.
*
* You may not use this file except in compliance with the License. You may
* obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*/
package session
import (
"net/http"
"github.com/supertokens/supertokens-golang/recipe/session/sessmodels"
"github.com/supertokens/supertokens-golang/supertokens"
)
func MakeAPIImplementation() sessmodels.APIInterface {
refreshPOST := func(options sessmodels.APIOptions, userContext supertokens.UserContext) (sessmodels.SessionContainer, error) {
return RefreshSessionInRequest(options.Req, options.Res, options.Config, options.RecipeImplementation, userContext)
}
verifySession := func(verifySessionOptions *sessmodels.VerifySessionOptions, options sessmodels.APIOptions, userContext supertokens.UserContext) (sessmodels.SessionContainer, error) {
method := options.Req.Method
if method == http.MethodOptions || method == http.MethodTrace {
return nil, nil
}
incomingPath, err := supertokens.NewNormalisedURLPath(options.Req.RequestURI)
if err != nil {
return nil, err
}
refreshTokenPath := options.Config.RefreshTokenPath
if incomingPath.Equals(refreshTokenPath) && method == http.MethodPost {
session, err := RefreshSessionInRequest(options.Req, options.Res, options.Config, options.RecipeImplementation, userContext)
return session, err
} else {
var _verifySessionOptionsToPass *sessmodels.VerifySessionOptions
if verifySessionOptions != nil {
_verifySessionOptionsToPass = &sessmodels.VerifySessionOptions{
AntiCsrfCheck: verifySessionOptions.AntiCsrfCheck,
SessionRequired: verifySessionOptions.SessionRequired,
CheckDatabase: verifySessionOptions.CheckDatabase,
OverrideGlobalClaimValidators: verifySessionOptions.OverrideGlobalClaimValidators,
}
}
sessionContainer, err := GetSessionFromRequest(options.Req, options.Res, options.Config, _verifySessionOptionsToPass, options.RecipeImplementation, userContext)
if err != nil {
return nil, err
}
if sessionContainer == nil {
return nil, nil
}
return sessionContainer, nil
}
}
signOutPOST := func(sessionContainer sessmodels.SessionContainer, options sessmodels.APIOptions, userContext supertokens.UserContext) (sessmodels.SignOutPOSTResponse, error) {
if sessionContainer != nil {
err := sessionContainer.RevokeSessionWithContext(userContext)
if err != nil {
return sessmodels.SignOutPOSTResponse{}, err
}
}
return sessmodels.SignOutPOSTResponse{
OK: &struct{}{},
}, nil
}
return sessmodels.APIInterface{
RefreshPOST: &refreshPOST,
VerifySession: &verifySession,
SignOutPOST: &signOutPOST,
}
}