Skip to content
This repository has been archived by the owner on Feb 21, 2024. It is now read-only.

Commit

Permalink
Merge remote-tracking branch 'mdigger/master'
Browse files Browse the repository at this point in the history
  • Loading branch information
Дмитрий Седых committed Jan 10, 2016
2 parents 607afa5 + 4b89986 commit cd86ab9
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 14 deletions.
3 changes: 2 additions & 1 deletion header.go
Expand Up @@ -13,7 +13,8 @@ type header struct {
Typ string `json:"typ"`
}

// getHeader возвращает сгенерированный заголовок токена с указанием алгоритма для подписи.
// getHeader возвращает сгенерированный заголовок токена с указанием алгоритма
// для подписи.
func getHeader(alg string) []byte {
data, _ := json.Marshal(header{
Alg: alg,
Expand Down
12 changes: 8 additions & 4 deletions signer.go
Expand Up @@ -16,23 +16,26 @@ type Signer struct {
name string // название алгоритма
}

// NewSigner возвращает инициализированный подписчик токена, основанный на алгоритме SHA256.
// NewSigner возвращает инициализированный подписчик токена, основанный на
// алгоритме SHA256.
func NewSignerHS256(key []byte) *Signer {
return &Signer{
hash: hmac.New(sha256.New, key),
name: "HS256",
}
}

// NewSignerHS384 возвращает инициализированный подписчик токена, основанный на алгоритме SHA384.
// NewSignerHS384 возвращает инициализированный подписчик токена, основанный на
// алгоритме SHA384.
func NewSignerHS384(key []byte) *Signer {
return &Signer{
hash: hmac.New(sha512.New384, key),
name: "HS384",
}
}

// NewSignerHS512 возвращает инициализированный подписчик токена, основанный на алгоритме SHA512.
// NewSignerHS512 возвращает инициализированный подписчик токена, основанный на
// алгоритме SHA512.
func NewSignerHS512(key []byte) *Signer {
return &Signer{
hash: hmac.New(sha512.New, key),
Expand All @@ -56,7 +59,8 @@ func (s Signer) Sign(token []byte) []byte {

// Parse разбирает токен и возвращает его содержимое.
func (s Signer) Parse(token []byte) ([]byte, error) {
parts := bytes.SplitN(token, []byte{'.'}, 3) // разделяем токен на составные части
// разделяем токен на составные части
parts := bytes.SplitN(token, []byte{'.'}, 3)
if len(parts) != 3 {
return nil, errors.New("bad token parts")
}
Expand Down
26 changes: 17 additions & 9 deletions template.go
Expand Up @@ -10,7 +10,8 @@ import (
"unicode"
)

// Template описывает основные поля токена, которые будут заполнены автоматически.
// Template описывает основные поля токена, которые будут заполнены
// автоматически.
type Template struct {
Issuer string // кто выдал
Subject string // тема
Expand All @@ -21,8 +22,9 @@ type Template struct {
Signer *Signer // генератор подписи
}

// Token возвращает подписанный токен, сгенерированный на основании данных из шаблона и данных
// пользователя. Подпись осуществляется методом, указанным в шаблоне.
// Token возвращает подписанный токен, сгенерированный на основании данных из
// шаблона и данных пользователя. Подпись осуществляется методом, указанным в
// шаблоне.
func (t *Template) Token(obj interface{}) (token []byte, err error) {
if t.Signer == nil {
return nil, errors.New("empty signer")
Expand Down Expand Up @@ -66,23 +68,28 @@ func (t *Template) Token(obj interface{}) (token []byte, err error) {
break
default: // возможно, что структура (поддерживаем только их)
v := reflect.ValueOf(obj)
if v.Kind() == reflect.Ptr { // если это указатель, то переключаемся на сам элемент
// если это указатель, то переключаемся на сам элемент
if v.Kind() == reflect.Ptr {
v = v.Elem()
}
if v.Kind() == reflect.Invalid { // если пустая не инициализированная структура
// если пустая не инициализированная структура
if v.Kind() == reflect.Invalid {
break
}
if v.Kind() != reflect.Struct { // это не структура
return nil, fmt.Errorf("unsupported type %T", obj)
}
typ := v.Type() // получаем информацию о типе структуры
for i := 0; i < v.NumField(); i++ { // перебираем все поля
// получаем информацию о типе структуры
typ := v.Type()
// перебираем все поля
for i := 0; i < v.NumField(); i++ {
field := typ.Field(i)
if field.PkgPath != "" {
continue // приватное поле
}
tag := field.Tag.Get("json") // получаем таг для JSON
// если таг для JSON не определен, а определено глобальное имя, то используем его
// если таг для JSON не определен, а определено глобальное имя,
// то используем его
if tag == "" && strings.Index(string(field.Tag), ":") < 0 {
tag = string(field.Tag)
}
Expand Down Expand Up @@ -124,7 +131,8 @@ func (t *Template) Parse(token []byte, obj interface{}) error {
if t.Signer == nil {
return errors.New("empty signer")
}
data, err := t.Signer.Parse(token) // разбираем токен и проверяем валидность подписи
// разбираем токен и проверяем валидность подписи
data, err := t.Signer.Parse(token)
if err != nil {
return err
}
Expand Down

0 comments on commit cd86ab9

Please sign in to comment.