Skip to content

Commit a8d1662

Browse files
Merge pull request #390 from supertokens/fix/linkedin-oauth
fix: LinkedIn OAuth
2 parents 86307e3 + 336c9f8 commit a8d1662

File tree

3 files changed

+11
-27
lines changed

3 files changed

+11
-27
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [unreleased]
99

10+
## [0.17.2] - 2023-12-06
11+
12+
- Updates LinkedIn OAuth implementation as per the latest [changes](https://learn.microsoft.com/en-us/linkedin/consumer/integrations/self-serve/sign-in-with-linkedin-v2?context=linkedin%2Fconsumer%2Fcontext#authenticating-members).
1013

1114
## [0.17.1] - 2023-11-24
1215

recipe/thirdparty/providers/linkedin.go

Lines changed: 7 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ func Linkedin(input tpmodels.ProviderInput) *tpmodels.TypeProvider {
3131
}
3232

3333
if len(config.Scope) == 0 {
34-
config.Scope = []string{"r_emailaddress", "r_liteprofile"}
34+
// https://learn.microsoft.com/en-us/linkedin/consumer/integrations/self-serve/sign-in-with-linkedin-v2?context=linkedin%2Fconsumer%2Fcontext#authenticating-members
35+
config.Scope = []string{"openid", "profile", "email"}
3536
}
3637

3738
return config, nil
@@ -47,38 +48,18 @@ func Linkedin(input tpmodels.ProviderInput) *tpmodels.TypeProvider {
4748
"Authorization": "Bearer " + accessToken,
4849
}
4950
rawUserInfoFromProvider := tpmodels.TypeRawUserInfoFromProvider{}
50-
userInfoFromAccessToken, err := doGetRequest("https://api.linkedin.com/v2/me", nil, headers)
51+
// https://learn.microsoft.com/en-us/linkedin/consumer/integrations/self-serve/sign-in-with-linkedin-v2?context=linkedin%2Fconsumer%2Fcontext#sample-api-response
52+
userInfoFromAccessToken, err := doGetRequest("https://api.linkedin.com/v2/userinfo", nil, headers)
5153
if err != nil {
5254
return tpmodels.TypeUserInfo{}, err
5355
}
5456
rawUserInfoFromProvider.FromUserInfoAPI = userInfoFromAccessToken.(map[string]interface{})
5557

56-
emailAPIURL := "https://api.linkedin.com/v2/emailAddress?q=members&projection=(elements*(handle~))"
57-
userInfoFromEmail, err := doGetRequest(emailAPIURL, nil, headers)
58-
if err != nil {
59-
return tpmodels.TypeUserInfo{}, err
60-
}
61-
62-
elements := userInfoFromEmail.(map[string]interface{})["elements"].([]interface{})
63-
for _, elem := range elements {
64-
if elemMap, ok := elem.(map[string]interface{}); ok {
65-
for k, v := range elemMap {
66-
if k == "handle~" {
67-
emailMap := v.(map[string]interface{})
68-
rawUserInfoFromProvider.FromUserInfoAPI["email"] = emailMap["emailAddress"]
69-
}
70-
}
71-
}
72-
}
73-
74-
for k, v := range userInfoFromEmail.(map[string]interface{}) {
75-
rawUserInfoFromProvider.FromUserInfoAPI[k] = v
76-
}
77-
7858
userInfoResult := tpmodels.TypeUserInfo{
79-
ThirdPartyUserId: rawUserInfoFromProvider.FromUserInfoAPI["id"].(string),
59+
ThirdPartyUserId: rawUserInfoFromProvider.FromUserInfoAPI["sub"].(string),
8060
Email: &tpmodels.EmailStruct{
81-
ID: rawUserInfoFromProvider.FromUserInfoAPI["email"].(string),
61+
ID: rawUserInfoFromProvider.FromUserInfoAPI["email"].(string),
62+
IsVerified: rawUserInfoFromProvider.FromUserInfoAPI["email_verified"].(bool),
8263
},
8364
}
8465

supertokens/constants.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ const (
2121
)
2222

2323
// VERSION current version of the lib
24-
const VERSION = "0.17.1"
24+
const VERSION = "0.17.2"
2525

2626
var (
2727
cdiSupported = []string{"3.0"}

0 commit comments

Comments
 (0)