passport-opskins
Version:
A simple passport strategy for authenticating users through the OPSkins platform
157 lines (139 loc) • 4.84 kB
Markdown
# passport-opskins
[](https://github.com/almatrass/passport-opskins/blob/master/LICENSE)
***
passport-opskins is a simple passport strategy for authenticating users through the OPSkins platform.
### Installation
```bash
npm i passport-opskins
```
### Usage
#### Setup
```js
const opStrategy = require('passport-opskins').Strategy;
```
```js
passport.use('opskins', new opStrategy({
name: 'YOUR SITE NAME',
returnURL: 'http://localhost/auth/opskins/return',
apiKey: 'YOUR OPSKINS API KEY',
scopes: 'identity_basic', // Space-separated list of identities
mobile: true, // Remove OPSkins NavBar
permanent: true, // Maintain permanent access to the account
debug: true // Displays error messages in the browser instead of redirecting
}, (user, done) => {
return done(null, user);
}));
```
#### Routes
```js
app.get(/^\/auth\/opskins(\/return)?$/, passport.authenticate('opskins', {
failureRedirect: '/'
}), (req, res) => {
// Success, redirect home
res.redirect('/')
});
```
#### Direct your user to logon
```html
<a href="/auth/opskins">Login</a>
```
#### The standard identity user object looks like this:
```js
user = {
id: 1688432,
id64: '76561198089553444',
username: 'Alma|Free stuff: gain.gg',
avatar: 'https://steamcdn-a.opskins.media/steamcommunity/public/images/avatars/57/579f19ab99a8e0b034e9a94a8d0530d4c621a26f_full.jpg',
preferred_currency: 102,
preferred_lang: 'en',
create_time: 1465080063,
password_set_time: 1474996832,
showcases: 0,
bumps: 0,
name: {
first: 'Almatrass',
last: 'SecondName'
},
email:{
contact_email: 'almatrass@gmail.com',
verified: true,
notifications: true },
twofactor: { enabled: true, enable_time: 1530483878 },
options: {
trade_url: 'https://steamcommunity.com/tradeoffer/new/?partner=129287716&token=JAYlMeXY',
balance_notify: null,
suggestion_type: 2,
hidden_balance: false,
private_sales_list: false
},
sales_list: 'https://opsk.in/u/24e61h',
access: {
access_token: 'AQAASRAAAAAAABnDcAAAAAFe+ctf/j6D0W1ZbCGSbORrhdjMyhsL8qSKDX6bhUrsn+kNoud=',
token_type: 'bearer',
expires_in: 1800,
refresh_token: 'wrqU1YzTYRhVEdx3uvkwYj9hZVceO72U',
scope: 'identity',
code: 'ZRufVQu8MTEJLCnN'
}
}
```
#### Scopes
You can find a full range of available scopes here: https://docs.opskins.com/public/en.html#scopes. For a simple logon page, only use identity.
#### Getting a new access token
##### Ignore this if you're only using this module for the purposes of logging a user on
The user object returned will contain an `access` object, which can be used when calling API endpoints on behalf of the user:
```js
let headers = {
'Authorization': `Bearer ${req.user.access.access_token}`
};
```
This access token is valid for 30 minutes. Endpoints will return an error like this after 30 minutes:
```json
{
"error": "invalid_token",
"error_description": "Bearer token has expired"
}
```
If you get this error, you can get a new `access_token` for the user by using the `refreshAccessToken` method on the module:
```js
strat.refreshAccessToken('REFRESH_TOKEN', (err, token) => {
if (err) return console.error(err);
console.log(token);
});
```
This would look something like this:
```js
app.get('/SOME_COOL_ROUTE', (req, res) => {
if (req.user) {
// Try to call some endpoint here (err, body)
if (JSON.parse(body).error == 'invalid_token') {
strat.refreshAccessToken(req.user.access.refresh_token, (err, token) => {
if (err) return res.end('An error occurred');
req.user.access.access_token = token;
// Go call endpoint again with updated req.user.access.access_token
});
}
}
});
```
Do note that you must have specified `permanent` in the `new opStrategy` constructor to refresh this access token, otherwise you'll just have to redirect the user to login again.
#### Test
`git clone https://github.com/almatrass/passport-opskins.git`
`cd passport-opskins/examples`
`npm i`
`node index`
The server will run on `localhost:3037`.
#### Extra notes
OPSkins limits the clients you can own. The module deletes all previous clients with the same `name`, or the same `returnURL` values. This should be fine, but if you reach the limit, you can simply call the `getClientList` along with the `deleteClient` functions on the strategy object:
```js
let strat = new opStrategy({
// config blah blah...
});
passport.use('opskins', strat);
strat.getClientList((err, result) => {
if (err) return console.error(err);
result.forEach(function(client) {
strat.deleteClient(client.client_id);
});
});
```