mirror of
https://github.com/cgzirim/seek-tune.git
synced 2025-12-18 09:24:19 +00:00
feat: Use env for credentials
This commit is contained in:
parent
d6bea0a568
commit
c4b7f5a14a
7 changed files with 30 additions and 29 deletions
|
|
@ -4,4 +4,6 @@ DB_PASS=password
|
||||||
DB_NAME=seek-tune
|
DB_NAME=seek-tune
|
||||||
DB_HOST=192.168.0.1
|
DB_HOST=192.168.0.1
|
||||||
DB_PORT=27017
|
DB_PORT=27017
|
||||||
REACT_APP_BACKEND_URL=http://localhost:5000
|
REACT_APP_BACKEND_URL=http://localhost:5000
|
||||||
|
SPOTIFY_CLIENT_ID=yourclientid
|
||||||
|
SPOTIFY_CLIENT_SECRET=yoursecret
|
||||||
15
README.md
15
README.md
|
|
@ -51,14 +51,17 @@ Follow the [official getting started guide](https://developer.spotify.com/docume
|
||||||
1. Create a Spotify developer app.
|
1. Create a Spotify developer app.
|
||||||
2. Copy your **Client ID** and **Client Secret**.
|
2. Copy your **Client ID** and **Client Secret**.
|
||||||
|
|
||||||
Create a file named `credentials.json` in the `server/` directory with the following structure:
|
##### Setting up Credentials
|
||||||
|
Instead of using a credentials.json file, the application now reads these values from environment variables.
|
||||||
|
|
||||||
|
Create a .env file in the server directory with the following content:
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"client_id": "your-client-id",
|
|
||||||
"client_secret": "your-client-secret"
|
|
||||||
}
|
|
||||||
```
|
```
|
||||||
|
SPOTIFY_CLIENT_ID=your-client-id
|
||||||
|
SPOTIFY_CLIENT_SECRET=your-client-secret
|
||||||
|
```
|
||||||
|
|
||||||
|
Make sure this .env file is loaded into your environment before running the server.
|
||||||
The application will automatically read this file to fetch and cache access tokens. If the token is expired or missing, a new one will be requested.
|
The application will automatically read this file to fetch and cache access tokens. If the token is expired or missing, a new one will be requested.
|
||||||
|
|
||||||
#### 💻 Set Up Natively
|
#### 💻 Set Up Natively
|
||||||
|
|
|
||||||
|
|
@ -1,4 +0,0 @@
|
||||||
{
|
|
||||||
"client_id": "",
|
|
||||||
"client_secret": ""
|
|
||||||
}
|
|
||||||
|
|
@ -40,6 +40,7 @@ require (
|
||||||
github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect
|
github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect
|
||||||
github.com/googleapis/gax-go/v2 v2.12.1 // indirect
|
github.com/googleapis/gax-go/v2 v2.12.1 // indirect
|
||||||
github.com/gorilla/websocket v1.4.2 // indirect
|
github.com/gorilla/websocket v1.4.2 // indirect
|
||||||
|
github.com/joho/godotenv v1.4.0 // indirect
|
||||||
github.com/klauspost/compress v1.17.6 // indirect
|
github.com/klauspost/compress v1.17.6 // indirect
|
||||||
github.com/mattn/go-colorable v0.1.13 // indirect
|
github.com/mattn/go-colorable v0.1.13 // indirect
|
||||||
github.com/mattn/go-isatty v0.0.20 // indirect
|
github.com/mattn/go-isatty v0.0.20 // indirect
|
||||||
|
|
|
||||||
|
|
@ -100,6 +100,8 @@ github.com/googollee/go-socket.io v1.7.0/go.mod h1:0vGP8/dXR9SZUMMD4+xxaGo/lohOw
|
||||||
github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
|
github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
|
||||||
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
||||||
github.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=
|
github.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=
|
||||||
|
github.com/joho/godotenv v1.4.0 h1:3l4+N6zfMWnkbPEXKng2o2/MR5mSwTrBih4ZEkkz1lg=
|
||||||
|
github.com/joho/godotenv v1.4.0/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
|
||||||
github.com/kkdai/youtube/v2 v2.10.1 h1:jdPho4R7VxWoRi9Wx4ULMq4+hlzSVOXxh4Zh83f2F9M=
|
github.com/kkdai/youtube/v2 v2.10.1 h1:jdPho4R7VxWoRi9Wx4ULMq4+hlzSVOXxh4Zh83f2F9M=
|
||||||
github.com/kkdai/youtube/v2 v2.10.1/go.mod h1:qL8JZv7Q1IoDs4nnaL51o/hmITXEIvyCIXopB0oqgVM=
|
github.com/kkdai/youtube/v2 v2.10.1/go.mod h1:qL8JZv7Q1IoDs4nnaL51o/hmITXEIvyCIXopB0oqgVM=
|
||||||
github.com/kkdai/youtube/v2 v2.10.4 h1:T3VAQ65EB4eHptwcQIigpFvUJlV9EcKRGJJdSVUy3aU=
|
github.com/kkdai/youtube/v2 v2.10.4 h1:T3VAQ65EB4eHptwcQIigpFvUJlV9EcKRGJJdSVUy3aU=
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@ import (
|
||||||
"song-recognition/utils"
|
"song-recognition/utils"
|
||||||
|
|
||||||
"github.com/mdobak/go-xerrors"
|
"github.com/mdobak/go-xerrors"
|
||||||
|
"github.com/joho/godotenv"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
|
@ -33,7 +34,8 @@ func main() {
|
||||||
fmt.Println("Expected 'find', 'download', 'erase', 'save', or 'serve' subcommands")
|
fmt.Println("Expected 'find', 'download', 'erase', 'save', or 'serve' subcommands")
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
_ = godotenv.Load()
|
||||||
|
|
||||||
switch os.Args[1] {
|
switch os.Args[1] {
|
||||||
case "find":
|
case "find":
|
||||||
if len(os.Args) < 3 {
|
if len(os.Args) < 3 {
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
"os"
|
"os"
|
||||||
|
"song-recognition/utils"
|
||||||
|
|
||||||
"github.com/tidwall/gjson"
|
"github.com/tidwall/gjson"
|
||||||
)
|
)
|
||||||
|
|
@ -28,16 +29,14 @@ type Track struct {
|
||||||
Duration int
|
Duration int
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const (
|
const (
|
||||||
tokenURL = "https://accounts.spotify.com/api/token"
|
tokenURL = "https://accounts.spotify.com/api/token"
|
||||||
credentialsPath = "credentials.json"
|
|
||||||
cachedTokenPath = "token.json"
|
cachedTokenPath = "token.json"
|
||||||
)
|
)
|
||||||
|
|
||||||
type credentials struct {
|
type credentials struct {
|
||||||
ClientID string `json:"client_id"`
|
ClientID string
|
||||||
ClientSecret string `json:"client_secret"`
|
ClientSecret string
|
||||||
}
|
}
|
||||||
|
|
||||||
type tokenResponse struct {
|
type tokenResponse struct {
|
||||||
|
|
@ -52,21 +51,17 @@ type cachedToken struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func loadCredentials() (*credentials, error) {
|
func loadCredentials() (*credentials, error) {
|
||||||
file, err := os.Open(credentialsPath)
|
clientID := utils.GetEnv("SPOTIFY_CLIENT_ID", "")
|
||||||
if err != nil {
|
clientSecret := utils.GetEnv("SPOTIFY_CLIENT_SECRET", "")
|
||||||
if os.IsNotExist(err) {
|
|
||||||
absPath, _ := os.Getwd()
|
|
||||||
return nil, fmt.Errorf("credentials.json not found. Please create it in the same directory:\n%s/%s", absPath, credentialsPath)
|
|
||||||
}
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
defer file.Close()
|
|
||||||
|
|
||||||
var creds credentials
|
if clientID == "" || clientSecret == "" {
|
||||||
if err := json.NewDecoder(file).Decode(&creds); err != nil {
|
return nil, fmt.Errorf("SPOTIFY_CLIENT_ID or SPOTIFY_CLIENT_SECRET environment variables not set")
|
||||||
return nil, fmt.Errorf("failed to parse credentials.json: %w", err)
|
|
||||||
}
|
}
|
||||||
return &creds, nil
|
|
||||||
|
return &credentials{
|
||||||
|
ClientID: clientID,
|
||||||
|
ClientSecret: clientSecret,
|
||||||
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue