diff --git a/app/main.go b/app/main.go index 48e2b4be..333b7e38 100644 --- a/app/main.go +++ b/app/main.go @@ -43,6 +43,8 @@ var opts struct { GithubCSEC string `long:"github-csec" env:"REMARK_GITHUB_CSEC" description:"Github OAuth client secret"` FacebookCID string `long:"facebook-cid" env:"REMARK_FACEBOOK_CID" description:"Facebook OAuth client ID"` FacebookCSEC string `long:"facebook-csec" env:"REMARK_FACEBOOK_CSEC" description:"Facebook OAuth client secret"` + DisqusCID string `long:"disqus-cid" env:"REMARK_DISQUS_CID" description:"Disqus OAuth client ID"` + DisqusCSEC string `long:"disqus-csec" env:"REMARK_DISQUS_CSEC" description:"Disqus OAuth client secret"` AvatarStore string `long:"avatars" env:"AVATAR_STORE" default:"./var/avatars" description:"path to avatars directory"` DefaultAvatar string `long:"avatar-def" env:"AVATAR_DEF" default:"remark.image" description:"default avatar"` @@ -210,6 +212,9 @@ func makeAuthProviders(sessionStore sessions.Store, avatarProxy *auth.AvatarProx if srvOpts.FacebookCID != "" && srvOpts.FacebookCSEC != "" { providers = append(providers, auth.NewFacebook(makeParams(srvOpts.FacebookCID, srvOpts.FacebookCSEC))) } + if srvOpts.DisqusCID != "" && srvOpts.DisqusCSEC != "" { + providers = append(providers, auth.NewDisqus(makeParams(srvOpts.DisqusCID, srvOpts.DisqusCSEC))) + } if len(providers) == 0 { log.Printf("[WARN] no auth providers defined") } diff --git a/app/rest/auth/providers.go b/app/rest/auth/providers.go index b80e37b9..6e14a071 100644 --- a/app/rest/auth/providers.go +++ b/app/rest/auth/providers.go @@ -4,6 +4,7 @@ import ( "encoding/json" "strings" + "golang.org/x/oauth2" "golang.org/x/oauth2/facebook" "golang.org/x/oauth2/github" "golang.org/x/oauth2/google" @@ -98,3 +99,30 @@ func NewFacebook(p Params) Provider { }, }) } + +// NewDisqus makes disqus oauth2 provider. TODO: WIP - seems to need client_id param +func NewDisqus(p Params) Provider { + return initProvider(p, Provider{ + Name: "disqus", + Endpoint: oauth2.Endpoint{ + AuthURL: "https://disqus.com/api/oauth/2.0/authorize/", + TokenURL: "https://disqus.com/api/oauth/2.0/access_token/", + }, + RedirectURL: p.RemarkURL + "/auth/disqus/callback", + Scopes: []string{"read"}, + InfoURL: "https://disqus.com/api/3.0/users/details.json", + Store: p.SessionStore, + MapUser: func(data userData, _ []byte) store.User { + userInfo := store.User{ + ID: "disqus_" + data.value("login"), + Name: data.value("name"), + Picture: data.value("avatar_url"), + Profile: data.value("html_url"), + } + if userInfo.Name == "" { + userInfo.Name = userInfo.ID + } + return userInfo + }, + }) +} diff --git a/docker-compose.yml b/docker-compose.yml index 1eec7968..6b73e428 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -15,15 +15,16 @@ services: max-file: "5" # uncomment to expose directly (no proxy) - # ports: - # - "8080:8080" + ports: + - "80:8080" environment: - - REMARK_URL=https://demo.remark42.com + # - REMARK_URL=https://demo.remark42.com + - REMARK_URL - BOLTDB_PATH=/srv/var/db - BACKUP_PATH=/srv/var/backup - SESSION_STORE=/srv/var/session - - DEV_PASSWD=password # development mode, be careful! + # - DEV_PASSWD=password # development mode, be careful! - DEBUG=true - REMARK_GOOGLE_CID - REMARK_GOOGLE_CSEC @@ -31,6 +32,8 @@ services: - REMARK_GITHUB_CSEC - REMARK_FACEBOOK_CID - REMARK_FACEBOOK_CSEC + - REMARK_DISQUS_CID + - REMARK_DISQUS_CSEC volumes: - ./var:/srv/var - ./web:/srv/web # maps web directory directly to propagate local changes to container without redeploy