Commit d864513b authored by Andrei Mihu's avatar Andrei Mihu
Browse files

Use the Facebook Graph API v11.0 version.

parent 8e610ae8
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -4,7 +4,8 @@ All notable changes to this project are documented below.
The format is based on [keep a changelog](http://keepachangelog.com) and this project uses [semantic versioning](http://semver.org).

## [Unreleased]

### Changed
- Use the Facebook Graph API v11.0 version.

## [3.5.0] - 2021-08-10
### Added
+1 −1
Original line number Diff line number Diff line
@@ -449,7 +449,7 @@ func AuthenticateFacebook(ctx context.Context, logger *zap.Logger, db *sql.DB, c
	// Create a new account.
	userID := uuid.Must(uuid.NewV4()).String()
	query = "INSERT INTO users (id, username, display_name, email, avatar_url, facebook_id, create_time, update_time) VALUES ($1, $2, $3, $4, $5, $6, now(), now())"
	result, err := db.ExecContext(ctx, query, userID, username, facebookProfile.Name, facebookProfile.Email, facebookProfile.Picture, facebookProfile.ID)
	result, err := db.ExecContext(ctx, query, userID, username, facebookProfile.Name, facebookProfile.Email, facebookProfile.Picture.Data.Url, facebookProfile.ID)
	if err != nil {
		var pgErr *pgconn.PgError
		if errors.As(err, &pgErr) && pgErr.Code == dbErrorUniqueViolation {
+1 −1
Original line number Diff line number Diff line
@@ -213,7 +213,7 @@ AND (NOT EXISTS
     FROM users
     WHERE facebook_id = $2 AND NOT id = $1))`,
		userID,
		facebookProfile.ID, facebookProfile.Name, facebookProfile.Email, facebookProfile.Picture)
		facebookProfile.ID, facebookProfile.Name, facebookProfile.Email, facebookProfile.Picture.Data.Url)

	if err != nil {
		logger.Error("Could not link Facebook ID.", zap.Error(err), zap.Any("input", token))
+19 −8
Original line number Diff line number Diff line
@@ -86,7 +86,18 @@ type FacebookProfile struct {
	ID      string              `json:"id"`
	Name    string              `json:"name"`
	Email   string              `json:"email"`
	Picture string `json:"picture"`
	Picture FacebookPictureData `json:"picture"`
}

type FacebookPictureData struct {
	Data FacebookPicture `json:"data"`
}

type FacebookPicture struct {
	Height       int    `json:"height"`
	Width        int    `json:"width"`
	IsSilhouette bool   `json:"is_silhouette"`
	Url          string `json:"url"`
}

type facebookPagingCursors struct {
@@ -166,8 +177,8 @@ func NewClient(logger *zap.Logger, timeout time.Duration) *Client {
func (c *Client) GetFacebookProfile(ctx context.Context, accessToken string) (*FacebookProfile, error) {
	c.logger.Debug("Getting Facebook profile", zap.String("token", accessToken))

	path := "https://graph.facebook.com/v9.0/me?access_token=" + url.QueryEscape(accessToken) +
		"&fields=" + url.QueryEscape("name,email")
	path := "https://graph.facebook.com/v11.0/me?access_token=" + url.QueryEscape(accessToken) +
		"&fields=" + url.QueryEscape("id,name,email,picture")
	var profile FacebookProfile
	err := c.request(ctx, "facebook profile", path, nil, &profile)
	if err != nil {
@@ -185,7 +196,7 @@ func (c *Client) GetFacebookFriends(ctx context.Context, accessToken string) ([]
	after := ""
	for {
		// In FB Graph API 2.0+ this only returns friends that also use the same app.
		path := "https://graph.facebook.com/v9.0/me/friends?access_token=" + url.QueryEscape(accessToken)
		path := "https://graph.facebook.com/v11.0/me/friends?access_token=" + url.QueryEscape(accessToken)
		if after != "" {
			path += "&after=" + after
		}
@@ -807,7 +818,7 @@ func (c *Client) CheckFacebookLimitedLoginToken(ctx context.Context, appId strin
		}
	}
	if v, ok := claims["picture"]; ok {
		if profile.Picture, ok = v.(string); !ok {
		if profile.Picture.Data.Url, ok = v.(string); !ok {
			return nil, errors.New("facebook limited login token picture field invalid")
		}
	}