Skip to content

Commit

Permalink
fix: support using bearer token to access protected resources (#364)
Browse files Browse the repository at this point in the history
* fix: require signed in by bearer token.

Signed-off-by: 0x2a <stevesough@gmail.com>

* fix: utilize existing code refactoring functions

Signed-off-by: 0x2a <stevesough@gmail.com>

* fix: improve the bearer parese function

Signed-off-by: 0x2a <stevesough@gmail.com>
  • Loading branch information
Steve0x2a committed Dec 12, 2021
1 parent 589c040 commit 00ab156
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 0 deletions.
8 changes: 8 additions & 0 deletions routers/auto_signin_filter.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,4 +62,12 @@ func AutoSigninFilter(ctx *context.Context) {
setSessionUser(ctx, userId)
return
}

//Bearer token
//headers: {"Authorization":accessToken}
if claims, ok := parseBearer(ctx); ok {
setSessionUser(ctx, fmt.Sprintf("%s/%s", claims.Owner, claims.Name))
setSessionExpire(ctx, claims.ExpiresAt.Unix())
return
}
}
28 changes: 28 additions & 0 deletions routers/base.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,11 @@ package routers

import (
"fmt"
"strings"

"github.com/astaxie/beego/context"
"github.com/casbin/casdoor/object"
"github.com/casbin/casdoor/util"
)

type Response struct {
Expand Down Expand Up @@ -85,3 +87,29 @@ func setSessionUser(ctx *context.Context, user string) {
// https://github.com/beego/beego/issues/3445#issuecomment-455411915
ctx.Input.CruSession.SessionRelease(ctx.ResponseWriter)
}

func setSessionExpire(ctx *context.Context, ExpireTime int64) {
SessionData := struct{ ExpireTime int64 }{ExpireTime: ExpireTime}
err := ctx.Input.CruSession.Set("SessionData", util.StructToJson(SessionData))
if err != nil {
panic(err)
}
ctx.Input.CruSession.SessionRelease(ctx.ResponseWriter)
}

func parseBearer(ctx *context.Context) (*object.Claims, bool) {
bearer := ctx.Request.Header.Get("Authorization")
bearerList := strings.Split(bearer, " ")
if len(bearerList) != 2 {
return nil, false
}
prefix := bearerList[0]
if prefix != "Bearer" {
return nil, false
}
claims, err := object.ParseJwtToken(bearerList[1])
if err != nil {
return nil, false
}
return claims, true
}

0 comments on commit 00ab156

Please sign in to comment.