steam-forward / node-steam-forum

Forum about coding for Steam on Node.js and JavaScript
43 stars 6 forks source link

Unable to authenticate via the mobile app. #303

Open Dyceman opened 6 years ago

Dyceman commented 6 years ago
Checklist:
Problem description: Unable to authenticate when using the steam mobile authenticator
I have already tried: Authenticate using the mobile app.
My code:
var fs = require('fs');
var crypto = require('crypto');

var Steam = require('steam');
var SteamWebLogOn = require('steam-weblogon');
var getSteamAPIKey = require('steam-web-api-key');
var SteamTradeOffers = require('steam-tradeoffers'); // change to 'steam-tradeoffers' if not running from the examples subdirectory

var admin = ''; // put your steamid here so the bot can send you trade offers

var logOnOptions = {
  account_name: '',
  password: ''
};

var authCode = ''; // code received by email

try {
  logOnOptions.sha_sentryfile = getSHA1(fs.readFileSync('sentry'));
} catch (e) {
  if (authCode !== '') {
    logOnOptions.auth_code = authCode;
  }
}

// if we've saved a server list, use it
if (fs.existsSync('servers')) {
  Steam.servers = JSON.parse(fs.readFileSync('servers'));
}

var steamClient = new Steam.SteamClient();
var steamUser = new Steam.SteamUser(steamClient);
var steamFriends = new Steam.SteamFriends(steamClient);
var steamWebLogOn = new SteamWebLogOn(steamClient, steamUser);
var offers = new SteamTradeOffers();

steamClient.connect();
steamClient.on('connected', function() {
  steamUser.logOn(logOnOptions);
});

steamClient.on('debug', function(message) {
    console.log(message);
});

steamClient.on('error', function(error) {
    console.log(error);
});

function offerItems() {
  offers.loadMyInventory({
    appId: 252490,
    contextId: 2
  }, function(err, items) {

    //console.log(items);

    var item;

    for(var key in items)
    {
        if(items[key].tradable && items[key].classid == 1166471631)
        {
            item = items[key];
        }
    }

    // if there is such an item, making an offer with it
    if (item) {
      offers.makeOffer ({
        partnerSteamId: admin,
        itemsFromMe: [
            {
                appid: 252490,
                contextid: 2,
                amount: 1,
                assetid: item.id
            }
        ],
        itemsFromThem: [

        ],
        message: 'This is test'
      }, function(err, response) {
        if (err) {
          throw err;
        }
        console.log(response);
      });
    }

  });
}

steamClient.on('logOnResponse', function(logonResp) {
  if (logonResp.eresult === Steam.EResult.OK) {
    console.log('Logged in!');
    steamFriends.setPersonaState(Steam.EPersonaState.Online);

    steamWebLogOn.webLogOn(function(sessionID, newCookie) {
      getSteamAPIKey({
        sessionID: sessionID,
        webCookie: newCookie
      }, function(err, APIKey) {
        offers.setup({
          sessionID: sessionID,
          webCookie: newCookie,
          APIKey: APIKey
        });
        offerItems();
      });
    });
  }
});

steamClient.on('servers', function(servers) {
  fs.writeFile('servers', JSON.stringify(servers));
});

steamUser.on('updateMachineAuth', function(sentry, callback) {
  fs.writeFileSync('sentry', sentry.bytes);
  callback({ sha_file: getSHA1(sentry.bytes) });
});

function getSHA1(bytes) {
  var shasum = crypto.createHash('sha1');
  shasum.end(bytes);
  return shasum.read();
}
I use the following libraries:
alex7kom commented 6 years ago

The code you quoted (which is based on example from steam-tradeoffers lib) doesn't support mobile auth. You need to implement it yourself. Instead of auth_code or sha_sentryfile you need to specify code from your mobile auth app as two_factor_code.

See also: https://github.com/seishun/node-steam/wiki/Protobufs#cmsgclientlogon

Kladdkaka commented 6 years ago

@Dyceman I would recommend using @DoctorMcKay's libraries, they are way more high level and take care of more stuff for you :)