Форум программистов, компьютерный форум, киберфорум
Go (Golang)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
0 / 0 / 0
Регистрация: 08.02.2019
Сообщений: 12

Авторизация jwt токены

20.11.2020, 10:47. Показов 3460. Ответов 2

Студворк — интернет-сервис помощи студентам
Уважаемые профессионалы в go, написал небольшой проект, но вот никак не могу понять как сделать авторизацию с помощью токенов. Уже перерыл весь инет - не могу понять как это сделать - вроде все написано, но видать не хватает знаний.

вот например самый простой код сервера

Go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package main
import (
    "fmt"
    "net/http"
)
 
func main() {     
 
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request){
        fmt.Fprint(w, "General Page")
    })
    http.HandleFunc("/about", func(w http.ResponseWriter, r *http.Request){
        fmt.Fprint(w, "About Page")
    })
    http.HandleFunc("/contact", func(w http.ResponseWriter, r *http.Request){
        fmt.Fprint(w, "Contact Page")
    })
    fmt.Println("Server is listening...")
    http.ListenAndServe(":8181", nil)
}
Может кто-нибудь подсказать:
1) как все таки правильно сделать простую генерацию jwt токена?
2) как проверять токен при попытке открыть страницу, что бы если он есть и действующий она открылась (это самый главный вопрос)?
3) как автоматически перегенерировать токен, чтобы во время всей сессии не запрашивало авторизацию?
4) какую все таки библиотеку использовать для jwt токенов?

Прошу не кидаться тапками - изучаю golang пару недель.
Может кто просто даст ссылку на проект где все прописано от и до - я сам разберусь на рабочем примере.

Заранее огромное спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.11.2020, 10:47
Ответы с готовыми решениями:

Авторизация jwt
Здравствуйте. Я новичок в asp net. И у меня появился вопрос по поводу авторизации на основе токенов. Я сделал авторизацию через jwt. И все...

WinInet, токены и авторизация
Доброго времени суток! Есть система багтрекер - MantisBT, есть задача подключиться к ней и считать информацию по задаче с указанным...

Jwt и retrofit - авторизация и обновление токена
В интернете есть примеры типа таких ссылка Но я ни как не могу разобраться что там к чему.. при авторизации получаю token и...

2
0 / 0 / 2
Регистрация: 31.12.2014
Сообщений: 226
20.11.2020, 11:05
dimanuga, https://tutorialedge.net/golan... with-jwts/
0
Особый статус
 Аватар для FloppyDisc
623 / 221 / 164
Регистрация: 18.11.2015
Сообщений: 1,086
21.11.2020, 16:14
Советую: https://github.com/dgrijalva/jwt-go

Приведу примеры с JWT RSA, ИМХО, они простые поэтому без комментариев. Допустим есть структура:

C
1
2
3
4
TokenClaims struct {
    Id int64 `json:"id"`
    jwt.StandardClaims
}
Создание токена:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
func CreateJwtToken(claims TokenClaims, duration int64, rsa RSA) (string, error) {
    key, err := jwt.ParseRSAPrivateKeyFromPEM([]byte(rsa.getPrivateKey()))
 
    if err != nil {
        return "", err
    }
 
    claims.StandardClaims = jwt.StandardClaims{
        ExpiresAt: time.Now().Add(time.Duration(duration) * time.Second).Unix(),
        Issuer:    "your-issuer",
    }
 
    withClaimsToken := jwt.NewWithClaims(jwt.SigningMethodRS256, &claims)
    return withClaimsToken.SignedString(key)
}
Валидация токена

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
func VerifyJwtToken(token string, r RSA) (*TokenClaims, error) {
    withClaimsToken, err := jwt.ParseWithClaims(token, &TokenClaims{}, func(token *jwt.Token) (interface{}, error) {
        key, err := jwt.ParseRSAPublicKeyFromPEM([]byte(
            r.GetPublicKey(),
        ))
 
        if err != nil {
            return nil, err
        }
 
        if key == nil || key.N == nil {
            return nil, errors.New("JWT token is not defined")
        }
 
        if _, ok := token.Method.(*jwt.SigningMethodRSA); !ok {
            return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"])
        }
 
        return key, nil
    })
 
    if err != nil {
        return nil, err
    }
 
    if claims, ok := withClaimsToken.Claims.(*TokenClaims); ok && withClaimsToken.Valid {
        return claims, nil
    }
 
    return nil, errors.New("Failed to get the source data from the JWT token")
}
В данном примере используется простенькая реализация с закрытыми и открытыми ключами, генерируются они просто:

Bash
1
2
$ openssl genrsa -out app.rsa 1024
$ openssl rsa -in app.rsa -pubout > app.rsa.pub
Опишу как может выглядеть RSA и собственно ключи:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
type (
    RSA interface {
        GetPublicKey() string
        SetPublicKey(string)
 
        GetPrivateKey() string
        SetPrivateKey(string)
    }
    RSAContainer struct {
        publicKey  string
        privateKey string
    }
)
 
func NewRSAContainer(public, private string) RSAContainer {
    rsa := RSAContainer{}
    rsa.SetPublicKey(public)
    rsa.SetPrivateKey(private)
 
    return rsa
}
 
// Используем
 
rsa := lib.NewRSAContainer(
    TestPublicKey, TestPrivateKey,
)
 
 
claims := TokenClaims{
    Id: 100,
}
 
createdToken, err := CreateJwtToken(claims, 99999999, &rsa)
 
// check error
 
parsedClaims, err := VerifyJwtToken(createdToken, &rsa)
 
// check error
 
if parsedClaims.Id != 100 {
    // do stuff
}
Примеры токенов

Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
const TestPrivateKey = `-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQDLZ8LRgXIEg/VfpyAqhe6y5/LTtXBvoAethfMFaoiLKVNQ4M+E
HzxuhtjCRqiPHgsU8JEdVmjXOLnX/huD2WTdfURTJH2dkakUXeAua/0YJ/Mtciv+
Y3euzw/OUNOzeqjOAy2LlzPOvXB2mNv/Gn59vDrapXz7QbjzyF6Fl98xuQIDAQAB
AoGAHpCg/cptz6/kl1MNylYF4GxqWNXS53MstC6ErjOsAP1cv7KIfFoVQqaQu+DS
Q29ISwU7SSVK68xiYMqWZ+Gq/jiq9+/NTTw5QwRxNrJ0S8t2l8arFOptv2Pu6ppi
3LVDi1C+bZug/Klwd7GUUky5NKuIpamci/wfNI79/LTZRmECQQD1JjR6LxUQw2QJ
CtPpVk5eoH6/1aNKMoTUUjwowRRoYAlH4DXanyNGj3yYkFpyySKIRtKtBhTcldJp
fbLNdPqHAkEA1GiN2jWnqHLp/wsiQ/o54jda9aR0vh0wLLH2kV3tQvDJMgCj4GL1
pLRxhoiu0WreuBQGqgF26RwKv+4JaSRBvwJBAKb7PwN6zn58mMcP+QgXIYqTB8Lj
YjZH8vIskY2w9pWh1LCAqC4h94U4d0X0DafiGQN6OkZgvhUCeDAizofkBkECQB6Q
+TDYncrg1omMOZ8cqC3El4NX6jDdlGwqI/hhUt5aNinK68pDk2PjT57zlmyue2R0
BU17rnf3QBjEkXge7pMCQG3mQwiuZT3hs62AOD+CBygdOuLfEbjb4+J2M8GGJbVb
I3rP3ZAjWRlIRYi3yBB2FTYhMvXzFTUftcNAy+RIqAQ=
-----END RSA PRIVATE KEY-----`
 
const TestPublicKey = `-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDLZ8LRgXIEg/VfpyAqhe6y5/LT
tXBvoAethfMFaoiLKVNQ4M+EHzxuhtjCRqiPHgsU8JEdVmjXOLnX/huD2WTdfURT
JH2dkakUXeAua/0YJ/Mtciv+Y3euzw/OUNOzeqjOAy2LlzPOvXB2mNv/Gn59vDra
pXz7QbjzyF6Fl98xuQIDAQAB
-----END PUBLIC KEY-----`
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.11.2020, 16:14
Помогаю со студенческими работами здесь

JWT-авторизация ASP.Core 3.0: какие-то непонятные глюки
Собственно вот, продолжаю ковырять Core 3. Сейчас столкнулся с глюками авторизации по JWT. Имеем 2 сервера: один Core 2.2, второй 3.0....

токены
здравствуйте! нужны идеи по решению этой задачи. у меня никаких кроме как поделить их на токены... Однажды Азиз заметил, что номер его...

Токены
Здравствуйте, подскажите ответ на такой вопрос: Что такое токен в программе на c++? Определения, которые я нашел гласят, что это что-то...

JWT vs OAuth
Всем привет. Решил сделать hello world с JWT авторизацией... А в чем его плюсы? token хрен отзовешь если понадобится....

Jwt oct
Добрый день! A.3. Example Symmetric Keys The following example JWK Set contains two symmetric keys represented as JWKs:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru