Jwt 通过调用获取使用服务帐户身份验证的BigQuery API中的accessToken来获取无效的Grant_类型

Jwt 通过调用获取使用服务帐户身份验证的BigQuery API中的accessToken来获取无效的Grant_类型,jwt,service-accounts,Jwt,Service Accounts,我是BigQuery新手,我需要获得一个accessToken来使用服务帐户访问BigQuery API,为此我需要创建一个JSON Web令牌来获得访问令牌。我正在使用以下代码创建JWT。在此之后,我手动调用令牌端点以获取访问BigQuery的accessToken,但结果是获得无效的grant_类型 import com.google.api.client.util.Base64; import com.google.gson.JsonObject; import java.io.FileI

我是BigQuery新手,我需要获得一个accessToken来使用服务帐户访问BigQuery API,为此我需要创建一个JSON Web令牌来获得访问令牌。我正在使用以下代码创建JWT。在此之后,我手动调用令牌端点以获取访问BigQuery的accessToken,但结果是获得无效的grant_类型

import com.google.api.client.util.Base64;
import com.google.gson.JsonObject;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.nio.charset.Charset;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.Signature;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Enumeration;

public class TestJWT {

    private final static Charset UTF8_CHARSET = Charset.forName("UTF-8");
    private static KeyStore myStore = null;
    private static FileInputStream in_cert = null;

    public static void main(String[] args) {
        PrivateKey privateKey = null;
        try {
            in_cert = new FileInputStream(
                    "example.p12");


        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        try {
            myStore = KeyStore.getInstance("PKCS12");
            myStore.load(in_cert, "notasecret".toCharArray());
            String alias = "";
            Enumeration objEnumeration = myStore.aliases();
            while (objEnumeration.hasMoreElements()) {
                alias = (String) objEnumeration.nextElement();
                privateKey = (PrivateKey) myStore.getKey(alias,
                        "notasecret".toCharArray());

            }
            System.out.print(privateKey);
        } catch (Exception e1) {
            e1.printStackTrace();
        }

        JsonObject header = new JsonObject();
        header.addProperty("alg", "RS256");
        header.addProperty("typ", "JWT");

        Calendar cal = Calendar.getInstance();
        cal.set(1970, 01, 01);
        String iat = Long.toString((System.currentTimeMillis() - cal.getTimeInMillis()) / 1000);
        String exp = Long.toString((System.currentTimeMillis() - cal.getTimeInMillis()) / 1000 + 60000L);

        JsonObject claim = new JsonObject();
        claim.addProperty("iss", "xxxxxxxxx.com");
        claim.addProperty("scope", "https://www.googleapis.com/auth/bigquery https://www.googleapis.com/auth/cloud-platform");
        claim.addProperty("aud", "https://www.googleapis.com/oauth2/v4/token");
        claim.addProperty("exp", exp);
        claim.addProperty("iat", iat);


        System.out.println("Header : " + header);
        String headerStr = header.toString();
        System.out.println("claim : " + claim);
        String claimStr = claim.toString();


        try {

            byte[] headerArr = headerStr.getBytes(UTF8_CHARSET);
//            System.out.println(Base64.encodeBase64String(headerArr));

            byte[] claimArr = claimStr.getBytes(UTF8_CHARSET);
//            System.out.println(Base64.encodeBase64String(claimArr));

            String inputStr = Base64.encodeBase64String(headerArr) + "." + Base64.encodeBase64String(claimArr);

//            System.out.println("Input String : " + inputStr);
            Signature signature = Signature.getInstance("SHA256withRSA");



            signature.initSign(privateKey);
            signature.update(inputStr.getBytes(UTF8_CHARSET));
            System.out.println("Sign : " + Arrays.toString(signature.sign()));

            System.out.println("Base64url encoded sign : " + Base64.encodeBase64String(signature.sign()));

            System.out.println("Final JWT : " + Base64.encodeBase64String(headerArr) + "." + Base64.encodeBase64String(claimArr) + "." + Base64.encodeBase64String(signature.sign()));

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
我按照以下链接创建JWT并获取访问令牌

[1]


[2]

可能与JWT重复,我认为这个问题与JWT无关
grant\u type
是相对于OAuth的,因此您可能在请求中遗漏了某些内容(例如
grant\u type
参数)