Google OAuth 2.0 для серверных приложений - PullRequest
1 голос
/ 19 марта 2019

Я хотел получить доступ к хранилищу GCP снаружи.Поэтому я использовал следующие шаги, которые предоставил Google.

  1. Создал учетную запись службы
  2. Сгенерировал токен jwt, используя закрытый ключ, предоставленный для учетной записи службы.

enter image description here

Когда я вызывал вышеуказанный API для получения токена доступа путем предоставления токена jwt, он выдает следующую ошибку.

{
    "error": "invalid_scope",
    "error_description": "Empty or missing scope not allowed."
}

Заранее спасибо!

https://developers.google.com/identity/protocols/OAuth2ServiceAccount

Это код Java, который я использовал для генерации JWT

long now = System.currentTimeMillis();

try {

    GoogleCredential credential = GoogleCredential.fromStream(new FileInputStream("service.json"));
    PrivateKey privateKey = credential.getServiceAccountPrivateKey();
    String privateKeyId = credential.getServiceAccountPrivateKeyId();

    Algorithm algorithm = Algorithm.RSA256(null, (RSAPrivateKey) privateKey);
    String signedJwt = JWT.create()
        .withKeyId(privateKeyId)
        .withIssuer("***********@************-******.iam.gserviceaccount.com")
        .withSubject("***********@************-******.iam.gserviceaccount.com")
        .withAudience("https://www.googleapis.com/oauth2/v4/token")
        .withIssuedAt(new Date(now))
        .withExpiresAt(new Date(now + 3600 * 1000L))
        .sign(algorithm);

    System.out.println(signedJwt);
} catch(Exception e) {
    System.out.println(e);
}

1 Ответ

2 голосов
/ 20 марта 2019

Я выясняю проблему. Именно с полезной нагрузкой, которую я передал, чтобы сгенерировать токен JWT. Ниже я описал код Python, который я использовал для генерации токена jwt. Я получил ссылку от https://www.jhanley.com/google-cloud-creating-oauth-access-tokens-for-rest-api-calls/ ниже кода Python

import jwt
import time

# Permissions to request for Access Token
scopes = "https://www.googleapis.com/auth/devstorage.read_write"

# private key id
pkey_id = ""

# private key
pkey = ""

serviceid = ""

# Google Endpoint for creating OAuth 2.0 Access Tokens from Signed-JWT
auth_url = "https://www.googleapis.com/oauth2/v4/token"

# Set how long this token will be valid in seconds
expires_in = 3600  # Expires in 1 hour

issued = int(time.time())
expires = issued + expires_in  # expires_in is in seconds

# JWT Payload
payload = {
    "iss": serviceid,   # Issuer claim
    "sub": serviceid,   # Issuer claim
    "aud": auth_url,    # Audience claim
    "iat": issued,      # Issued At claim
    "exp": expires,     # Expire time
    "scope": scopes     # Permissions
}

# JWT Headers
additional_headers = {
    'kid': pkey_id,
    "alg": "RS256",
    "typ": "JWT"  # Google uses SHA256withRSA
}

sig = jwt.encode(payload, pkey, algorithm="RS256", headers=additional_headers)
print(sig)
...