/
authentication.go
129 lines (105 loc) · 2.35 KB
/
authentication.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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
// Copyright 2020 Self Group Ltd. All Rights Reserved.
package main
import (
"log"
"net"
"net/http"
"os"
"os/exec"
"runtime"
"time"
"github.com/google/uuid"
selfsdk "github.com/joinself/self-go-sdk"
"github.com/joinself/self-go-sdk/authentication"
"github.com/joinself/self-go-sdk/fact"
)
func main() {
cfg := selfsdk.Config{
SelfAppID: os.Getenv("SELF_APP_ID"),
SelfAppDeviceSecret: os.Getenv("SELF_APP_DEVICE_SECRET"),
StorageKey: "my-secret-crypto-storage-key",
StorageDir: "../.storage/",
}
if os.Getenv("SELF_ENV") != "" {
cfg.Environment = os.Getenv("SELF_ENV")
}
client, err := selfsdk.New(cfg)
if err != nil {
log.Fatal(err)
}
defer func() {
err = client.Close()
if err != nil {
log.Fatal(err)
}
}()
err = client.Start()
if err != nil {
panic(err)
}
s := server{
cid: uuid.New().String(),
auth: client.AuthenticationService(),
}
mux := http.NewServeMux()
mux.HandleFunc("/qr.png", s.qrcode)
log.Println("starting server")
l, err := net.Listen("tcp", ":9999")
if err != nil {
log.Fatal(err)
}
go func() {
err := http.Serve(l, mux)
if err != nil {
log.Fatal(err)
}
}()
openbrowser("http://localhost:9999/qr.png")
log.Println("waiting for response")
resp, err := s.auth.WaitForResponse(s.cid, time.Minute)
if err != nil {
log.Fatal("auth returned with: ", err)
}
if !resp.Accepted {
log.Fatal("auth rejected:", resp.SelfID)
}
log.Println("authentication succeeded:", resp.SelfID)
}
type server struct {
cid string
auth *authentication.Service
}
// serves the qr code image
func (s server) qrcode(w http.ResponseWriter, r *http.Request) {
req := authentication.QRAuthenticationRequest{
ConversationID: s.cid,
Expiry: time.Minute * 5,
QRConfig: fact.QRConfig{
Size: 400,
BackgroundColor: "#FFFFFF",
ForegroundColor: "#000000",
},
}
qrdata, err := s.auth.GenerateQRCode(&req)
if err != nil {
log.Fatal(err)
}
w.Write(qrdata)
}
// ignore this stuff
func openbrowser(url string) {
var err error
switch runtime.GOOS {
case "linux":
err = exec.Command("xdg-open", url).Start()
case "windows":
err = exec.Command("rundll32", "url.dll,FileProtocolHandler", url).Start()
case "darwin":
err = exec.Command("open", url).Start()
default:
log.Fatal("unsupported platform")
}
if err != nil {
log.Fatal(err)
}
}