Skip to content

Provides Request authentication for Decentraland services

License

Notifications You must be signed in to change notification settings

decentraland/auth-go

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

34 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

auth-go

Provides Request authentication for Decentraland services

Credentials generation

This requires the intervention of a third party (authentication server) in order to authenticate the user against a service provider

import "github.com/decentraland/auth-go/pkg/ephemeral"

ephKey, _  := ephemeral.NewEphemeralKey(&ephemeral.EphemeralKeyConfig{})

Request credentials generation

HTTP Requests
import (
	"github.com/decentraland/auth-go/pkg/ephemeral"
	"net/http"
	"strings"
)

req, _ := http.NewRequest("POST", "https://yourserver.org/api/resource", strings.NewReader("{\"param\":\"data\"}"))
accessToken := "..." // Access Token given by the third party. To generate one you will need to send the ecdsa public key generated as part of the credential generation process
ephKey.AddRequestHeaders(req, accessToken)
Non HTTP Requests

For WebRTC or non HTTP requests you should be able to obtain all the credentials for the message you want to send

import "github.com/decentraland/auth-go/pkg/ephemeral"

ephKey, _  := ephemeral.NewEphemeralKey(&ephemeral.EphemeralKeyConfig{})

msg := []byte("Your Message")

accessToken := "..." // Access Token given by the third party. To generate one you will need to send the ecdsa public key generated as part of the credential generation process

ephKey.MakeCredentials(msg, accessToken)
Generated Credentials
Header Meaning
x-signature This is the signed request information (http method + url + body + timestamp) with the generated ephemeral key. This is vital to prevent replay attacks.
x-timestamp Request timestamp, in Unix time.
x-identity The users ephemeral public key used in the access token creation and the user ID
x-access-token Access token. Contains the public ephemeral key and it is signed by the granting authority with its own private key.

Request validation

The service providers will need to authenticate the users based on the information present in the request headers.

Authentication Strategies

We define two basic Authentication strategies

Authentication based on a Third party

The service provider will need to know the entity who signs the access token, otherwise, the request will be rejected.

HTTP Requests
import (
	"github.com/decentraland/auth-go/pkg/auth"
	"github.com/decentraland/auth-go/pkg/keys"
)

reqTTL := 30 // Request time to live in seconds
trustedKey := keys.PemDecodePublicKey(pemEncodedPublicKeyString)
authHandler, err := auth.NewThirdPartyAuthProvider(&auth.ThirdPartyProviderConfig{RequestLifeSpan: reqTTL, TrustedKey: trustedKey})

req, _ := auth.MakeFromHttpRequest(httpRequest)
result, err := authHandler.ApproveRequest(req)

// Get UserID
userID := result.GetUserID() // Extracted from the access token
Non HTTP Requests
import (
	"github.com/decentraland/auth-go/pkg/auth"
	"github.com/decentraland/auth-go/pkg/keys"
)

reqTTL := 30 // Request time to live in seconds
trustedKey := keys.PemDecodePublicKey(pemEncodedPublicKeyString)
authHandler, err := auth.NewThirdPartyAuthProvider(&auth.ThirdPartyProviderConfig{RequestLifeSpan: reqTTL, TrustedKey: trustedKey})


msgCredentials := make(map[string]string)

msgCredentials[auth.HeaderAccessToken] = ""
//...
msgCredentials[auth.HeaderTimestamp] = "150000000"

msg := []byte("Your Message To Validate")
req := &auth.AuthRequest{Credentials: msgCredentials, Content: msg}
result, err := authHandler.ApproveRequest(req)

// Get UserID
userID := result.GetUserID() // Extracted from the access token

Allow All

import (
	"github.com/decentraland/auth-go/pkg/auth"
	"github.com/decentraland/auth-go/pkg/authentication"
	"github.com/decentraland/auth-go/pkg/authorization"
	"net/http"
)

authnStrategy :=  &authentication.AllowAllStrategy{}
authzStrategy := &authorization.AllowAllStrategy{}
authHandler := auth.NewAuthProvider(authnStrategy, authzStrategy)

var httpRequest http.Response
// httpRequest = ...

req, _ := http.TransformHttpRequest(httpRequest)
ok, err := authHandler.ApproveRequest(req)

Custom Strategies

The service provide could opt to implement its own auth strategy. The only thing to do is to implement AuthenticationStrategy and AuthorizationStrategy interfaces

Copyright info

This repository is protected with a standard Apache 2 licence. See the terms and conditions in the LICENSE file.

About

Provides Request authentication for Decentraland services

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published