Закрытые / публичные c ключи RSA для Google OAuth2 - PullRequest
0 голосов
/ 14 марта 2020

Я делаю межсерверную аутентификацию, используя служебную учетную запись из Google Cloud Platform. Согласно документации Google , токен запроса (JWT) должен основываться на алгоритме RSA SHA-256, поэтому должен быть подписан сертифицированным секретным ключом RSA и декодирован соответствующим ключом publi c.

Как я могу сообщить google api ключ publi c?

Я знаю, что у Google есть свои сертификаты RSA , но я не знаю, как их точно использовать .

Итак, какой ключ RSA private / publi c следует использовать для кодирования токена Google oauth2?

Вот фрагмент кода:

import jwt from 'jsonwebtoken'
const axios = require('axios')
const fs = require('fs')
const {
  google
} = require('googleapis')

// oauth2 token uri
const GSUITE_AUD = 'https://oauth2.googleapis.com/token'

const payload = {
  iss: 'example@example.iam.gserviceaccount.com',
  scope: 'https://www.googleapis.com/auth/admin.directory.user',
  aud: GSUITE_AUD,
}

const options = {
  algorithm: 'RS256',
  expiresIn: '10m'
}

const fetchGSuiteUsersUtil = () => {
  let path = require('path'),
    privateKeyFilePath = path.join(__dirname, 'private.key')

  const privateKey = fs.readFileSync(privateKeyFilePath, 'utf-8')

  const request_token = jwt.sign(payload, privateKey, options)

  authorize(request_token, listUsers)

  function authorize(request_token, callback) {
    const TOKEN_URI = GSUITE_AUD
    const data = {
      grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',
      assertion: request_token
    }
    axios.post(TOKEN_URI, data)
      .then((res) => {
        console.log(`statusCode: ${res.statusCode}`)
        console.log(res)
        // callback(res)
      })
      .catch((error) => {
        /**
         * Here i get the error 'Invalid JWT signature' and sounds logic
         * since it doesn't know the public key for the RSA certificated
         * private key that i used
         * 
         */
        console.error(error)
      })
  }

  function listUsers(auth) {
    const service = google.admin({
      version: 'directory_v1',
      auth,
    })
    service.users.list({
        customer: 'my_customer',
        orderBy: 'email',
        maxResults: 500,
        query: 'orgUnitPath=/'
      },
      async(err, res) => {
        // Do things once i get the token..
      })
  }

}

export default fetchGSuiteUsersUtil

1 Ответ

3 голосов
/ 14 марта 2020

Вы неправильно понимаете учетные записи облачной службы Google и делегирование домена G Suite.

Как сообщить google api ключ publi c?

Вы нет. Google уже знает ключ publi c из закрытого ключа, который Google дал вам как часть файла JSON учетной записи службы. Вам необходимо создать учетную запись службы в консоли Google Cloud Console, а затем загрузить материал ключа в виде файла JSON. Вы не можете создать свой собственный закрытый ключ.

Кроме того, вам необходимо выполнить несколько шагов, поскольку вы пытаетесь использовать Admin API. Прочтите документацию по следующей ссылке:

Выполнение делегирования полномочий G Suite для всего домена

Я написал эту статью, в которой объясняется процесс использования личного ключа учетной записи службы. создание подписанного JWT и обмен на токен доступа OAuth.

Google Cloud - создание токенов доступа OAuth для вызовов REST API

Еще один момент. В вашем коде вы указываете audience. Если вы указали аудиторию для своих токенов, вы не получите OAuth Access Token. Вы получите OID C Identity Token, который используется для авторизации на основе идентификации. Примером является использование Identity Token с Google Cloud IAP (Identity Aware Proxy).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...