2017-10-16 3 views
0

私はエンドポイントの後ろにアプリエンジンアプリを持っており、認証の追加に関するドキュメントに従うことに問題があります。私の好みは、プロジェクト内のサービスアカウントを通過させ、より詳細なアプリ側認可を行うことです。エンドポイントGoogle ID JWTとGolang oauth2:id_tokenを持っていますか?access_tokenが必要ですか?

私の場合、ほとんどのクライアントはGCPの外にあり、人々ではない自動化プログラムになります。私はまた、ユーザーのconfigsを変更するにはアプリを再デプロイする必要がありますする必要はありませんので、私はここからドキュメントの「GOOGLE ID JWT」の情報に従ってください:

https://cloud.google.com/endpoints/docs/openapi/service-to-service-auth

これは私の闊歩のセキュリティセクションでありますJSON:

"securityDefinitions": { 
    "api_key": { 
     "type": "apiKey", 
     "name": "key", 
     "in": "query" 
    }, 
    "google_id_token": { 
     "authorizationUrl": "", 
     "flow": "implicit", 
     "type": "oauth2", 
     "x-google-issuer": "https://accounts.google.com" 
    } 
    }, 
    "security": [ 
    { 
     "api_key": [], 
     "google_id_token": [] 
    } 
    ] 

これはOK展開が、私は、サービスアカウントのJSONを利用するために、クライアント側から何をすべきかに困惑しています。ゴーで

、私はのOAuth2 /グーグルドキュメントの私の理解に基づいて、以下を使用します。私は、エラーチェック簡潔にするため、このコードの貼り付けのために削除した

package main 

import (
    "context" 
    "fmt" 
    "io/ioutil" 
    "log" 
    "os" 

    "golang.org/x/oauth2/google" 
) 

func main() { 
    ctx := context.Background() 
    apiKey := os.Getenv("API_KEY") 
    basePath := "https://SERVICE_NAME-dot-PROJECT_NAME.appspot.com" // changed for privacy 

    creds, _ := google.FindDefaultCredentials(ctx) 
    jwt, _ := google.JWTConfigFromJSON(creds.JSON, basePath) 

    client := jwt.Client(ctx) 
    res, _ := client.Get(fmt.Sprintf("%s/REQUEST_PATH?key=%s", basePath, apiKey)) // changed for privacy 

    body, _ := ioutil.ReadAll(res.Body) 
    log.Printf("### http status: %d %s", res.StatusCode, res.Status) 
    log.Printf("### http body: %s", body) 
} 

ときI、エラーはありませんこれを実行します。このビーイングの結果:、私はGoogleがid_tokenを返すが、ないaccess_token(JWTパッケージにいくつかのデバッグログを追加することによって発見されていないようjwt.TokenSource(ctx).Token()の呼び出しと何が起こっているかの内部の検査の際

2017/10/16 07:32:38 ### http status: 401 401 Unauthorized 
2017/10/16 07:32:38 ### http body: { 
"code": 16, 
"message": "JWT validation failed: Missing or invalid credentials", 
"details": [ 
    { 
    "@type": "type.googleapis.com/google.rpc.DebugInfo", 
    "stackEntries": [], 
    "detail": "auth" 
    } 
] 
} 

見ます):

2017/10/16 07:38:47 ### oauth2/jwt -> tokenURL: https://accounts.google.com/o/oauth2/token, form: url.Values{"grant_type":[]string{"urn:ietf:params:oauth:grant-type:jwt-bearer"}, "assertion":[]string{"...cut..."}} 
2017/10/16 07:38:47 ### oauth2/jwt <- response: { 
    "id_token" : "...cut..." 
} 
2017/10/16 07:38:47 ### oauth2/jwt <- token: &oauth2.Token{AccessToken:"", TokenType:"", RefreshToken:"", Expiry:time.Time{wall:0x0, ext:63643740079, loc:(*time.Location)(0x1424160)}, raw:map[string]interface {}{"id_token":"...cut..."}} 

だからのOAuth2のHTTPトランスポートは、認証ヘッダを追加しようとする - 上記AccessTokenフィールドに関連付けられて - それは、このように結果が失敗、Authorization: Bearerような文字列になります。

ここで私はドキュメントに明白ではないステップがありません。

お時間をいただきありがとうございます。

答えて

0

oauthクライアントがaccess_tokenの代わりにid_tokenを返すことが予想されます。 ConfigFromJSONではなくJWTConfigFromJSONを使用していますが、これは正しいです。私はJWTConfigFromJSONの2番目の引数が間違っていると思うので、代わりにスコープを指定する必要があります。この場合、basePathの代わりに"email"を試してください。

+0

エンドポイントのドキュメントごとに、アプリケーションエンジンサービスのURL(この場合は 'basePath')がスコープの正しい値です。 未熟な再生用に編集:関連する文書が見つかります – user1184088

+0

私はそうではないことはかなり確信しています。サービスアカウントの認証では、サービス名をオーディエンスとして使用できますが、ベースパスはどちらにもなく、オーディエンスはスコープとは区別されます。 – saiyr

関連する問題