/SteamAuth

NodeJS Steam authenticator, login and trade confirmations

Primary LanguageJavaScriptGNU General Public License v3.0GPL-3.0

SteamAuth for NodeJS

Implementation of mobile SteamGuard 2FA codes and trading confirmations.

Installation

Expand latest SteamAuth-X.X.X.zip into your project folder.

Usage

Authenticator codes

Add require.

var SteamAuth = require("steamauth"); // if using npm registry

var SteamAuth = require("./SteamAuth"); // if using zip file installation

In normal cases, a time-sync must be done either for SteamAuth or individual SteamAuth instances. This sets the drift between the host computer and Steam servers needed to calculate the correct code.

// Perform an initial time sync
SteamAuth.Sync(function(err)
{
	// we can now create instances
});

Time syncing can also be done on a per-instance basis, by event or callback.

// create a single instance with ready event
var auth = new SteamAuth("KNUGC4TFMRJWKY3SMV2A====");
auth.once("ready", function()
{
	// auth can now be used
});

// create a single instance with callback
var auth = new SteamAuth("KNUGC4TFMRJWKY3SMV2A====", function(err)
{
	// auth can now be used
});

Creating SteamAuth instances can be done with a Base32 string or object with shared_secret.

// simple example with a Base32 code (from WinAuth)
var auth = new SteamAuth("KNUGC4TFMRJWKY3SMV2A====");
var code = auth.calculateCode();

// example with options loaded from Android Steam mobile app
var auth = new SteamAuth({
	shared_secret:"U2hhcmVkU2VjcmV0"
});
var code = auth.calculateCode();

// calculate a code for a specific time (in ms)
var code = auth.calculateCode({time:1449690657000);

If you already have the correct time, you can just jump in and create codes.

// create an authenticator with no time sync
var auth = new SteamAuth({
	shared_secret: "U2hhcmVkU2VjcmV0",
	sync: false
});
// create code for specific time
var code = auth.calculateCode({time:1449690657000});

// quickly create a code for a known secret and time
var code = SteamAuth.calculateCode("KRUGS42JONGXSQ3PMVLTGRLH", 1449690657000);

Trade Confirmations

Trade confirmations require a login to the SteamAuth instance. In this case, you must additionally pass in the deviceid and identity_secret from the steam authenticator.

// create instance with options loaded from Android Steam mobile app
var auth = new SteamAuth({
	deviceid:"android:631471e5-00c8-4e9b-b0e9-45b69426cd09",
	shared_secret:"U2hhcmVkU2VjcmV0",
	identity_secret:"SWRlbnRpdHlTZWNyZXQ="
});

You can then login with username and password.

// login the user
auth.login({
	username:"mysteamuser",
	password:"mypassword"
}, function(err, session)
{
});

Login can fail because of network errors, but also invalid password, authcode or a captcha is required. If a captcha is required, err will contain captchaid and captchurl properties. The captcha must be solved and passed back in to a new login.

// login the user with captcha
auth.login({
	username:"mysteamuser",
	password:"mypassword",
	captchid:12345678,
	captchatext:"ABCDEFG"
}, function(err, session)
{
});

On login, you can get an array of the current trade confirmations.

auth.getTradeConfirmations(function(err, trades)
{
	if (err || !trades.length) return;	
	
});

Trades are returned as summary objects containing: id:string, key:string, details:string, traded:string, when:string. The id and key are used to accept or reject.

// to accept a trade
auth.acceptTradeConfirmation(trade.id, trade.key, function(err)
{
	// trade has been accepted
});
	
// to reject a trade
auth.rejectTradeConfirmation(trade.id, trade.key, function(err)
{
	// trade has been rejected
});

Logging

SteamAuth uses bunyan to log activity. You can get the logger instance at SteamAuth.Logger and set the level, e.g.

// change logging to be "debug"
var SteamAuth = require("steamauth");
SteamAuth.Logger.level("debug");

Levels are "error", "warn", "info" and "debug". The default level is "warn".

Debug level logging will include all web request made to the Steam servers.

Tests

npm test