Skip to content

Commit

Permalink
move authenticate handler to users
Browse files Browse the repository at this point in the history
  • Loading branch information
John-Lin committed Jul 27, 2018
1 parent 0961d54 commit 683d8ca
Show file tree
Hide file tree
Showing 14 changed files with 317 additions and 89 deletions.
55 changes: 47 additions & 8 deletions API.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
# Vortex API

## Table of Contents
* [Authenticate](#authenticate)
+ [Login](#login)
* [User](#user)
+ [Sign Up](#signup)
+ [Sign In](#signin)
+ [Create User](#create-user)
+ [List User](#list-user)
+ [Get User](#get-user)
Expand Down Expand Up @@ -47,11 +47,52 @@



## Authenticate
## User

### Signup

**POST /v1/user/signup**

No need to give a role, server will assign a "user" role.

Example:

```json
{
"loginCredential":{
"email":"[email protected]",
"password":"password"
},
"username":"John Doe",
"firstName":"John",
"lastName":"Doe",
"phoneNumber":"0911111111"
}
```

Response Data:

```json
{
"id": "5b5b418c760aab15e771bde2",
"uuid": "44b4646a-d009-457c-9fdd-1cc0bf226543",
"jwt": "",
"loginCredential": {
"email": "[email protected]",
"password": "$2a$14$XO4OOUCaiTNQHm.ZTzHU5..WwtP2ec2Q2HPPQuMHP1WoXCjXiRrxa"
},
"username": "John Doe",
"role": "user",
"firstName": "John",
"lastName": "Doe",
"phoneNumber": "0911111111",
"createdAt": "2018-07-28T00:00:12.632011379+08:00"
}
```

### Login
### Signin

**POST /v1/login**
**POST /v1/users/signin**

Example:

Expand All @@ -71,14 +112,14 @@ Response Data:
}
```

## User

### Create User

**POST /v1/user**

Example:

role can only be "root", "user", "guest".
```json
{
"loginCredential":{
Expand All @@ -93,8 +134,6 @@ Example:
}
```

role can only be "root", "user", "guest"

Response Data:

```json
Expand Down
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ src.build:
$(GO) build -v ./src/...
$(MKDIR_P) $(BUILD_FOLDER)/src/cmd/vortex/
$(GO) build -v -o $(BUILD_FOLDER)/src/cmd/vortex/vortex \
-ldflags="-X $(PROJECT_URL)/src/version.version=$(SERVER_VERSION) -X $(PROJECT_URL)/src/server/core.SecretKey=$(SECRET_KEY)" \
-ldflags="-X $(PROJECT_URL)/src/version.version=$(SERVER_VERSION) -X $(PROJECT_URL)/src/server/backend.SecretKey=$(SECRET_KEY)" \
./src/cmd/vortex/...

.PHONY: src.test
Expand Down
2 changes: 1 addition & 1 deletion config/local.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,4 @@
"version": "local",
"logFileName": "access_log"
}
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package core
package backend

import (
"github.com/linkernetworks/mongo"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package core
package backend

import (
"math/rand"
Expand Down
2 changes: 1 addition & 1 deletion src/server/core/jwt.go β†’ src/server/backend/jwt.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package core
package backend

import (
"time"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package core
package backend

import (
"testing"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package core
package backend

import (
"golang.org/x/crypto/bcrypt"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package core
package backend

import (
"testing"
Expand Down
57 changes: 0 additions & 57 deletions src/server/handler_authenticate.go

This file was deleted.

99 changes: 99 additions & 0 deletions src/server/handler_user.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,112 @@ import (
"github.com/linkernetworks/vortex/src/entity"
response "github.com/linkernetworks/vortex/src/net/http"
"github.com/linkernetworks/vortex/src/net/http/query"
"github.com/linkernetworks/vortex/src/server/backend"
"github.com/linkernetworks/vortex/src/web"

"github.com/satori/go.uuid"
mgo "gopkg.in/mgo.v2"
"gopkg.in/mgo.v2/bson"
)

func signUpUserHandler(ctx *web.Context) {
sp, req, resp := ctx.ServiceProvider, ctx.Request, ctx.Response

user := entity.User{}
if err := req.ReadEntity(&user); err != nil {
response.BadRequest(req.Request, resp.ResponseWriter, err)
return
}

user.UUID = uuid.Must(uuid.NewV4()).String()

encryptedPassword, err := hashPassword(user.LoginCredential.Password)
if err != nil {
response.BadRequest(req.Request, resp.ResponseWriter, err)
return
}
user.LoginCredential.Password = encryptedPassword

user.LoginCredential.Email = strings.ToLower(user.LoginCredential.Email)

// sign up user only can ba the role of user
user.Role = "user"

if err := sp.Validator.Struct(user); err != nil {
response.BadRequest(req.Request, resp.ResponseWriter, err)
return
}

session := sp.Mongo.NewSession()
// make email to be a unique key
session.C(entity.UserCollectionName).EnsureIndex(mgo.Index{
Key: []string{"loginCredential.email"},
Unique: true,
})
defer session.Close()

user.ID = bson.NewObjectId()
user.CreatedAt = timeutils.Now()

if err := session.Insert(entity.UserCollectionName, &user); err != nil {
if mgo.IsDup(err) {
response.Conflict(req.Request, resp.ResponseWriter, fmt.Errorf("Email: %s already existed", user.LoginCredential.Email))
} else {
response.InternalServerError(req.Request, resp.ResponseWriter, err)
}
return
}
resp.WriteEntity(user)
}

func signInUserHandler(ctx *web.Context) {
sp, req, resp := ctx.ServiceProvider, ctx.Request, ctx.Response

session := sp.Mongo.NewSession()
defer session.Close()

credential := entity.LoginCredential{}
if err := req.ReadEntity(&credential); err != nil {
response.BadRequest(req.Request, resp.ResponseWriter, err)
return
}

if err := sp.Validator.Struct(credential); err != nil {
response.BadRequest(req.Request, resp.ResponseWriter, err)
return
}

authenticatedUser, passed, err := backend.Authenticate(session, credential)
if err != nil {
switch err {
case mgo.ErrNotFound:
response.Forbidden(req.Request, resp.ResponseWriter, fmt.Errorf("Failed to login. Incorrect authentication credentials"))
return
default:
response.InternalServerError(req.Request, resp.ResponseWriter, err)
return
}
}

// when authenticating not pass
if !passed {
response.Forbidden(req.Request, resp.ResponseWriter, fmt.Errorf("Failed to login. Incorrect authentication credentials"))
return
}

// Passed
tokenString, err := backend.GenerateToken(authenticatedUser.UUID, authenticatedUser.Role)
if err != nil {
response.InternalServerError(req.Request, resp.ResponseWriter, err)
return
}

resp.WriteEntity(response.ActionResponse{
Error: false,
Message: tokenString,
})
}

func createUserHandler(ctx *web.Context) {
sp, req, resp := ctx.ServiceProvider, ctx.Request, ctx.Response

Expand Down
Loading

0 comments on commit 683d8ca

Please sign in to comment.