Skip to content

Commit 885a147

Browse files
authored
Merge pull request #409 from authorizerdev/fix/use-login-signup-for-mobile
feat: unify email & mobile singup + login
2 parents 4d1fcc3 + 9a6f1a6 commit 885a147

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+429
-286
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ test-all-db:
4646
docker run -d --name dynamodb-local-test -p 8000:8000 amazon/dynamodb-local:latest
4747
docker run -d --name couchbase-local-test -p 8091-8097:8091-8097 -p 11210:11210 -p 11207:11207 -p 18091-18095:18091-18095 -p 18096:18096 -p 18097:18097 couchbase:latest
4848
sh scripts/couchbase-test.sh
49-
cd server && go clean --testcache && TEST_DBS="sqlite,mongodb,arangodb,scylladb,dynamodb" go test -p 1 -v ./test
49+
cd server && go clean --testcache && TEST_DBS="sqlite,mongodb,arangodb,scylladb,dynamodb,couchbase" go test -p 1 -v ./test
5050
docker rm -vf authorizer_scylla_db
5151
docker rm -vf authorizer_mongodb_db
5252
docker rm -vf authorizer_arangodb

server/db/models/user.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ type User struct {
1515
Key string `json:"_key,omitempty" bson:"_key,omitempty" cql:"_key,omitempty" dynamo:"key,omitempty"` // for arangodb
1616
ID string `gorm:"primaryKey;type:char(36)" json:"_id" bson:"_id" cql:"id" dynamo:"id,hash"`
1717

18-
Email string `gorm:"unique" json:"email" bson:"email" cql:"email" dynamo:"email" index:"email,hash"`
18+
Email *string `gorm:"unique" json:"email" bson:"email" cql:"email" dynamo:"email" index:"email,hash"`
1919
EmailVerifiedAt *int64 `json:"email_verified_at" bson:"email_verified_at" cql:"email_verified_at" dynamo:"email_verified_at"`
2020
Password *string `json:"password" bson:"password" cql:"password" dynamo:"password"`
2121
SignupMethods string `json:"signup_methods" bson:"signup_methods" cql:"signup_methods" dynamo:"signup_methods"`
@@ -54,7 +54,7 @@ func (user *User) AsAPIUser() *model.User {
5454
FamilyName: user.FamilyName,
5555
MiddleName: user.MiddleName,
5656
Nickname: user.Nickname,
57-
PreferredUsername: refs.NewStringRef(user.Email),
57+
PreferredUsername: user.Email,
5858
Gender: user.Gender,
5959
Birthdate: user.Birthdate,
6060
PhoneNumber: user.PhoneNumber,

server/db/providers/couchbase/user.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ func (p *provider) DeleteUser(ctx context.Context, user *models.User) error {
6969
func (p *provider) ListUsers(ctx context.Context, pagination *model.Pagination) (*model.Users, error) {
7070
users := []*model.User{}
7171
paginationClone := pagination
72-
userQuery := fmt.Sprintf("SELECT _id, email, email_verified_at, `password`, signup_methods, given_name, family_name, middle_name, nickname, birthdate, phone_number, phone_number_verified_at, picture, roles, revoked_timestamp, is_multi_factor_auth_enabled, created_at, updated_at FROM %s.%s ORDER BY id OFFSET $1 LIMIT $2", p.scopeName, models.Collections.User)
72+
userQuery := fmt.Sprintf("SELECT _id, email, email_verified_at, `password`, signup_methods, given_name, family_name, middle_name, nickname, birthdate, phone_number, phone_number_verified_at, picture, roles, revoked_timestamp, is_multi_factor_auth_enabled, app_data, created_at, updated_at FROM %s.%s ORDER BY id OFFSET $1 LIMIT $2", p.scopeName, models.Collections.User)
7373
queryResult, err := p.db.Query(userQuery, &gocb.QueryOptions{
7474
ScanConsistency: gocb.QueryScanConsistencyRequestPlus,
7575
Context: ctx,
@@ -103,7 +103,7 @@ func (p *provider) ListUsers(ctx context.Context, pagination *model.Pagination)
103103
// GetUserByEmail to get user information from database using email address
104104
func (p *provider) GetUserByEmail(ctx context.Context, email string) (*models.User, error) {
105105
var user *models.User
106-
query := fmt.Sprintf("SELECT _id, email, email_verified_at, `password`, signup_methods, given_name, family_name, middle_name, nickname, birthdate, phone_number, phone_number_verified_at, picture, roles, revoked_timestamp, is_multi_factor_auth_enabled, created_at, updated_at FROM %s.%s WHERE email = $1 LIMIT 1", p.scopeName, models.Collections.User)
106+
query := fmt.Sprintf("SELECT _id, email, email_verified_at, `password`, signup_methods, given_name, family_name, middle_name, nickname, birthdate, phone_number, phone_number_verified_at, picture, roles, revoked_timestamp, is_multi_factor_auth_enabled, app_data, created_at, updated_at FROM %s.%s WHERE email = $1 LIMIT 1", p.scopeName, models.Collections.User)
107107
q, err := p.db.Query(query, &gocb.QueryOptions{
108108
ScanConsistency: gocb.QueryScanConsistencyRequestPlus,
109109
Context: ctx,
@@ -122,7 +122,7 @@ func (p *provider) GetUserByEmail(ctx context.Context, email string) (*models.Us
122122
// GetUserByID to get user information from database using user ID
123123
func (p *provider) GetUserByID(ctx context.Context, id string) (*models.User, error) {
124124
var user *models.User
125-
query := fmt.Sprintf("SELECT _id, email, email_verified_at, `password`, signup_methods, given_name, family_name, middle_name, nickname, birthdate, phone_number, phone_number_verified_at, picture, roles, revoked_timestamp, is_multi_factor_auth_enabled, created_at, updated_at FROM %s.%s WHERE _id = $1 LIMIT 1", p.scopeName, models.Collections.User)
125+
query := fmt.Sprintf("SELECT _id, email, email_verified_at, `password`, signup_methods, given_name, family_name, middle_name, nickname, birthdate, phone_number, phone_number_verified_at, picture, roles, revoked_timestamp, is_multi_factor_auth_enabled, app_data, created_at, updated_at FROM %s.%s WHERE _id = $1 LIMIT 1", p.scopeName, models.Collections.User)
126126
q, err := p.db.Query(query, &gocb.QueryOptions{
127127
ScanConsistency: gocb.QueryScanConsistencyRequestPlus,
128128
Context: ctx,
@@ -175,7 +175,7 @@ func (p *provider) UpdateUsers(ctx context.Context, data map[string]interface{},
175175
// GetUserByPhoneNumber to get user information from database using phone number
176176
func (p *provider) GetUserByPhoneNumber(ctx context.Context, phoneNumber string) (*models.User, error) {
177177
var user *models.User
178-
query := fmt.Sprintf("SELECT _id, email, email_verified_at, `password`, signup_methods, given_name, family_name, middle_name, nickname, birthdate, phone_number, phone_number_verified_at, picture, roles, revoked_timestamp, is_multi_factor_auth_enabled, created_at, updated_at FROM %s.%s WHERE phone_number = $1 LIMIT 1", p.scopeName, models.Collections.User)
178+
query := fmt.Sprintf("SELECT _id, email, email_verified_at, `password`, signup_methods, given_name, family_name, middle_name, nickname, birthdate, phone_number, phone_number_verified_at, picture, roles, revoked_timestamp, is_multi_factor_auth_enabled, app_data, created_at, updated_at FROM %s.%s WHERE phone_number = $1 LIMIT 1", p.scopeName, models.Collections.User)
179179
q, err := p.db.Query(query, &gocb.QueryOptions{
180180
ScanConsistency: gocb.QueryScanConsistencyRequestPlus,
181181
Context: ctx,

server/db/providers/dynamodb/user.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ func (p *provider) GetUserByID(ctx context.Context, id string) (*models.User, er
136136
var user *models.User
137137
err := collection.Get("id", id).OneWithContext(ctx, &user)
138138
if err != nil {
139-
if user.Email == "" {
139+
if refs.StringValue(user.Email) == "" {
140140
return user, errors.New("no documets found")
141141
} else {
142142
return user, nil

server/db/providers/mongodb/provider.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,16 +47,13 @@ func NewProvider() (*provider, error) {
4747
Keys: bson.M{"email": 1},
4848
Options: options.Index().SetUnique(true).SetSparse(true),
4949
},
50-
}, options.CreateIndexes())
51-
userCollection.Indexes().CreateMany(ctx, []mongo.IndexModel{
5250
{
5351
Keys: bson.M{"phone_number": 1},
5452
Options: options.Index().SetUnique(true).SetSparse(true).SetPartialFilterExpression(map[string]interface{}{
5553
"phone_number": map[string]string{"$type": "string"},
5654
}),
5755
},
5856
}, options.CreateIndexes())
59-
6057
mongodb.CreateCollection(ctx, models.Collections.VerificationRequest, options.CreateCollection())
6158
verificationRequestCollection := mongodb.Collection(models.Collections.VerificationRequest, options.Collection())
6259
verificationRequestCollection.Indexes().CreateMany(ctx, []mongo.IndexModel{

server/graph/generated/generated.go

Lines changed: 23 additions & 14 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

server/graph/model/models_gen.go

Lines changed: 8 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

server/graph/schema.graphqls

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ type Meta {
3232

3333
type User {
3434
id: ID!
35-
email: String!
35+
# email or phone_number is always present
36+
email: String
3637
email_verified: Boolean!
3738
signup_methods: String!
3839
given_name: String
@@ -306,6 +307,7 @@ input AdminSignupInput {
306307
admin_secret: String!
307308
}
308309

310+
# Deprecated from v1.2.0
309311
input MobileSignUpInput {
310312
email: String
311313
given_name: String
@@ -330,7 +332,7 @@ input MobileSignUpInput {
330332
}
331333

332334
input SignUpInput {
333-
email: String!
335+
email: String
334336
given_name: String
335337
family_name: String
336338
middle_name: String
@@ -353,7 +355,8 @@ input SignUpInput {
353355
}
354356

355357
input LoginInput {
356-
email: String!
358+
email: String
359+
phone_number: String
357360
password: String!
358361
roles: [String!]
359362
scope: [String!]
@@ -363,6 +366,7 @@ input LoginInput {
363366
state: String
364367
}
365368

369+
# Deprecated from v1.2.0
366370
input MobileLoginInput {
367371
phone_number: String!
368372
password: String!
@@ -574,8 +578,10 @@ input GetUserRequest {
574578

575579
type Mutation {
576580
signup(params: SignUpInput!): AuthResponse!
581+
# Deprecated from v1.2.0
577582
mobile_signup(params: MobileSignUpInput): AuthResponse!
578583
login(params: LoginInput!): AuthResponse!
584+
# Deprecated from v1.2.0
579585
mobile_login(params: MobileLoginInput!): AuthResponse!
580586
magic_link_login(params: MagicLinkLoginInput!): Response!
581587
logout: Response!

server/handlers/oauth_callback.go

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"github.com/authorizerdev/authorizer/server/db/models"
2424
"github.com/authorizerdev/authorizer/server/memorystore"
2525
"github.com/authorizerdev/authorizer/server/oauth"
26+
"github.com/authorizerdev/authorizer/server/refs"
2627
"github.com/authorizerdev/authorizer/server/token"
2728
"github.com/authorizerdev/authorizer/server/utils"
2829
)
@@ -85,7 +86,7 @@ func OAuthCallbackHandler() gin.HandlerFunc {
8586
return
8687
}
8788

88-
existingUser, err := db.Provider.GetUserByEmail(ctx, user.Email)
89+
existingUser, err := db.Provider.GetUserByEmail(ctx, refs.StringValue(user.Email))
8990
log := log.WithField("user", user.Email)
9091
isSignUp := false
9192

@@ -415,7 +416,7 @@ func processGithubUserInfo(ctx context.Context, code string) (*models.User, erro
415416
GivenName: &firstName,
416417
FamilyName: &lastName,
417418
Picture: &picture,
418-
Email: email,
419+
Email: &email,
419420
}
420421

421422
return user, nil
@@ -466,7 +467,7 @@ func processFacebookUserInfo(ctx context.Context, code string) (*models.User, er
466467
GivenName: &firstName,
467468
FamilyName: &lastName,
468469
Picture: &picture,
469-
Email: email,
470+
Email: &email,
470471
}
471472

472473
return user, nil
@@ -548,7 +549,7 @@ func processLinkedInUserInfo(ctx context.Context, code string) (*models.User, er
548549
GivenName: &firstName,
549550
FamilyName: &lastName,
550551
Picture: &profilePicture,
551-
Email: emailAddress,
552+
Email: &emailAddress,
552553
}
553554

554555
return user, nil
@@ -588,7 +589,8 @@ func processAppleUserInfo(ctx context.Context, code string) (*models.User, error
588589
log.Debug("Failed to extract email from claims.")
589590
return user, fmt.Errorf("unable to extract email, please check the scopes enabled for your app. It needs `email`, `name` scopes")
590591
} else {
591-
user.Email = val.(string)
592+
email := val.(string)
593+
user.Email = &email
592594
}
593595

594596
if val, ok := claims["name"]; ok {

0 commit comments

Comments
 (0)