Skip to content

Commit

Permalink
feat: get phone number and country from Google OAuth provider
Browse files Browse the repository at this point in the history
  • Loading branch information
dacongda committed May 22, 2024
1 parent bfcfb56 commit 14c560f
Show file tree
Hide file tree
Showing 27 changed files with 119 additions and 3 deletions.
55 changes: 55 additions & 0 deletions idp/google.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import (
"time"

"github.com/casdoor/casdoor/util"
"github.com/nyaruka/phonenumbers"
"golang.org/x/oauth2"
)

Expand Down Expand Up @@ -130,6 +131,23 @@ type GoogleUserInfo struct {
Locale string `json:"locale"`
}

type GooglePeopleApiPhoneNumberMetaData struct {
Primary bool `json:"primary"`
}

type GooglePeopleApiPhoneNumber struct {
CanonicalForm string `json:"canonicalForm"`
MetaData GooglePeopleApiPhoneNumberMetaData `json:"metadata"`
Value string `json:"value"`
Type string `json:"type"`
}

type GooglePeopleApiResult struct {
PhoneNumbers []GooglePeopleApiPhoneNumber `json:"phoneNumbers"`
Etag string `json:"etag"`
ResourceName string `json:"resourceName"`
}

func (idp *GoogleIdProvider) GetUserInfo(token *oauth2.Token) (*UserInfo, error) {
if strings.HasPrefix(token.AccessToken, GoogleIdTokenKey) {
googleIdToken, ok := token.Extra(GoogleIdTokenKey).(GoogleIdToken)
Expand Down Expand Up @@ -167,12 +185,49 @@ func (idp *GoogleIdProvider) GetUserInfo(token *oauth2.Token) (*UserInfo, error)
return nil, errors.New("google email is empty")
}

url = fmt.Sprintf("https://people.googleapis.com/v1/people/me?personFields=phoneNumbers&access_token=%s", token.AccessToken)
resp, err = idp.Client.Get(url)
if err != nil {
return nil, err
}

defer resp.Body.Close()
body, err = io.ReadAll(resp.Body)
if err != nil {
return nil, err
}

var googlePeopleResult GooglePeopleApiResult
err = json.Unmarshal(body, &googlePeopleResult)
if err != nil {
return nil, err
}

var phoneNumber string
var countryCode string
if len(googlePeopleResult.PhoneNumbers) != 0 {
for _, phoneData := range googlePeopleResult.PhoneNumbers {
if phoneData.MetaData.Primary {
phoneNumber = phoneData.CanonicalForm
break
}
}
phoneNumberParsed, err := phonenumbers.Parse(phoneNumber, "")
if err != nil {
return nil, err
}
countryCode = phonenumbers.GetRegionCodeForNumber(phoneNumberParsed)
phoneNumber = fmt.Sprintf("%d", phoneNumberParsed.GetNationalNumber())
}

userInfo := UserInfo{
Id: googleUserInfo.Id,
Username: googleUserInfo.Email,
DisplayName: googleUserInfo.Name,
Email: googleUserInfo.Email,
AvatarUrl: googleUserInfo.Picture,
Phone: phoneNumber,
CountryCode: countryCode,
}
return &userInfo, nil
}
2 changes: 1 addition & 1 deletion object/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ type Provider struct {

Host string `xorm:"varchar(100)" json:"host"`
Port int `json:"port"`
DisableSsl bool `json:"disableSsl"` // If the provider type is WeChat, DisableSsl means EnableQRCode
DisableSsl bool `json:"disableSsl"` // If the provider type is WeChat, DisableSsl means EnableQRCode, if type is Google, it means sync phone number
Title string `xorm:"varchar(100)" json:"title"`
Content string `xorm:"varchar(2000)" json:"content"` // If provider type is WeChat, Content means QRCode string by Base64 encoding
Receiver string `xorm:"varchar(100)" json:"receiver"`
Expand Down
14 changes: 14 additions & 0 deletions web/src/ProviderEditPage.js
Original file line number Diff line number Diff line change
Expand Up @@ -832,6 +832,20 @@ class ProviderEditPage extends React.Component {
</React.Fragment>
)
}
{
this.state.provider.type !== "Google" ? null : (
<Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{Setting.getLabel(i18next.t("provider:Get phone number"), i18next.t("provider:Get phone number - Tooltip"))} :
</Col>
<Col span={1} >
<Switch disabled={!this.state.provider.clientId} checked={this.state.provider.disableSsl} onChange={checked => {
this.updateProviderField("disableSsl", checked);
}} />
</Col>
</Row>
)
}
{
this.state.provider.type !== "ADFS" && this.state.provider.type !== "AzureAD" && this.state.provider.type !== "AzureADB2C" && this.state.provider.type !== "Casdoor" && this.state.provider.type !== "Okta" ? null : (
<Row style={{marginTop: "20px"}} >
Expand Down
5 changes: 3 additions & 2 deletions web/src/auth/Provider.js
Original file line number Diff line number Diff line change
Expand Up @@ -384,8 +384,7 @@ export function getAuthUrl(application, provider, method, code) {

let endpoint = authInfo[provider.type].endpoint;
let redirectUri = `${window.location.origin}/callback`;
const scope = authInfo[provider.type].scope;

let scope = authInfo[provider.type].scope;
const isShortState = (provider.type === "WeChat" && navigator.userAgent.includes("MicroMessenger")) || (provider.type === "Twitter");
const state = Util.getStateFromQueryParams(application.name, provider.name, method, isShortState);
const codeChallenge = "P3S-a7dr8bgM4bF6vOyiKkKETDl16rcAzao9F8UIL1Y"; // SHA256(Base64-URL-encode("casdoor-verifier"))
Expand All @@ -396,6 +395,8 @@ export function getAuthUrl(application, provider, method, code) {
}
} else if (provider.type === "Apple") {
redirectUri = `${window.location.origin}/api/callback`;
} else if (provider.type === "Google" && provider.disableSsl) {
scope += "+https://www.googleapis.com/auth/user.phonenumbers.read";
}

if (provider.type === "Google" || provider.type === "GitHub" || provider.type === "QQ" || provider.type === "Facebook"
Expand Down
2 changes: 2 additions & 0 deletions web/src/locales/ar/data.json
Original file line number Diff line number Diff line change
Expand Up @@ -778,6 +778,8 @@
"From address - Tooltip": "Email address of \"From\"",
"From name": "From name",
"From name - Tooltip": "Name of \"From\"",
"Get phone number": "Get phone number",
"Get phone number - Tooltip": "Get phone number - Tooltip",
"Host": "Host",
"Host - Tooltip": "Name of host",
"IdP": "IdP",
Expand Down
2 changes: 2 additions & 0 deletions web/src/locales/de/data.json
Original file line number Diff line number Diff line change
Expand Up @@ -778,6 +778,8 @@
"From address - Tooltip": "From address - Tooltip",
"From name": "From name",
"From name - Tooltip": "From name - Tooltip",
"Get phone number": "Get phone number",
"Get phone number - Tooltip": "Get phone number - Tooltip",
"Host": "Host",
"Host - Tooltip": "Name des Hosts",
"IdP": "IdP",
Expand Down
2 changes: 2 additions & 0 deletions web/src/locales/en/data.json
Original file line number Diff line number Diff line change
Expand Up @@ -778,6 +778,8 @@
"From address - Tooltip": "Email address of \"From\"",
"From name": "From name",
"From name - Tooltip": "Name of \"From\"",
"Get phone number": "Get phone number",
"Get phone number - Tooltip": "If sync phone number is enabled, you should enable google people api first and add scope https://www.googleapis.com/auth/user.phonenumbers.read",
"Host": "Host",
"Host - Tooltip": "Name of host",
"IdP": "IdP",
Expand Down
2 changes: 2 additions & 0 deletions web/src/locales/es/data.json
Original file line number Diff line number Diff line change
Expand Up @@ -778,6 +778,8 @@
"From address - Tooltip": "From address - Tooltip",
"From name": "From name",
"From name - Tooltip": "From name - Tooltip",
"Get phone number": "Get phone number",
"Get phone number - Tooltip": "Get phone number - Tooltip",
"Host": "Anfitrión",
"Host - Tooltip": "Nombre del anfitrión",
"IdP": "IdP = Proveedor de Identidad",
Expand Down
2 changes: 2 additions & 0 deletions web/src/locales/fa/data.json
Original file line number Diff line number Diff line change
Expand Up @@ -778,6 +778,8 @@
"From address - Tooltip": "Email address of \"From\"",
"From name": "From name",
"From name - Tooltip": "Name of \"From\"",
"Get phone number": "Get phone number",
"Get phone number - Tooltip": "Get phone number - Tooltip",
"Host": "Host",
"Host - Tooltip": "Name of host",
"IdP": "IdP",
Expand Down
2 changes: 2 additions & 0 deletions web/src/locales/fi/data.json
Original file line number Diff line number Diff line change
Expand Up @@ -778,6 +778,8 @@
"From address - Tooltip": "Email address of \"From\"",
"From name": "From name",
"From name - Tooltip": "Name of \"From\"",
"Get phone number": "Get phone number",
"Get phone number - Tooltip": "Get phone number - Tooltip",
"Host": "Host",
"Host - Tooltip": "Name of host",
"IdP": "IdP",
Expand Down
2 changes: 2 additions & 0 deletions web/src/locales/fr/data.json
Original file line number Diff line number Diff line change
Expand Up @@ -778,6 +778,8 @@
"From address - Tooltip": "L'adresse e-mail affichée comme expéditeur dans les e-mails envoyés",
"From name": "Nom de l'expéditeur",
"From name - Tooltip": "Le nom affiché comme expéditeur dans les e-mails envoyés",
"Get phone number": "Get phone number",
"Get phone number - Tooltip": "Get phone number - Tooltip",
"Host": "Hôte",
"Host - Tooltip": "Nom d'hôte",
"IdP": "IdP (Identité Fournisseur)",
Expand Down
2 changes: 2 additions & 0 deletions web/src/locales/he/data.json
Original file line number Diff line number Diff line change
Expand Up @@ -778,6 +778,8 @@
"From address - Tooltip": "Email address of \"From\"",
"From name": "From name",
"From name - Tooltip": "Name of \"From\"",
"Get phone number": "Get phone number",
"Get phone number - Tooltip": "Get phone number - Tooltip",
"Host": "Host",
"Host - Tooltip": "Name of host",
"IdP": "IdP",
Expand Down
2 changes: 2 additions & 0 deletions web/src/locales/id/data.json
Original file line number Diff line number Diff line change
Expand Up @@ -778,6 +778,8 @@
"From address - Tooltip": "From address - Tooltip",
"From name": "From name",
"From name - Tooltip": "From name - Tooltip",
"Get phone number": "Get phone number",
"Get phone number - Tooltip": "Get phone number - Tooltip",
"Host": "Tuan rumah",
"Host - Tooltip": "Nama tuan rumah",
"IdP": "IdP",
Expand Down
2 changes: 2 additions & 0 deletions web/src/locales/it/data.json
Original file line number Diff line number Diff line change
Expand Up @@ -778,6 +778,8 @@
"From address - Tooltip": "Email address of \"From\"",
"From name": "From name",
"From name - Tooltip": "Name of \"From\"",
"Get phone number": "Get phone number",
"Get phone number - Tooltip": "Get phone number - Tooltip",
"Host": "Host",
"Host - Tooltip": "Name of host",
"IdP": "IdP",
Expand Down
2 changes: 2 additions & 0 deletions web/src/locales/ja/data.json
Original file line number Diff line number Diff line change
Expand Up @@ -778,6 +778,8 @@
"From address - Tooltip": "From address - Tooltip",
"From name": "From name",
"From name - Tooltip": "From name - Tooltip",
"Get phone number": "Get phone number",
"Get phone number - Tooltip": "Get phone number - Tooltip",
"Host": "ホスト",
"Host - Tooltip": "ホストの名前",
"IdP": "IdP",
Expand Down
2 changes: 2 additions & 0 deletions web/src/locales/kk/data.json
Original file line number Diff line number Diff line change
Expand Up @@ -778,6 +778,8 @@
"From address - Tooltip": "Email address of \"From\"",
"From name": "From name",
"From name - Tooltip": "Name of \"From\"",
"Get phone number": "Get phone number",
"Get phone number - Tooltip": "Get phone number - Tooltip",
"Host": "Host",
"Host - Tooltip": "Name of host",
"IdP": "IdP",
Expand Down
2 changes: 2 additions & 0 deletions web/src/locales/ko/data.json
Original file line number Diff line number Diff line change
Expand Up @@ -778,6 +778,8 @@
"From address - Tooltip": "From address - Tooltip",
"From name": "From name",
"From name - Tooltip": "From name - Tooltip",
"Get phone number": "Get phone number",
"Get phone number - Tooltip": "Get phone number - Tooltip",
"Host": "호스트",
"Host - Tooltip": "호스트의 이름",
"IdP": "IdP",
Expand Down
2 changes: 2 additions & 0 deletions web/src/locales/ms/data.json
Original file line number Diff line number Diff line change
Expand Up @@ -778,6 +778,8 @@
"From address - Tooltip": "Email address of \"From\"",
"From name": "From name",
"From name - Tooltip": "Name of \"From\"",
"Get phone number": "Get phone number",
"Get phone number - Tooltip": "Get phone number - Tooltip",
"Host": "Host",
"Host - Tooltip": "Name of host",
"IdP": "IdP",
Expand Down
2 changes: 2 additions & 0 deletions web/src/locales/nl/data.json
Original file line number Diff line number Diff line change
Expand Up @@ -778,6 +778,8 @@
"From address - Tooltip": "Email address of \"From\"",
"From name": "From name",
"From name - Tooltip": "Name of \"From\"",
"Get phone number": "Get phone number",
"Get phone number - Tooltip": "Get phone number - Tooltip",
"Host": "Host",
"Host - Tooltip": "Name of host",
"IdP": "IdP",
Expand Down
2 changes: 2 additions & 0 deletions web/src/locales/pl/data.json
Original file line number Diff line number Diff line change
Expand Up @@ -778,6 +778,8 @@
"From address - Tooltip": "Email address of \"From\"",
"From name": "From name",
"From name - Tooltip": "Name of \"From\"",
"Get phone number": "Get phone number",
"Get phone number - Tooltip": "Get phone number - Tooltip",
"Host": "Host",
"Host - Tooltip": "Name of host",
"IdP": "IdP",
Expand Down
2 changes: 2 additions & 0 deletions web/src/locales/pt/data.json
Original file line number Diff line number Diff line change
Expand Up @@ -778,6 +778,8 @@
"From address - Tooltip": "Endereço de e-mail do remetente",
"From name": "Nome do remetente",
"From name - Tooltip": "Nome do remetente",
"Get phone number": "Get phone number",
"Get phone number - Tooltip": "Get phone number - Tooltip",
"Host": "Host",
"Host - Tooltip": "Nome do host",
"IdP": "IdP",
Expand Down
2 changes: 2 additions & 0 deletions web/src/locales/ru/data.json
Original file line number Diff line number Diff line change
Expand Up @@ -778,6 +778,8 @@
"From address - Tooltip": "From address - Tooltip",
"From name": "From name",
"From name - Tooltip": "From name - Tooltip",
"Get phone number": "Get phone number",
"Get phone number - Tooltip": "Get phone number - Tooltip",
"Host": "Хост",
"Host - Tooltip": "Имя хоста",
"IdP": "ИдП",
Expand Down
2 changes: 2 additions & 0 deletions web/src/locales/sv/data.json
Original file line number Diff line number Diff line change
Expand Up @@ -778,6 +778,8 @@
"From address - Tooltip": "Email address of \"From\"",
"From name": "From name",
"From name - Tooltip": "Name of \"From\"",
"Get phone number": "Get phone number",
"Get phone number - Tooltip": "Get phone number - Tooltip",
"Host": "Host",
"Host - Tooltip": "Name of host",
"IdP": "IdP",
Expand Down
2 changes: 2 additions & 0 deletions web/src/locales/tr/data.json
Original file line number Diff line number Diff line change
Expand Up @@ -778,6 +778,8 @@
"From address - Tooltip": "Email address of \"From\"",
"From name": "From name",
"From name - Tooltip": "Name of \"From\"",
"Get phone number": "Get phone number",
"Get phone number - Tooltip": "Get phone number - Tooltip",
"Host": "Host",
"Host - Tooltip": "Name of host",
"IdP": "IdP",
Expand Down
2 changes: 2 additions & 0 deletions web/src/locales/uk/data.json
Original file line number Diff line number Diff line change
Expand Up @@ -778,6 +778,8 @@
"From address - Tooltip": "Електронна адреса \"Від\"",
"From name": "Від імені",
"From name - Tooltip": "Назва \"Від\"",
"Get phone number": "Get phone number",
"Get phone number - Tooltip": "Get phone number - Tooltip",
"Host": "Хост",
"Host - Tooltip": "Ім'я хоста",
"IdP": "IDP",
Expand Down
2 changes: 2 additions & 0 deletions web/src/locales/vi/data.json
Original file line number Diff line number Diff line change
Expand Up @@ -778,6 +778,8 @@
"From address - Tooltip": "From address - Tooltip",
"From name": "From name",
"From name - Tooltip": "From name - Tooltip",
"Get phone number": "Get phone number",
"Get phone number - Tooltip": "Get phone number - Tooltip",
"Host": "Chủ nhà",
"Host - Tooltip": "Tên của người chủ chỗ ở",
"IdP": "IdP",
Expand Down
2 changes: 2 additions & 0 deletions web/src/locales/zh/data.json
Original file line number Diff line number Diff line change
Expand Up @@ -778,6 +778,8 @@
"From address - Tooltip": "邮件里发件人的邮箱地址",
"From name": "发件人名称",
"From name - Tooltip": "邮件里发件人的显示名称",
"Get phone number": "获取手机号码",
"Get phone number - Tooltip": "如果启用获取手机号码,你需要先启用peopleApi并添加范围https://www.googleapis.com/auth/user.phonenumbers.read",
"Host": "主机",
"Host - Tooltip": "主机名",
"IdP": "身份提供商",
Expand Down

0 comments on commit 14c560f

Please sign in to comment.