glide get github.com/dgrijalva/jwt-go
func CreateToken(username, password string) (string, error) {
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
"username": username,
"password": password,
})
tokenString, err := token.SignedString(jwtSecret)
if err != nil {
return "", gqlerrors.FormatError(err)
}
return tokenString, nil
}
func ValidateToken(t string) (bool, error) {
if t == "" {
return false, gqlerrors.FormatError(errors.New("Authorization token must be present"))
}
token, _ := jwt.Parse(t, func(token *jwt.Token) (interface{}, error) {
if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
return nil, fmt.Errorf("There was an error")
}
return jwtSecret, nil
})
if _, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
return true, nil
} else {
return false, gqlerrors.FormatError(errors.New("Invalid authorization token"))
}
}
Mutation := graphql.NewObject(graphql.ObjectConfig{
Name: "Mutation",
Fields: graphql.Fields{
#1
"createToken": &graphql.Field{
Type: graphql.String,
Description: "creates a new JWT token ",
#2
Args: graphql.FieldConfigArgument{
"username": &graphql.ArgumentConfig{
Description: "username",
Type: graphql.NewNonNull(graphql.String),
},
"password": &graphql.ArgumentConfig{
Description: "password",
Type: graphql.NewNonNull(graphql.String),
},
},
#3
Resolve: func(params graphql.ResolveParams) (interface{}, error) {
// marshall and cast the argument value
username, _ := params.Args["username"].(string)
password, _ := params.Args["password"].(string)
#4
token, err := auth.CreateToken(username, password)
if err != nil {
return nil, err
}
return token, nil
},
},
},
})
mutation {
createToken(username: "mike", password: "so-secret")
}
{
"data": {
"createToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwYXNzd29yZCI6InNvLXNlY3JldCIsInVzZXJuYW1lIjoibWlrZSJ9.SXr1CDpd93A3u9NpyxNbTZk5Ryk-e379_5jYu1J01V0"
}
}
package main
import (
"context"
... more impoerts
)
func main() {
... more code
http.HandleFunc("/graphql", graphqlHandler)
... more code
}
#1
func graphqlHandler(w http.ResponseWriter, r *http.Request) {
switch r.Method {
case "POST":
body, err := ioutil.ReadAll(r.Body)
if err != nil {
panic(err)
}
#2
type GraphQLPostBody struct {
Query string `json:"query"`
Variables map[string]interface{} `json:"variables"`
OperationName string `json:"operationName"`
}
#3
var graphQLPostBody GraphQLPostBody
err = json.Unmarshal(body, &graphQLPostBody)
if err != nil {
panic(err)
}
#4
token := r.Header.Get("token")
#5
result := graphql.Do(graphql.Params{
Schema: schema.Schema,
RequestString: graphQLPostBody.Query,
VariableValues: graphQLPostBody.Variables,
OperationName: graphQLPostBody.OperationName,
Context: context.WithValue(context.Background(), "token", token),
})
json.NewEncoder(w).Encode(result)
default:
fmt.Fprintf(w, "Sorry, only POST method are supported.")
}
}
Resolve: func(p graphql.ResolveParams) (interface{}, error) {
token := p.Context.Value("token").(string)
}
Query := graphql.NewObject(graphql.ObjectConfig{
Name: "Query",
Fields: graphql.Fields{
"human": &graphql.Field{
Type: types.HumanType,
Args: graphql.FieldConfigArgument{
... args
},
#1
Resolve: func(p graphql.ResolveParams) (interface{}, error) {
#2
token := p.Context.Value("token").(string)
// validate token
#3
isValid, err := auth.ValidateToken()
if err != nil {
return nil, err
}
if !isValid {
return nil, gqlerrors.FormatError(errors.New("Invalid token"))
}
#4
char, err := resolvers.GetHuman(id)
if err != nil {
return nil, err
}
return char, nil
},
},
},
})
{
human (id: "1001") {
id
name
appearsIn
homePlanet
}
}
{
"data": {
"human": {
"appearsIn": [
"NEWHOPE",
"EMPIRE",
"JEDI"
],
"homePlanet": "Tatooine",
"id": "1001",
"name": "Darth Vader"
}
}
}
Write your response...