func (a *AuthenticationProvider) GetAuthenticationInfo(authcToken *authc.AuthenticationToken) (*authc.AuthenticationInfo, error) {
	values := strings.Fields(authcToken.Identity)
	if len(values) != 2 || ess.IsStrEmpty(values[1]) {
		log.Error("Token is not provided")
		return nil, authc.ErrAuthenticationFailed
	}
	token, err := jwt.Parse(values[1], jwtKeyFunc)
	if err != nil || !token.Valid {
		log.Errorf("Error occurred '%v' or token is not valid", err)
		return nil, authc.ErrAuthenticationFailed
	}
	claims := token.Claims.(jwt.MapClaims)
	authcInfo := authc.NewAuthenticationInfo()
	authcInfo.Principals = append(authcInfo.Principals,
		&authc.Principal{
			Realm:     "inmemory",
			Claim:     "Username",
			Value:     claims["username"].(string),
			IsPrimary: true,
		})
	return authcInfo, nil
}
GetAuthenticationInfo method is `authc.Authenticator` interface. It is called by Security Manager.
package security
import (
	"strings"
	"aahframe.work/config"
	"aahframe.work/essentials"
	"aahframe.work/log"
	"aahframe.work/security/authc"
	"github.com/dgrijalva/jwt-go"
)
var _ authc.Authenticator = (*AuthenticationProvider)(nil)
type AuthenticationProvider struct{}
func (a *AuthenticationProvider) Init(cfg *config.Config) error {
	return nil
}