Проверка Azure JWT в Go не работает

У меня есть HTTP-сервер Go. Я хочу защитить свои маршруты с помощью токена Azure JWT. Я могу сгенерировать токен, но я не могу его проверить.

Вот как я это делаю:

package main

import (
    "context"
    "errors"
    "fmt"

    "github.com/dgrijalva/jwt-go"
    "github.com/lestrrat-go/jwx/jwa"
    "github.com/lestrrat-go/jwx/jwk"
    njwt "github.com/lestrrat-go/jwx/jwt"
)

const token = "<access-token>"

const jwksURL = `https://login.microsoftonline.com/common/discovery/keys`

func main() {
    set, _ := jwk.Fetch(context.TODO(), jwksURL)
    // verified that set has required kid 
    verify2(token, set)
    token, err := verify(token, set)
    // token, err := jwt.Parse(token, getKey)
    if err != nil {
        panic(err)
    }
    claims := token.Claims.(jwt.MapClaims)
    for key, value := range claims {
        fmt.Printf("%s\t%v\n", key, value)
    }
}

func verify2(token string, keyset jwk.Set) {
    btoken := []byte(token)
    parsedToken, err := njwt.Parse(
        btoken, //token is a []byte
        njwt.WithKeySet(keyset),
        njwt.WithValidate(true),
    )
    fmt.Printf("%v %v", parsedToken, err)
}

func verify(tokenString string, keySet jwk.Set) (*jwt.Token, error) {
    tkn, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
        if token.Method.Alg() != jwa.RS256.String() {
            return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
        }
        kid, ok := token.Header["kid"].(string)
        if !ok {
            return nil, errors.New("kid header not found")
        }
        keys, ok := keySet.LookupKeyID(kid)
        if !ok {
            return nil, fmt.Errorf("key %v not found", kid)
        }
        var raw interface{}
        err := keys.Raw(&raw)
        return raw, err
    })
    return tkn, err
}

verify2(..) дает <nil> failed to match any of the keys и verify(..) дает crypto/rsa: verification error

мой заголовок JWT:

{
  "typ": "JWT",
  "nonce": "...",
  "alg": "RS256",
  "x5t": "-KI3Q9nNR7bRofxmeZoXqbHZGew",
  "kid": "-KI3Q9nNR7bRofxmeZoXqbHZGew"
}
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
2
0
148
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

У меня похожая проблема на другом языке. Моя ручная проверка токена работает для некоторых токенов. До меня дошло, что когда у меня есть претензия «nonce» в заголовке JWT, проверка не проходит, для других токенов, когда у меня ее нет, она работает. Не могли бы вы проверить с другим токеном, где у вас нет «одноразового номера»? (просто чтобы сузить проблему)

Ответ принят как подходящий

Вы используете неправильный тип маркера доступа Azure AD. Те, у кого есть одноразовый номер в заголовке JWT, не предназначены для проверки вашими собственными API — они предназначены для собственных API Microsoft.

Чтобы исправить это, вам нужно выставить область API, после чего вы получите токен доступа без одноразового номера в заголовке JWT. В моем сообщении в блоге есть дополнительная информация по теме.

Каждый раз, когда мы добавляем область для доступа к Microsoft graph API. Azure отправляет обратно access_token, который может быть проверен только Microsoft Graph API.

Альтернативный подход 1:

  • Подпишите мой собственный JWT, чтобы авторизовать мои внешние запросы в серверной части.
  • Храните access_token где-нибудь

Альтернативный подход 2:

  • Выполните вызов графического API и подпишите JWT с утверждениями.
  • Проверьте и используйте JWT между вашим FE и BE

ПРИМЕЧАНИЕ. Не храните конфиденциальную информацию в заявках.

Комментарий владельца токенов Microsoft OAuth по этому поводу: https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/issues/609#issuecomment-524434987

Узнайте больше об Azure OIDC: https://xsreality.medium.com/making-azure-ad-oidc-compliant-5734b70c43ff

Другие вопросы по теме

Похожие вопросы

OpenAI Embeddings API: как работают встраивания?
Ошибка развертывания почтового индекса службы приложений Azure, которая раньше работала (устаревшее приложение реагирования)
Как сбросить максимальный возраст CORS в хранилище BLOB-объектов Azure
С# сохранить поток WinSCP в хранилище BLOB-объектов Azure Ошибка: смещения со значением, отличным от нуля, не поддерживаются
Как исправить ошибку 404 при доступе к SPA (учетной записи хранения) с помощью Azure Front Door Premium?
Какой ключ секции используется параметрами диагностики Azure при отправке данных в концентратор событий?
Есть ли способ для веб-задания читать в пользовательском разделе конфигурации, таком как AppSettings?
Получение данных об использовании + сборы Экспорт сведений о затратах Azure и хранение информации в контейнере Azure
Microsoft Graph API — отправка сообщения в ошибке канала
Как настроить оповещение для новой функции CDC в Фабрике данных Azure?