2020-10-16 13:06:27 +08:00
|
|
|
# Goth: Multi-Provider Authentication for Go [![GoDoc](https://godoc.org/github.com/markbates/goth?status.svg)](https://godoc.org/github.com/markbates/goth) [![Build Status](https://github.com/markbates/goth/workflows/ci/badge.svg)](https://github.com/markbates/goth/actions) [![Go Report Card](https://goreportcard.com/badge/github.com/markbates/goth)](https://goreportcard.com/report/github.com/markbates/goth)
|
2019-03-27 19:15:23 +08:00
|
|
|
|
|
|
|
Package goth provides a simple, clean, and idiomatic way to write authentication
|
|
|
|
packages for Go web applications.
|
|
|
|
|
|
|
|
Unlike other similar packages, Goth, lets you write OAuth, OAuth2, or any other
|
|
|
|
protocol providers, as long as they implement the `Provider` and `Session` interfaces.
|
|
|
|
|
|
|
|
This package was inspired by [https://github.com/intridea/omniauth](https://github.com/intridea/omniauth).
|
|
|
|
|
|
|
|
## Installation
|
|
|
|
|
|
|
|
```text
|
|
|
|
$ go get github.com/markbates/goth
|
|
|
|
```
|
|
|
|
|
|
|
|
## Supported Providers
|
|
|
|
|
|
|
|
* Amazon
|
2020-02-25 01:08:43 +08:00
|
|
|
* Apple
|
2019-03-27 19:15:23 +08:00
|
|
|
* Auth0
|
|
|
|
* Azure AD
|
|
|
|
* Battle.net
|
|
|
|
* Bitbucket
|
|
|
|
* Box
|
|
|
|
* Cloud Foundry
|
|
|
|
* Dailymotion
|
|
|
|
* Deezer
|
2020-10-16 13:06:27 +08:00
|
|
|
* DigitalOcean
|
2019-03-27 19:15:23 +08:00
|
|
|
* Discord
|
|
|
|
* Dropbox
|
|
|
|
* Eve Online
|
|
|
|
* Facebook
|
|
|
|
* Fitbit
|
2019-09-13 10:15:36 +08:00
|
|
|
* Gitea
|
2019-03-27 19:15:23 +08:00
|
|
|
* GitHub
|
|
|
|
* Gitlab
|
|
|
|
* Google
|
|
|
|
* Google+ (deprecated)
|
|
|
|
* Heroku
|
|
|
|
* InfluxCloud
|
|
|
|
* Instagram
|
|
|
|
* Intercom
|
2020-10-16 13:06:27 +08:00
|
|
|
* Kakao
|
2019-03-27 19:15:23 +08:00
|
|
|
* Lastfm
|
|
|
|
* Linkedin
|
2019-09-13 10:15:36 +08:00
|
|
|
* LINE
|
|
|
|
* Mailru
|
2019-03-27 19:15:23 +08:00
|
|
|
* Meetup
|
|
|
|
* MicrosoftOnline
|
|
|
|
* Naver
|
2019-09-13 10:15:36 +08:00
|
|
|
* Nextcloud
|
2021-01-29 00:56:38 +08:00
|
|
|
* Okta
|
2019-03-27 19:15:23 +08:00
|
|
|
* OneDrive
|
|
|
|
* OpenID Connect (auto discovery)
|
2021-01-29 00:56:38 +08:00
|
|
|
* Oura
|
2019-03-27 19:15:23 +08:00
|
|
|
* Paypal
|
|
|
|
* SalesForce
|
2019-09-13 10:15:36 +08:00
|
|
|
* Shopify
|
2019-03-27 19:15:23 +08:00
|
|
|
* Slack
|
|
|
|
* Soundcloud
|
|
|
|
* Spotify
|
|
|
|
* Steam
|
2020-10-16 13:06:27 +08:00
|
|
|
* Strava
|
2019-03-27 19:15:23 +08:00
|
|
|
* Stripe
|
|
|
|
* Tumblr
|
|
|
|
* Twitch
|
|
|
|
* Twitter
|
|
|
|
* Typetalk
|
|
|
|
* Uber
|
|
|
|
* VK
|
|
|
|
* Wepay
|
|
|
|
* Xero
|
|
|
|
* Yahoo
|
|
|
|
* Yammer
|
|
|
|
* Yandex
|
|
|
|
|
|
|
|
## Examples
|
|
|
|
|
|
|
|
See the [examples](examples) folder for a working application that lets users authenticate
|
|
|
|
through Twitter, Facebook, Google Plus etc.
|
|
|
|
|
|
|
|
To run the example either clone the source from GitHub
|
|
|
|
|
|
|
|
```text
|
|
|
|
$ git clone git@github.com:markbates/goth.git
|
|
|
|
```
|
|
|
|
or use
|
|
|
|
```text
|
|
|
|
$ go get github.com/markbates/goth
|
|
|
|
```
|
|
|
|
```text
|
|
|
|
$ cd goth/examples
|
|
|
|
$ go get -v
|
|
|
|
$ go build
|
|
|
|
$ ./examples
|
|
|
|
```
|
|
|
|
|
|
|
|
Now open up your browser and go to [http://localhost:3000](http://localhost:3000) to see the example.
|
|
|
|
|
|
|
|
To actually use the different providers, please make sure you set environment variables. Example given in the examples/main.go file
|
|
|
|
|
|
|
|
## Security Notes
|
|
|
|
|
|
|
|
By default, gothic uses a `CookieStore` from the `gorilla/sessions` package to store session data.
|
|
|
|
|
|
|
|
As configured, this default store (`gothic.Store`) will generate cookies with `Options`:
|
|
|
|
|
|
|
|
```go
|
|
|
|
&Options{
|
|
|
|
Path: "/",
|
|
|
|
Domain: "",
|
|
|
|
MaxAge: 86400 * 30,
|
|
|
|
HttpOnly: true,
|
|
|
|
Secure: false,
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
To tailor these fields for your application, you can override the `gothic.Store` variable at startup.
|
|
|
|
|
|
|
|
The following snippet shows one way to do this:
|
|
|
|
|
|
|
|
```go
|
|
|
|
key := "" // Replace with your SESSION_SECRET or similar
|
|
|
|
maxAge := 86400 * 30 // 30 days
|
|
|
|
isProd := false // Set to true when serving over https
|
|
|
|
|
|
|
|
store := sessions.NewCookieStore([]byte(key))
|
|
|
|
store.MaxAge(maxAge)
|
|
|
|
store.Options.Path = "/"
|
|
|
|
store.Options.HttpOnly = true // HttpOnly should always be enabled
|
|
|
|
store.Options.Secure = isProd
|
|
|
|
|
|
|
|
gothic.Store = store
|
|
|
|
```
|
|
|
|
|
|
|
|
## Issues
|
|
|
|
|
|
|
|
Issues always stand a significantly better chance of getting fixed if they are accompanied by a
|
|
|
|
pull request.
|
|
|
|
|
|
|
|
## Contributing
|
|
|
|
|
|
|
|
Would I love to see more providers? Certainly! Would you love to contribute one? Hopefully, yes!
|
|
|
|
|
|
|
|
1. Fork it
|
|
|
|
2. Create your feature branch (git checkout -b my-new-feature)
|
|
|
|
3. Write Tests!
|
2021-01-29 00:56:38 +08:00
|
|
|
4. Make sure the codebase adhere to the Go coding standards by executing `gofmt -s -w ./`
|
|
|
|
5. Commit your changes (git commit -am 'Add some feature')
|
|
|
|
6. Push to the branch (git push origin my-new-feature)
|
|
|
|
7. Create new Pull Request
|