私はエンドポイントの後ろにアプリエンジンアプリを持っており、認証の追加に関するドキュメントに従うことに問題があります。私の好みは、プロジェクト内のサービスアカウントを通過させ、より詳細なアプリ側認可を行うことです。エンドポイント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
ような文字列になります。
ここで私はドキュメントに明白ではないステップがありません。
お時間をいただきありがとうございます。
エンドポイントのドキュメントごとに、アプリケーションエンジンサービスのURL(この場合は 'basePath')がスコープの正しい値です。 未熟な再生用に編集:関連する文書が見つかります – user1184088
私はそうではないことはかなり確信しています。サービスアカウントの認証では、サービス名をオーディエンスとして使用できますが、ベースパスはどちらにもなく、オーディエンスはスコープとは区別されます。 – saiyr