2013-04-24 9 views
3

Я хочу проверить подлинность Android пользователей бекенд Go AppEngine,как проверить подпись JWT?

Я могу легко получить ID-токен в Android следуя http://android-developers.blogspot.co.il/2013/01/verifying-back-end-calls-from-android.html

идентификатор-маркер полезной нагрузки может быть проверена с oauth2/v2 пакета библиотека https://code.google.com/p/google-api-go-client/.

некоторых твики установки необходимы для его использования с AppEngine, я обнаружил некоторые указатели на http://golangtutorials.blogspot.co.il/2011/11/using-external-api-in-go-appengine.html

согласно документу: «Проверка подписи Оказывается, что это будет подписано с использованием/закрытую пары Google с открытым ключом, и Google публикует открытые ключи (которые мы регулярно меняем) на www.googleapis.com/oauth2/v1/certs; посмотрим.

Вы должны проверить, что идентификатор ID, который на самом деле является JSON Web Token, был подписан с одним из этих сертификатов. К счастью, для этого есть приличные библиотеки, в этом посте я дам указатели на Java, Ruby и PHP.

Библиотеки могут кэшировать сертификаты Google и обновлять их только при необходимости, поэтому проверка (почти всегда) - быстрый статический вызов. "

как я могу подтвердить в Go, что токен был подписан Google?

ответ

2

это то, что я в конечном итоге делает (используя https://github.com/dgrijalva/jwt-go):

package XXX 

import (
    "errors" 
    oauth2 "code.google.com/p/google-api-go-client/oauth2/v2" 
    "jwt" 
    "appengine" 
    "appengine/urlfetch" 
) 

func getTokeninfo(c appengine.Context, token string) (*oauth2.Tokeninfo, error) { 
    client := urlfetch.Client(c) 

    oauth2Svc, err := oauth2.New(client) 

    if err != nil { 
     return nil, err 
    } 

    return oauth2Svc.Tokeninfo().Id_token(token).Do() 
} 

func verifyToken(c appengine.Context, token string) (string, error) { 
    parsedToken, err := jwt.Parse(token) 

    if err != nil { 
     c.Debugf(err.Error()) 
     return "", err 
    } 

    if parsedToken.Claims["aud"] != "XXX.apps.googleusercontent.com" { 
     c.Debugf("aud mismatch") 
     return "", errors.New("Aud mismatch") 
    } 

    if (parsedToken.Claims["azp"] != "XXX.apps.googleusercontent.com") && 
     (parsedToken.Claims["azp"] != "XXX.apps.googleusercontent.com") { 

     c.Debugf("azp mismatch") 
     return "", errors.New("Azp mismatch") 
    } 

    ti, err := getTokeninfo(c, token) 

    if err != nil { 
     c.Debugf(err.Error()) 
     return "", err 
    } 

    if (ti.Issued_to != "XXX.apps.googleusercontent.com") && 
     (ti.Issued_to != "XXX.apps.googleusercontent.com") { 

     c.Debugf("cid mismatch") 
     return "", errors.New("Client ID mismatch") 
    } 

    return ti.User_id, nil 
} 
+1

Почему дублирующие тесты по претензиям [ «AZP»] и Выдается? – dthorpe

Смежные вопросы