-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrequest.go
102 lines (79 loc) · 2.15 KB
/
request.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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
package main
import (
"context"
"log"
linkv1 "buf.build/gen/go/pocketsign/apis/protocolbuffers/go/pocketsign/link/v1"
"golang.org/x/oauth2"
"connectrpc.com/connect"
"github.com/gorilla/sessions"
)
// リソースの取得を行う
func getUserResource(ctx context.Context, sess *sessions.Session, id string) (UserResource, error) {
req, err := setupRequest(connect.NewRequest(&linkv1.SubscriberServiceGetUserResourceRequest{
ResourceId: id,
}), sess)
if err != nil {
return UserResource{}, err
}
resp, err := subscriberAPIConnectClient.GetUserResource(ctx, req)
if err != nil {
return UserResource{}, err
}
return UserResource{Value: resp.Msg.GetValue()}, nil
}
// リソースの更新を行う
func putUserResource(ctx context.Context, sess *sessions.Session, id string, v UserResource) error {
req, err := setupRequest(connect.NewRequest(&linkv1.SubscriberServiceUpdateUserResourceRequest{
ResourceId: id,
Value: v.Value,
}), sess)
if err != nil {
return err
}
_, err = subscriberAPIConnectClient.UpdateUserResource(ctx, req)
if err != nil {
return err
}
return nil
}
// RequestにAuthorizationヘッダを付与する
func setupRequest[T any](r *connect.Request[T], sess *sessions.Session) (*connect.Request[T], error) {
subject, ok := sess.Values["sub"].(string)
if !ok {
return nil, errNotAuthenticated
}
ts, ok := tokenSourceStore[subject]
if !ok {
return nil, errNotAuthenticated
}
token, err := ts.Token()
if err != nil {
return nil, err
}
r.Header().Add("Authorization", "Bearer "+token.AccessToken)
return r, nil
}
// トークンの更新を行う
func refresh(ctx context.Context, conf *oauth2.Config, sess *sessions.Session) error {
subject, ok := sess.Values["sub"].(string)
if !ok {
return errNotAuthenticated
}
ref, ok := refreshTokenStore[subject]
if !ok {
return errNotAuthenticated
}
log.Println("refresh token: ", ref)
// 更新
tks := conf.TokenSource(ctx, &oauth2.Token{
RefreshToken: ref,
})
tk, err := tks.Token()
if err != nil {
log.Println(err)
return errNotAuthenticated
}
tokenSourceStore[subject] = tks
refreshTokenStore[subject] = tk.RefreshToken
return nil
}