about summary refs log tree commit diff
diff options
context:
space:
mode:
authorWilliam Carroll <wpcarro@gmail.com>2020-02-04T22·54+0000
committerWilliam Carroll <wpcarro@gmail.com>2020-02-04T23·00+0000
commit70034d4cb92a7c3c9c0589e15ee47299d41117e6 (patch)
tree92b23b53a1d73881c0e805ed228af2cd616dbc2c
parentcce926d60f963ad9e45c0f0b642bcfb3eb86ee65 (diff)
Begin supporting Monzo OAuth 2.0 login flow
What's done:
- Basic support of the client authorization grant stage of the OAuth login
  flow:
  - Open Google Chrome to point the user to Monzo's client authorization page.
  - Created a web server to retrieve the authorization code from Monzo.

What's left:
- Pulling the authorization grant (i.e. code) from Monzo's request and
  exchanging it for an access token and a refresh token, which can be used to
  make subsequent requests.

Unanswered question:
- Assuming this is a stateless app, where should I store the access token and
  refresh token to avoid the authorization flow. I'd like to avoid the client
  authorization flow because ideally I could run this app as a job that runs
  periodically throughout the day without requiring my interactions with it.

Some interesting notes:
- Notice how in the .envrc file, it's possible to make calls to `pass`. This
  allows me to check in the .envrc files without obscuring their content. It
  also allows me to consume these values in my app by using
  `os.Getenv("client_secret")`, which I find straightforward. Overall, I'm quite
  pleased to have stumbled upon this pattern - assuming that it's secure.
-rw-r--r--monzo-ynab/.envrc2
-rw-r--r--monzo-ynab/main.go41
2 files changed, 43 insertions, 0 deletions
diff --git a/monzo-ynab/.envrc b/monzo-ynab/.envrc
new file mode 100644
index 000000000000..6a45e34bd0a2
--- /dev/null
+++ b/monzo-ynab/.envrc
@@ -0,0 +1,2 @@
+export client_id="$(pass show finance/monzo/client-id)"
+export client_secret="$(pass show finance/monzo/client-secret)"
diff --git a/monzo-ynab/main.go b/monzo-ynab/main.go
new file mode 100644
index 000000000000..f5c9e9cbbeca
--- /dev/null
+++ b/monzo-ynab/main.go
@@ -0,0 +1,41 @@
+// Creating a job to import Monzo transactions into YNAB.
+//
+// This is going to run N times per 24 hours.
+
+package main
+
+import (
+	"fmt"
+	"log"
+	"net/http"
+	"os"
+	"os/exec"
+)
+
+var (
+	clientId     = os.Getenv("client_id")
+	clientSecret = os.Getenv("client_secret")
+)
+
+const (
+	state       = "xyz123"
+	redirectUri = "http://localhost:8080/authorize"
+)
+
+func handleRedirect(w http.ResponseWriter, r *http.Request) {
+	fmt.Println(r)
+	fmt.Fprintf(w, "Ackified")
+}
+
+func authorizeClient() {
+	url :=
+		fmt.Sprintf("https://auth.monzo.com/?client_id=%s&redirect_uri=%s&response_type=code&state=:state",
+			clientId, redirectUri, state)
+	exec.Command("google-chrome", url).Start()
+}
+
+func main() {
+	authorizeClient()
+	http.HandleFunc("/authorize", handleRedirect)
+	go log.Fatal(http.ListenAndServe(":8080", nil))
+}