Skip to content
Snippets Groups Projects
Commit 590d18ef authored by Sergey Yakubov's avatar Sergey Yakubov
Browse files

switch to jwt admin token

parent 0ff767f7
No related branches found
No related tags found
No related merge requests found
Showing
with 58 additions and 24 deletions
...@@ -8,9 +8,9 @@ import ( ...@@ -8,9 +8,9 @@ import (
) )
type Auth struct { type Auth struct {
authHMAC utils.Auth authHMAC utils.Auth
authHMACAdmin utils.Auth authAdmin utils.Auth
authJWT utils.Auth authJWT utils.Auth
} }
func NewAuth(authHMAC,authHMACAdmin,authJWT utils.Auth) *Auth { func NewAuth(authHMAC,authHMACAdmin,authJWT utils.Auth) *Auth {
...@@ -18,7 +18,7 @@ func NewAuth(authHMAC,authHMACAdmin,authJWT utils.Auth) *Auth { ...@@ -18,7 +18,7 @@ func NewAuth(authHMAC,authHMACAdmin,authJWT utils.Auth) *Auth {
} }
func (auth *Auth) AdminAuth() utils.Auth { func (auth *Auth) AdminAuth() utils.Auth {
return auth.authHMACAdmin return auth.authAdmin
} }
func (auth *Auth) HmacAuth() utils.Auth { func (auth *Auth) HmacAuth() utils.Auth {
...@@ -43,7 +43,7 @@ func subjectFromRequest(request TokenRequest) string { ...@@ -43,7 +43,7 @@ func subjectFromRequest(request TokenRequest) string {
return "" return ""
} }
func (auth *Auth) PrepareUserJWTToken(request TokenRequest) (string, error) { func (auth *Auth) PrepareAccessToken(request TokenRequest) (string, error) {
var claims utils.CustomClaims var claims utils.CustomClaims
var extraClaim utils.AccessTokenExtraClaim var extraClaim utils.AccessTokenExtraClaim
...@@ -55,7 +55,7 @@ func (auth *Auth) PrepareUserJWTToken(request TokenRequest) (string, error) { ...@@ -55,7 +55,7 @@ func (auth *Auth) PrepareUserJWTToken(request TokenRequest) (string, error) {
uid := xid.New() uid := xid.New()
claims.Id = uid.String() claims.Id = uid.String()
return auth.authJWT.GenerateToken(&claims) return auth.authAdmin.GenerateToken(&claims)
} }
......
...@@ -20,7 +20,7 @@ var CommandTests = []struct { ...@@ -20,7 +20,7 @@ var CommandTests = []struct {
func TestCommand(t *testing.T) { func TestCommand(t *testing.T) {
outBuf = new(bytes.Buffer) outBuf = new(bytes.Buffer)
server.Auth = authorization.NewAuth(utils.NewHMACAuth("secret"),utils.NewHMACAuth("secret"),utils.NewJWTAuth("secret")) server.Auth = authorization.NewAuth(utils.NewHMACAuth("secret"),utils.NewJWTAuth("secret_admin"),utils.NewJWTAuth("secret"))
for _, test := range CommandTests { for _, test := range CommandTests {
outBuf.(*bytes.Buffer).Reset() outBuf.(*bytes.Buffer).Reset()
......
...@@ -72,7 +72,7 @@ func (cmd *command) CommandCreate_token() (err error) { ...@@ -72,7 +72,7 @@ func (cmd *command) CommandCreate_token() (err error) {
return err return err
} }
token, err := server.Auth.PrepareUserJWTToken(request) token, err := server.Auth.PrepareAccessToken(request)
if err != nil { if err != nil {
return err return err
} }
......
...@@ -38,7 +38,7 @@ var tokenTests = []struct { ...@@ -38,7 +38,7 @@ var tokenTests = []struct {
} }
func TestGenerateToken(t *testing.T) { func TestGenerateToken(t *testing.T) {
server.Auth = authorization.NewAuth(utils.NewHMACAuth("secret"),utils.NewHMACAuth("secret"),utils.NewJWTAuth("secret")) server.Auth = authorization.NewAuth(utils.NewHMACAuth("secret"),utils.NewJWTAuth("secret_admin"),utils.NewJWTAuth("secret"))
for _, test := range tokenTests { for _, test := range tokenTests {
outBuf = new(bytes.Buffer) outBuf = new(bytes.Buffer)
err := test.cmd.CommandCreate_token() err := test.cmd.CommandCreate_token()
......
...@@ -22,8 +22,14 @@ func prepareToken(payload string) string{ ...@@ -22,8 +22,14 @@ func prepareToken(payload string) string{
} }
func prepareAdminToken(payload string) string{ func prepareAdminToken(payload string) string{
Auth = authorization.NewAuth(nil,utils.NewHMACAuth("secret_admin"),nil) Auth = authorization.NewAuth(nil,utils.NewJWTAuth("secret_admin"),nil)
token, _ := Auth.AdminAuth().GenerateToken(&payload)
var claims utils.CustomClaims
var extraClaim utils.AccessTokenExtraClaim
claims.Subject = payload
extraClaim.AccessType = "create"
claims.ExtraClaims = &extraClaim
token, _ := Auth.AdminAuth().GenerateToken(&claims)
return token return token
} }
......
...@@ -32,7 +32,36 @@ func extractUserTokenrequest(r *http.Request) (request authorization.TokenReques ...@@ -32,7 +32,36 @@ func extractUserTokenrequest(r *http.Request) (request authorization.TokenReques
func routeAuthorisedTokenIssue(w http.ResponseWriter, r *http.Request) { func routeAuthorisedTokenIssue(w http.ResponseWriter, r *http.Request) {
Auth.AdminAuth().ProcessAuth(issueUserToken, "admin")(w, r) Auth.AdminAuth().ProcessAuth(checkAccessToken, "admin")(w, r)
}
func checkAccessToken(w http.ResponseWriter, r *http.Request) {
c := r.Context().Value("TokenClaims")
if c == nil {
w.WriteHeader(http.StatusInternalServerError)
w.Write([]byte("Empty context"))
}
claim := c.(*utils.CustomClaims)
if claim.Subject != "admin" {
err_txt := "wrong token subject type "+claim.Subject
w.WriteHeader(http.StatusUnauthorized)
w.Write([]byte(err_txt))
}
var extraClaim utils.AccessTokenExtraClaim
if err := utils.JobClaimFromContext(r, &extraClaim); err != nil {
w.WriteHeader(http.StatusInternalServerError)
w.Write([]byte(err.Error()))
}
if extraClaim.AccessType!="create" {
err_txt := "wrong access type "+extraClaim.AccessType
w.WriteHeader(http.StatusUnauthorized)
w.Write([]byte(err_txt))
}
issueUserToken(w, r)
} }
func issueUserToken(w http.ResponseWriter, r *http.Request) { func issueUserToken(w http.ResponseWriter, r *http.Request) {
...@@ -42,7 +71,7 @@ func issueUserToken(w http.ResponseWriter, r *http.Request) { ...@@ -42,7 +71,7 @@ func issueUserToken(w http.ResponseWriter, r *http.Request) {
return return
} }
token, err := Auth.PrepareUserJWTToken(request) token, err := Auth.PrepareAccessToken(request)
if err != nil { if err != nil {
utils.WriteServerError(w, err, http.StatusInternalServerError) utils.WriteServerError(w, err, http.StatusInternalServerError)
return return
......
...@@ -32,16 +32,16 @@ var IssueTokenTests = [] struct { ...@@ -32,16 +32,16 @@ var IssueTokenTests = [] struct {
func TestIssueToken(t *testing.T) { func TestIssueToken(t *testing.T) {
authJWT := utils.NewJWTAuth("secret") authJWT := utils.NewJWTAuth("secret")
authHMACAdmin := utils.NewHMACAuth("secret_admin") authAdmin := utils.NewJWTAuth("secret_admin")
Auth = authorization.NewAuth(nil,authHMACAdmin,authJWT) Auth = authorization.NewAuth(nil,authAdmin,authJWT)
for _, test := range IssueTokenTests { for _, test := range IssueTokenTests {
request := makeRequest(authorization.TokenRequest{test.requestSubject,test.validDays,test.role}) request := makeRequest(authorization.TokenRequest{test.requestSubject,test.validDays,test.role})
w := doPostRequest("/admin/issue",request,authHMACAdmin.Name()+" "+test.adminToken) w := doPostRequest("/admin/issue",request,authAdmin.Name()+" "+test.adminToken)
if w.Code == http.StatusOK { if w.Code == http.StatusOK {
body, _ := ioutil.ReadAll(w.Body) body, _ := ioutil.ReadAll(w.Body)
var token authorization.TokenResponce var token authorization.TokenResponce
json.Unmarshal(body,&token) json.Unmarshal(body,&token)
claims,_ := utils.CheckJWTToken(token.Token,"secret") claims,_ := utils.CheckJWTToken(token.Token,"secret_admin")
cclaims,_:= claims.(*utils.CustomClaims) cclaims,_:= claims.(*utils.CustomClaims)
var extra_claim utils.AccessTokenExtraClaim var extra_claim utils.AccessTokenExtraClaim
utils.MapToStruct(claims.(*utils.CustomClaims).ExtraClaims.(map[string]interface{}), &extra_claim) utils.MapToStruct(claims.(*utils.CustomClaims).ExtraClaims.(map[string]interface{}), &extra_claim)
......
...@@ -30,8 +30,7 @@ func createAuth() (*authorization.Auth,error) { ...@@ -30,8 +30,7 @@ func createAuth() (*authorization.Auth,error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
return authorization.NewAuth(utils.NewHMACAuth(secret), utils.NewJWTAuth(adminSecret), utils.NewJWTAuth(secret)),nil
return authorization.NewAuth(utils.NewHMACAuth(adminSecret), utils.NewHMACAuth(secret), utils.NewJWTAuth(secret)),nil
} }
func ReadConfig(fname string) (log.Level, error) { func ReadConfig(fname string) (log.Level, error) {
......
...@@ -139,7 +139,7 @@ func ProcessJWTAuth(fn http.HandlerFunc, key string) http.HandlerFunc { ...@@ -139,7 +139,7 @@ func ProcessJWTAuth(fn http.HandlerFunc, key string) http.HandlerFunc {
if authType == "Bearer" { if authType == "Bearer" {
if claims, ok := CheckJWTToken(token, key); !ok { if claims, ok := CheckJWTToken(token, key); !ok {
http.Error(w, "Authorization error - tocken does not match", http.StatusUnauthorized) http.Error(w, "Authorization error - token does not match", http.StatusUnauthorized)
return return
} else { } else {
ctx = context.WithValue(ctx, "TokenClaims", claims) ctx = context.WithValue(ctx, "TokenClaims", claims)
......
...@@ -20,9 +20,9 @@ mkdir -p beamline/p07/current ...@@ -20,9 +20,9 @@ mkdir -p beamline/p07/current
cp beamtime-metadata* beamline/p07/current/ cp beamtime-metadata* beamline/p07/current/
#tokens #tokens
AdminToken=C5cwHN2hjWGo6A2Ca3YuumCwwm_SVqC962oqVa0y09k= AdminToken=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJjMTNvcGpyaXB0MzNlb2ZjbWJuZyIsInN1YiI6ImFkbWluIiwiRXh0cmFDbGFpbXMiOnsiQWNjZXNzVHlwZSI6ImNyZWF0ZSJ9fQ.uRjtGPaRpOlOfKroijHRgMDNaZHnXsVPf0JaJ1XMg7o
curl -v --silent -H "Authorization: HMAC-SHA-256 $AdminToken" --data '{"BeamtimeId":"12345678","DaysValid":123,"Role":"read"}' 127.0.0.1:5007/admin/issue --stderr - | tee /dev/stderr | grep "HTTP/1.1 200 OK" curl -v --silent -H "Authorization: Bearer $AdminToken" --data '{"Subject": {"beamtimeId":"12345678"},"DaysValid":123,"AccessType":"read"}' 127.0.0.1:5007/admin/issue --stderr - | tee /dev/stderr | grep "bt_12345678"
curl -v --silent -H "Authorization: HMAC-SHA-256 blabla" --data '{"BeamtimeId":"12345678","DaysValid":123,"Role":"read"}' 127.0.0.1:5007/admin/issue --stderr - | tee /dev/stderr | grep "token does not match" curl -v --silent -H "Authorization: Bearer blabla" --data '{"Subject": {"beamtimeId":"12345678"},"DaysValid":123,"AccessType":"read"}' 127.0.0.1:5007/admin/issue --stderr - | tee /dev/stderr | grep "token does not match"
curl -v --silent --data '{"SourceCredentials":"processed%c20180508-000-COM20181%%detector%","OriginHost":"127.0.0.1:5555"}' 127.0.0.1:5007/authorize --stderr - | tee /dev/stderr | grep c20180508-000-COM20181 curl -v --silent --data '{"SourceCredentials":"processed%c20180508-000-COM20181%%detector%","OriginHost":"127.0.0.1:5555"}' 127.0.0.1:5007/authorize --stderr - | tee /dev/stderr | grep c20180508-000-COM20181
curl -v --silent --data '{"SourceCredentials":"processed%c20180508-000-COM20181%%detector%","OriginHost":"127.0.0.1:5555"}' 127.0.0.1:5007/authorize --stderr - | tee /dev/stderr | grep p00 curl -v --silent --data '{"SourceCredentials":"processed%c20180508-000-COM20181%%detector%","OriginHost":"127.0.0.1:5555"}' 127.0.0.1:5007/authorize --stderr - | tee /dev/stderr | grep p00
......
12c2ljwewezgnea 12c2ljwewezgnea
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment