github.com/ngocphuongnb/tetua@v0.0.7-alpha/packages/auth/twitter.go (about) 1 package auth 2 3 import ( 4 "encoding/json" 5 "errors" 6 "io/ioutil" 7 8 "github.com/dghubble/oauth1" 9 "github.com/dghubble/oauth1/twitter" 10 "github.com/ngocphuongnb/tetua/app/auth" 11 "github.com/ngocphuongnb/tetua/app/config" 12 "github.com/ngocphuongnb/tetua/app/entities" 13 "github.com/ngocphuongnb/tetua/app/server" 14 "github.com/ngocphuongnb/tetua/app/utils" 15 ) 16 17 const oauthTwitterUrlAPI = "https://api.twitter.com/1.1/account/verify_credentials.json" 18 19 type TwitterUserResponse struct { 20 ID int `json:"id"` 21 IDStr string `json:"id_str"` 22 Name string `json:"name"` 23 ScreenName string `json:"screen_name"` 24 Email string `json:"email"` 25 ProfileImageUrlHttps string `json:"profile_image_url_https"` 26 } 27 28 type TwitterAuthProvider struct { 29 config *oauth1.Config 30 } 31 32 func NewTwitter(cfg map[string]string) server.AuthProvider { 33 if cfg["consumer_key"] == "" || cfg["consumer_secret"] == "" { 34 panic("Github client id or secret is not set") 35 } 36 37 return &TwitterAuthProvider{ 38 config: &oauth1.Config{ 39 ConsumerKey: cfg["consumer_key"], 40 ConsumerSecret: cfg["consumer_secret"], 41 CallbackURL: utils.Url("/auth/twitter/callback"), 42 Endpoint: twitter.AuthorizeEndpoint, 43 }, 44 } 45 } 46 47 func (g *TwitterAuthProvider) Name() string { 48 return "twitter" 49 } 50 51 func (g *TwitterAuthProvider) Login(c server.Context) error { 52 requestToken, _, err := g.config.RequestToken() 53 url, err := g.config.AuthorizationURL(requestToken) 54 55 if err != nil { 56 return err 57 } 58 59 return c.Redirect(url.String()) 60 } 61 62 func (g *TwitterAuthProvider) Callback(c server.Context) (u *entities.User, err error) { 63 requestToken := c.Query("oauth_token") 64 verifier := c.Query("oauth_verifier") 65 66 if requestToken == "" || verifier == "" { 67 return nil, errors.New("oauth1: Request missing oauth_token or oauth_verifier") 68 } 69 70 accessToken, accessSecret, err := g.config.AccessToken(requestToken, "", verifier) 71 72 if err != nil { 73 return nil, err 74 } 75 76 token := oauth1.NewToken(accessToken, accessSecret) 77 httpClient := g.config.Client(oauth1.NoContext, token) 78 resp, err := httpClient.Get(oauthTwitterUrlAPI) 79 80 if err != nil { 81 return nil, err 82 } 83 84 defer resp.Body.Close() 85 86 body, err := ioutil.ReadAll(resp.Body) 87 88 if err != nil { 89 return nil, err 90 } 91 92 userResponse := &TwitterUserResponse{} 93 if err := json.Unmarshal(body, userResponse); err != nil { 94 return nil, err 95 } 96 97 return &entities.User{ 98 Provider: "twitter", 99 ProviderID: utils.SanitizePlainText(userResponse.IDStr), 100 Username: utils.SanitizePlainText(userResponse.ScreenName), 101 Email: utils.SanitizePlainText(userResponse.Email), 102 ProviderAvatar: utils.SanitizePlainText(userResponse.ProfileImageUrlHttps), 103 DisplayName: utils.SanitizePlainText(userResponse.Name), 104 URL: utils.SanitizePlainText(""), 105 ProviderUsername: utils.SanitizePlainText(userResponse.ScreenName), 106 RoleIDs: []int{auth.ROLE_USER.ID}, 107 Active: config.Setting("auto_approve_user") == "yes", 108 }, nil 109 }