0

このAPIドキュメントを参照して、バックエンドnodeJSサーバーを使用してIoT-Coreのデバイス構成にアクセス(および編集)しようとしています

ただし、エラーが発生し続けます:

コード 401 とエラー メッセージ「メッセージ」: 「リクエストに無効な認証資格情報が含まれていました。OAuth 2 アクセス トークン、ログイン Cookie、またはその他の有効な認証資格情報が必要でした。https://developers.google.com/identity/sign-in/web/devconsoleを参照してください。 -プロジェクト。」、「ステータス」:「認証されていません」。

からサービス アカウントとキーを作成し、Google IAMクラウド IoT デバイス コントローラーのアクセス許可を付与しました。このアクセス許可は、デバイス構成を更新できますが、作成または削除はできません。その後、それを Cloud IoT Admin に変更し、さらに に変更しましたProject Editor permissionsが、それでも同じエラー メッセージが表示されました。キーをすべて間違って取得していますか、それとも他にすべきことをしていませんか?

以下のコードは、リクエストを呼び出す方法でした

function createJwt (projectId, privateKeyFile, algorithm) {
    // Create a JWT to authenticate this device. The device will be disconnected
    // after the token expires, and will have to reconnect with a new token. The
    // audience field should always be set to the GCP project ID.
    const token = {
      'iat': parseInt(Date.now() / 1000),
      'exp': parseInt(Date.now() / 1000) + 20 * 60,  // 20 minutes
      'aud': projectId
    };
    const privateKey = fs.readFileSync(privateKeyFile);
    return jwt.sign(token, privateKey, { algorithm: algorithm });
}

app.get('/', function(req, res){

    let authToken = createJwt('test-project', './keys/device-config.pem', 'RS256');

    const options = {
        url: 'https://cloudiot.googleapis.com/v1/projects/test-project/locations/us-central1/registries/dev-registry/devices/test-device',
        headers: {
            'authorization': 'Bearer ' + authToken,
            'content-type': 'application/json',
            'cache-control': 'no-cache'
        },
        json: true
    }

    request.get(options, function(error, response){
        if(error) res.json(error);
        else res.json(response);
    })

});
4

3 に答える 3

1

バックエンド サーバーが IoT-Core とやり取りするための認証方法は、デバイスの MQTT または HTTP 接続の場合と同じではありません。参照: https://cloud.google.com/iot/docs/samples/device-manager-samples#get_a_device

以下のコードを使用して、デバイス構成を取得して更新することができました

function getClient (serviceAccountJson, cb) {
    const serviceAccount = JSON.parse(fs.readFileSync(serviceAccountJson));
    const jwtAccess = new google.auth.JWT();
    jwtAccess.fromJSON(serviceAccount);
    // Note that if you require additional scopes, they should be specified as a
    // string, separated by spaces.
    jwtAccess.scopes = 'https://www.googleapis.com/auth/cloud-platform';
    // Set the default authentication to the above JWT access.
    google.options({ auth: jwtAccess });

    const DISCOVERY_API = 'https://cloudiot.googleapis.com/$discovery/rest';
    const API_VERSION = 'v1';
    const discoveryUrl = `${DISCOVERY_API}?version=${API_VERSION}`;

    google.discoverAPI(discoveryUrl, {}, (err, client) => {
        if (err) {
        console.log('Error during API discovery', err);
        return undefined;
        }
        cb(client);
    });
}

function getDevice (client, deviceId, registryId, projectId, cloudRegion) {
    const parentName = `projects/${process.env.GCP_PROJECT_ID}/locations/${cloudRegion}`;
    const registryName = `${parentName}/registries/${registryId}`;
    const request = {
      name: `${registryName}/devices/${deviceId}`
    };

    const promise = new Promise(function(resolve, reject){
        client.projects.locations.registries.devices.get(request, (err, data) => {
            if (err) {
                console.log('Could not find device:', deviceId);
                console.log(err);
                reject(err);
            } else {
                console.log(data.config.binaryData);
                resolve(data);
            }
        });

    });
    return promise;
}

app.get('/', function(req, res){
    const cb = function(client){
        getDevice(client, 'test-device', 'dev-registry', process.env.GCP_PROJECT_ID, 'us-central1')
            .then(function(response){
                let decoded = new Buffer(response.config.binaryData, 'base64').toString();
                res.json(decoded);
            })
            .catch(function(error){
                res.json(error);
            })
    }
    getClient(serviceAccountJson, cb);

});
于 2017-12-19T09:27:12.237 に答える