Open6

Google Sheet APIを利用してSpreadSheetに書き込みをする

Koji KobayashiKoji Kobayashi

しかし、そこまでの認証認可がややこしいはずなんだけど、まとまっていない。
読み取りは単純にAPIキーの発行で済むが、書き込みappendはAPIキーを使用したアクセスは認められていないようだ。

API keys are not supported by this API. Expected OAuth2 access token or other authentication credentials that assert a principal.
Koji KobayashiKoji Kobayashi

まずJWTを作成する。Rubyを使います。

require 'base64'
require 'json'
require 'jwt'

rsa_private_text = "-----BEGIN PRIVATE KEY-----\nhogehoge\n-----END PRIVATE KEY-----\n"
rsa_private = OpenSSL::PKey::RSA.new rsa_private_text

header = {"alg":"RS256","typ":"JWT"}
claim = {
  "iss": "hogehoge@fugafuga-dev.iam.gserviceaccount.com",
  "scope": "https://www.googleapis.com/auth/spreadsheets",
  "aud": "https://oauth2.googleapis.com/token",
  "exp": Time.now.to_i + 3600,
  "iat": Time.now.to_i
}

token = JWT.encode claim, rsa_private, 'RS256', { typ: 'JWT' }
puts token

既にサービスがアカウントが持つ秘密鍵があるので、文字列として引数に与えてRSAのオブジェクトを作成
expは最大60分となっている。

Koji KobayashiKoji Kobayashi

POST /token HTTP/1.1
Host: oauth2.googleapis.com
Content-Type: application/x-www-form-urlencoded

grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiI3NjEzMjY3OTgwNjktcjVtbGpsbG4xcmQ0bHJiaGc3NWVmZ2lncDM2bTc4ajVAZGV2ZWxvcGVyLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzY29wZSI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2F1dGgvcHJlZGljdGlvbiIsImF1ZCI6Imh0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbS9vL29hdXRoMi90b2tlbiIsImV4cCI6MTMyODU3MzM4MSwiaWF0IjoxMzI4NTY5NzgxfQ.ixOUGehweEVX_UKXv5BbbwVEdcz6AYS-6uQV6fGorGKrHf3LIJnyREw9evE-gs2bmMaQI5_UbabvI4k-mQE4kBqtmSpTzxYBL1TCd7Kv5nTZoUC1CmwmWCFqT9RE6D7XSgPUh_jF1qskLa2w0rxMSjwruNKbysgRNctZPln7cqQ

これでアクセストークンが取れます。
60分で有効期限が切れるので、切れたら再度JWTを作成してアクセストークンを作る必要がある模様。

Koji KobayashiKoji Kobayashi

Google SpreadSheetからデータをとってみます。

GET /v4/spreadsheets/{sheet_id}/values/{sheet_name} HTTP/1.1
Host: sheets.googleapis.com
Authorization: Bearer access_token
{
    "range": "users!A1:Z1000",
    "majorDimension": "ROWS",
    "values": [
        [
            "aaa",
            "vvv",
            "ccc"
        ],
        [
            "bbb",
            "ddd",
            "wwww"
        ]
    ]
}

取れました。