├── .github ├── CONTRIBUTING.md ├── SECURITY.md └── workflows │ └── npm-publish.yml ├── .gitignore ├── LICENSE ├── README.md ├── index.js ├── package-lock.json └── package.json /.github/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing Guide 2 | 3 | Thank you for investing your time in contributing to our project! Any contribution you make will be reflected on the project's NPM page ✨. 4 | 5 | In this guide, you will get an overview of the contribution workflow from opening an issue, creating a PR, reviewing, and merging the PR. 6 | 7 | ## New contributor guide 8 | 9 | To get an overview of the project, read the [README](README.md) file. Here are some resources to help you get started with open-source contributions: 10 | 11 | - [Finding ways to contribute to open source on GitHub](https://docs.github.com/en/get-started/exploring-projects-on-github/finding-ways-to-contribute-to-open-source-on-github) 12 | - [Set up Git](https://docs.github.com/en/get-started/quickstart/set-up-git) 13 | - [GitHub flow](https://docs.github.com/en/get-started/quickstart/github-flow) 14 | 15 | ### Issues 16 | 17 | #### Create a new issue 18 | 19 | If you spot a problem with the package, [search if an issue already exists](https://docs.github.com/en/github/searching-for-information-on-github/searching-on-github/searching-issues-and-pull-requests#search-by-the-title-body-or-comments). If a related issue doesn't exist, you can open a new issue using the [issue form](https://github.com/LeeviHalme/node-steam-openid/issues/new). 20 | 21 | #### Solve an issue 22 | 23 | Scan through our [existing issues](https://github.com/LeeviHalme/node-steam-openid/issues) to find one that interests you. You can narrow down the search using `labels` as filters. See "[Label reference](https://docs.github.com/en/contributing/collaborating-on-github-docs/label-reference)" for more information. As a general rule, we don’t assign issues to anyone. If you find an issue to work on, you are welcome to open a PR with a fix. 24 | 25 | ### Make Changes 26 | #### Make changes locally 27 | 28 | 1. Fork the repository. 29 | - Using GitHub Desktop: 30 | - [Getting started with GitHub Desktop](https://docs.github.com/en/desktop/installing-and-configuring-github-desktop/getting-started-with-github-desktop) will guide you through setting up Desktop. 31 | - Once Desktop is set up, you can use it to [fork the repo](https://docs.github.com/en/desktop/contributing-and-collaborating-using-github-desktop/cloning-and-forking-repositories-from-github-desktop)! 32 | 33 | - Using the command line: 34 | - [Fork the repo](https://docs.github.com/en/github/getting-started-with-github/fork-a-repo#fork-an-example-repository) so that you can make your changes without affecting the original project until you're ready to merge them. 35 | 36 | 2. Install or update to **Node.js** to the project version. 37 | 38 | 3. Create a working branch and start with your changes! 39 | 40 | ### Commit your update 41 | 42 | Commit the changes once you are happy with them. Double-check that you have staged all of the files you want to commit and that you are committing to the correct branch to speed up the review process :zap: 43 | 44 | ### Pull Request 45 | 46 | When you're finished with the changes, create a pull request, also known as a PR. 47 | - Don't forget to [link PR to issue](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue) if you are solving one. 48 | - Enable the checkbox to [allow maintainer edits](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/allowing-changes-to-a-pull-request-branch-created-from-a-fork) so the branch can be updated for a merge. 49 | Once you submit your PR, a contributor will review your proposal. We may ask questions or request additional information. 50 | - We may ask for changes to be made before a PR can be merged, either using [suggested changes](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/incorporating-feedback-in-your-pull-request) or pull request comments. You can apply suggested changes directly through the UI. You can make any other changes in your fork, and then commit them to your branch. 51 | - As you update your PR and apply changes, mark each conversation as [resolved](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/commenting-on-a-pull-request#resolving-conversations). 52 | - If you run into any merge issues, check out this [git tutorial](https://github.com/skills/resolve-merge-conflicts) to help you resolve merge conflicts and other issues. 53 | 54 | ### Your PR is merged! 55 | 56 | Congratulations :tada::tada: I personally thank you for your contribution :sparkles:. 57 | 58 | Once your PR is merged, your contributions will be publicly visible on the [NPM page](https://npmjs.com/package/node-steam-openid). 59 | -------------------------------------------------------------------------------- /.github/SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security Policy 2 | 3 | The owner of this repository takes the security of their packages seriously. 4 | 5 | If you believe you have found a security vulnerability in this package or repository, please report it as described below. 6 | 7 | ## Supported Versions 8 | 9 | Security updates are applied only to the latest release. 10 | 11 | ## Reporting a Vulnerability 12 | 13 | If you have discovered a security vulnerability in this project, please report it privately. **Do not disclose it as a public issue.** This gives us time to work with you to fix the issue before public exposure, reducing the chance that the exploit will be used before a patch is released. 14 | 15 | Please disclose it at [security advisory](https://github.com/LeeviHalme/node-steam-openid/security/advisories/new). 16 | 17 | This project is maintained by volunteers on a reasonable-effort basis. As such, vulnerabilities will be disclosed in a best effort base. 18 | -------------------------------------------------------------------------------- /.github/workflows/npm-publish.yml: -------------------------------------------------------------------------------- 1 | # This workflow will run tests using node and then publish a package to GitHub Packages when a release is created 2 | # For more information see: https://docs.github.com/en/actions/publishing-packages/publishing-nodejs-packages 3 | 4 | name: CI / Publish to NPM 5 | 6 | on: 7 | push: 8 | branches: 9 | - master 10 | 11 | jobs: 12 | npm-publish: 13 | runs-on: ubuntu-latest 14 | steps: 15 | - uses: actions/checkout@v3 16 | - uses: actions/setup-node@v3 17 | with: 18 | node-version: 16 19 | registry-url: https://registry.npmjs.org/ 20 | - run: npm ci 21 | - run: npm publish --access public 22 | env: 23 | NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} 24 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | .pnpm-debug.log* 9 | 10 | # Diagnostic reports (https://nodejs.org/api/report.html) 11 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 12 | 13 | # Runtime data 14 | pids 15 | *.pid 16 | *.seed 17 | *.pid.lock 18 | 19 | # Directory for instrumented libs generated by jscoverage/JSCover 20 | lib-cov 21 | 22 | # Coverage directory used by tools like istanbul 23 | coverage 24 | *.lcov 25 | 26 | # nyc test coverage 27 | .nyc_output 28 | 29 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 30 | .grunt 31 | 32 | # Bower dependency directory (https://bower.io/) 33 | bower_components 34 | 35 | # node-waf configuration 36 | .lock-wscript 37 | 38 | # Compiled binary addons (https://nodejs.org/api/addons.html) 39 | build/Release 40 | 41 | # Dependency directories 42 | node_modules/ 43 | jspm_packages/ 44 | 45 | # Snowpack dependency directory (https://snowpack.dev/) 46 | web_modules/ 47 | 48 | # TypeScript cache 49 | *.tsbuildinfo 50 | 51 | # Optional npm cache directory 52 | .npm 53 | 54 | # Optional eslint cache 55 | .eslintcache 56 | 57 | # Optional stylelint cache 58 | .stylelintcache 59 | 60 | # Microbundle cache 61 | .rpt2_cache/ 62 | .rts2_cache_cjs/ 63 | .rts2_cache_es/ 64 | .rts2_cache_umd/ 65 | 66 | # Optional REPL history 67 | .node_repl_history 68 | 69 | # Output of 'npm pack' 70 | *.tgz 71 | 72 | # Yarn Integrity file 73 | .yarn-integrity 74 | 75 | # dotenv environment variable files 76 | .env 77 | .env.development.local 78 | .env.test.local 79 | .env.production.local 80 | .env.local 81 | 82 | # parcel-bundler cache (https://parceljs.org/) 83 | .cache 84 | .parcel-cache 85 | 86 | # Next.js build output 87 | .next 88 | out 89 | 90 | # Nuxt.js build / generate output 91 | .nuxt 92 | dist 93 | 94 | # Gatsby files 95 | .cache/ 96 | # Comment in the public line in if your project uses Gatsby and not Next.js 97 | # https://nextjs.org/blog/next-9-1#public-directory-support 98 | # public 99 | 100 | # vuepress build output 101 | .vuepress/dist 102 | 103 | # vuepress v2.x temp and cache directory 104 | .temp 105 | .cache 106 | 107 | # Docusaurus cache and generated files 108 | .docusaurus 109 | 110 | # Serverless directories 111 | .serverless/ 112 | 113 | # FuseBox cache 114 | .fusebox/ 115 | 116 | # DynamoDB Local files 117 | .dynamodb/ 118 | 119 | # TernJS port file 120 | .tern-port 121 | 122 | # Stores VSCode versions used for testing VSCode extensions 123 | .vscode-test 124 | 125 | # yarn v2 126 | .yarn/cache 127 | .yarn/unplugged 128 | .yarn/build-state.yml 129 | .yarn/install-state.gz 130 | .pnp.* -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Leevi Halme 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # node-steam-openid 2 | 3 | [![npm version](https://badge.fury.io/js/node-steam-openid.svg)](https://badge.fury.io/js/node-steam-openid) 4 | ![npm ci](https://github.com/LeeviHalme/node-steam-openid/actions/workflows/npm-publish.yml/badge.svg) 5 | 6 | A lightweight wrapper package around Steam's Authentication API, which supports promises :) 7 | 8 | ## Requirements 9 | 10 | - Express @ 4.x 11 | 12 | ## Usage 13 | 14 | Install the package by typing `npm i node-steam-openid` in your project folder. 15 | 16 | ### Setup 17 | 18 | ```javascript 19 | const SteamAuth = require("node-steam-openid"); 20 | 21 | const steam = new SteamAuth({ 22 | realm: "http://localhost:5000", // Site name displayed to users on logon 23 | returnUrl: "http://localhost:5000/auth/steam/authenticate", // Your return route 24 | apiKey: "XXXXXXXXXXXXXXXXXXXXXXXXXX", // Steam API key 25 | }); 26 | ``` 27 | 28 | ### Routes 29 | 30 | ```javascript 31 | app.get("/auth/steam", async (req, res) => { 32 | const redirectUrl = await steam.getRedirectUrl(); 33 | return res.redirect(redirectUrl); 34 | }); 35 | 36 | app.get("/auth/steam/authenticate", async (req, res) => { 37 | try { 38 | const user = await steam.authenticate(req); 39 | 40 | //...do something with the data 41 | } catch (error) { 42 | console.error(error); 43 | } 44 | }); 45 | ``` 46 | 47 | ## Methods 48 | 49 | ### getRedirectUrl 50 | 51 | Gets the redirect URL to Steam. 52 | 53 | #### Parameters 54 | 55 | None 56 | 57 | #### Returns 58 | 59 | - Promise (String) 60 | 61 | #### Example 62 | 63 | ```javascript 64 | steam.getRedirectUrl().then(url => { 65 | //...do something with the url 66 | }); 67 | ``` 68 | 69 | ### authenticate 70 | 71 | Authenticates the user with oAuth. 72 | 73 | #### Parameters 74 | 75 | - request (ExpressJsRequest, Object) 76 | 77 | #### Returns 78 | 79 | - Promise (UserObject) 80 | 81 | #### Example 82 | 83 | ```javascript 84 | steam.authenticate(req).then(user => { 85 | //...do something with the user 86 | }); 87 | ``` 88 | 89 | ## Objects 90 | 91 | ### UserObject 92 | 93 | Object which holds all the authenticated user's data. The key `_json` holds the raw response from Steam API. 94 | 95 | #### Example 96 | 97 | ```javascript 98 | { 99 | _json: { ... }, 100 | steamid: "12345678912345678", 101 | username: "Example Username", 102 | name: "Example Name", 103 | profile: { 104 | url: "https://steamcommunity.com/id/Example", 105 | background: { 106 | static: "....jpg" | null, 107 | movie: "....webm" | null, 108 | }, 109 | background_mini: { 110 | static: "....jpg" | null, 111 | movie: "....webm" | null, 112 | }, 113 | }, 114 | avatar: { 115 | small: "...", 116 | medium: "...", 117 | large: "...", 118 | animated: { 119 | static: "....png" | null, 120 | movie: "....webm" | null, 121 | }, 122 | frame: { 123 | static: "....png" | null, 124 | movie: "....webm" | null, 125 | }, 126 | } 127 | } 128 | ``` 129 | 130 | ## Contributing 131 | 132 | See [CONTRIBUTING.md](/.github/CONTRIBUTING.md) for contributing guidelines. 133 | 134 | ## Security 135 | 136 | See [SECURITY.md](/.github/SECURITY.md) for security practices. 137 | 138 | ## Development Roadmap 139 | 140 | - [ ] Add the ability to pass custom variables to Steam (query parameters) 141 | - [ ] Add support for Node.js native HTTP [](https://nodejs.org/dist/latest-v14.x/docs/api/http.html#http_class_http_incomingmessage) class. 142 | - [ ] Add unit tests 143 | 144 | ## License 145 | 146 | MIT <3 147 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | // Require Dependencies 2 | const axios = require("axios"); 3 | const openid = require("openid"); 4 | const url = require("url"); 5 | 6 | const OPENID_CHECK = { 7 | ns: 'http://specs.openid.net/auth/2.0', 8 | op_endpoint: 'https://steamcommunity.com/openid/login', 9 | claimed_id: 'https://steamcommunity.com/openid/id/', 10 | identity: 'https://steamcommunity.com/openid/id/', 11 | }; 12 | 13 | // Main Class 14 | class SteamAuth { 15 | constructor({ realm, returnUrl, apiKey }) { 16 | if (!realm || !returnUrl || !apiKey) 17 | throw new Error( 18 | "Missing realm, returnURL or apiKey parameter(s). These are required." 19 | ); 20 | 21 | this.realm = realm; 22 | this.returnUrl = returnUrl; 23 | this.apiKey = apiKey; 24 | this.relyingParty = new openid.RelyingParty( 25 | returnUrl, 26 | realm, 27 | true, 28 | true, 29 | [] 30 | ); 31 | } 32 | 33 | // Get redirect url for Steam 34 | async getRedirectUrl() { 35 | return new Promise((resolve, reject) => { 36 | this.relyingParty.authenticate( 37 | "https://steamcommunity.com/openid", 38 | false, 39 | (error, authUrl) => { 40 | if (error) return reject("Authentication failed: " + error); 41 | if (!authUrl) return reject("Authentication failed."); 42 | 43 | resolve(authUrl); 44 | } 45 | ); 46 | }); 47 | } 48 | 49 | // Fetch user 50 | async fetchIdentifier(steamOpenId) { 51 | return new Promise(async (resolve, reject) => { 52 | // Parse steamid from the url 53 | const steamId = steamOpenId.replace( 54 | "https://steamcommunity.com/openid/id/", 55 | "" 56 | ); 57 | 58 | try { 59 | const response = await axios.get( 60 | `https://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=${this.apiKey}&steamids=${steamId}` 61 | ); 62 | 63 | const { players } = response.data && response.data.response; 64 | 65 | if (players && players.length > 0) { 66 | // Get the player 67 | const player = players[0]; 68 | 69 | const profileItems = await axios.get( 70 | `https://api.steampowered.com/IPlayerService/GetProfileItemsEquipped/v1/?steamid=${steamId}` 71 | ); 72 | 73 | const { 74 | avatar_frame, 75 | animated_avatar, 76 | profile_background, 77 | mini_profile_background } = profileItems.data && profileItems.data.response; 78 | 79 | const cdnUrl = "https://cdn.akamai.steamstatic.com/steamcommunity/public/images" 80 | 81 | // Return user data 82 | resolve({ 83 | _json: player, 84 | steamid: steamId, 85 | username: player.personaname, 86 | name: player.realname, 87 | profile: { 88 | url: player.profileurl, 89 | background: { 90 | static: profile_background?.image_large ? `${cdnUrl}/${profile_background?.image_large}` : null, 91 | movie: profile_background?.movie_webm ? `${cdnUrl}/${profile_background?.movie_webm}` : null, 92 | }, 93 | background_mini: { 94 | static: mini_profile_background?.image_large ? `${cdnUrl}/${mini_profile_background?.image_large}` : null, 95 | movie: mini_profile_background?.movie_webm ? `${cdnUrl}/${mini_profile_background?.movie_webm}` : null, 96 | }, 97 | }, 98 | avatar: { 99 | small: player.avatar, 100 | medium: player.avatarmedium, 101 | large: player.avatarfull, 102 | animated: { 103 | static: animated_avatar?.image_large ? `${cdnUrl}/${animated_avatar?.image_large}` : player.avatarfull, 104 | movie: animated_avatar?.image_small ? `${cdnUrl}/${animated_avatar?.image_small}` : player.avatarfull, 105 | }, 106 | frame: { 107 | static: avatar_frame?.image_large ? `${cdnUrl}/${avatar_frame?.image_large}` : null, 108 | movie: avatar_frame?.image_small ? `${cdnUrl}/${avatar_frame?.image_small}` : null 109 | } 110 | } 111 | }); 112 | } else { 113 | reject("No players found for the given SteamID."); 114 | } 115 | } catch (error) { 116 | reject("Steam server error: " + error.message); 117 | } 118 | }); 119 | } 120 | 121 | // Authenticate user 122 | async authenticate(req) { 123 | return new Promise((resolve, reject) => { 124 | const searchParams = url.parse(req.url, true).query; 125 | 126 | if (searchParams['openid.ns'] !== OPENID_CHECK.ns) return reject("Claimed identity is not valid."); 127 | if (searchParams['openid.op_endpoint'] !== OPENID_CHECK.op_endpoint) return reject("Claimed identity is not valid."); 128 | if (!searchParams['openid.claimed_id']?.startsWith(OPENID_CHECK.claimed_id)) return reject("Claimed identity is not valid."); 129 | if (!searchParams['openid.identity']?.startsWith(OPENID_CHECK.identity)) return reject("Claimed identity is not valid."); 130 | 131 | // Verify assertion 132 | this.relyingParty.verifyAssertion(req, async (error, result) => { 133 | if (error) return reject(error.message); 134 | if (!result || !result.authenticated) 135 | return reject("Failed to authenticate user."); 136 | if ( 137 | !/^https?:\/\/steamcommunity\.com\/openid\/id\/\d+$/.test( 138 | result.claimedIdentifier 139 | ) 140 | ) 141 | return reject("Claimed identity is not valid."); 142 | 143 | try { 144 | const user = await this.fetchIdentifier(result.claimedIdentifier); 145 | 146 | return resolve(user); 147 | } catch (error) { 148 | reject(error); 149 | } 150 | }); 151 | }); 152 | } 153 | } 154 | 155 | // Export class 156 | module.exports = SteamAuth; 157 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "node-steam-openid", 3 | "version": "2.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "node-steam-openid", 9 | "version": "2.0.0", 10 | "license": "MIT", 11 | "dependencies": { 12 | "axios": "^1.6.0", 13 | "openid": "^2.0.6", 14 | "url": "^0.11.1" 15 | } 16 | }, 17 | "node_modules/asynckit": { 18 | "version": "0.4.0", 19 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 20 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 21 | }, 22 | "node_modules/axios": { 23 | "version": "1.7.7", 24 | "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", 25 | "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", 26 | "dependencies": { 27 | "follow-redirects": "^1.15.6", 28 | "form-data": "^4.0.0", 29 | "proxy-from-env": "^1.1.0" 30 | } 31 | }, 32 | "node_modules/call-bind": { 33 | "version": "1.0.7", 34 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", 35 | "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", 36 | "dependencies": { 37 | "es-define-property": "^1.0.0", 38 | "es-errors": "^1.3.0", 39 | "function-bind": "^1.1.2", 40 | "get-intrinsic": "^1.2.4", 41 | "set-function-length": "^1.2.1" 42 | }, 43 | "engines": { 44 | "node": ">= 0.4" 45 | }, 46 | "funding": { 47 | "url": "https://github.com/sponsors/ljharb" 48 | } 49 | }, 50 | "node_modules/combined-stream": { 51 | "version": "1.0.8", 52 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 53 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 54 | "dependencies": { 55 | "delayed-stream": "~1.0.0" 56 | }, 57 | "engines": { 58 | "node": ">= 0.8" 59 | } 60 | }, 61 | "node_modules/define-data-property": { 62 | "version": "1.1.4", 63 | "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", 64 | "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", 65 | "dependencies": { 66 | "es-define-property": "^1.0.0", 67 | "es-errors": "^1.3.0", 68 | "gopd": "^1.0.1" 69 | }, 70 | "engines": { 71 | "node": ">= 0.4" 72 | }, 73 | "funding": { 74 | "url": "https://github.com/sponsors/ljharb" 75 | } 76 | }, 77 | "node_modules/delayed-stream": { 78 | "version": "1.0.0", 79 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 80 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 81 | "engines": { 82 | "node": ">=0.4.0" 83 | } 84 | }, 85 | "node_modules/es-define-property": { 86 | "version": "1.0.0", 87 | "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", 88 | "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", 89 | "dependencies": { 90 | "get-intrinsic": "^1.2.4" 91 | }, 92 | "engines": { 93 | "node": ">= 0.4" 94 | } 95 | }, 96 | "node_modules/es-errors": { 97 | "version": "1.3.0", 98 | "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", 99 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", 100 | "engines": { 101 | "node": ">= 0.4" 102 | } 103 | }, 104 | "node_modules/follow-redirects": { 105 | "version": "1.15.9", 106 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", 107 | "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", 108 | "funding": [ 109 | { 110 | "type": "individual", 111 | "url": "https://github.com/sponsors/RubenVerborgh" 112 | } 113 | ], 114 | "engines": { 115 | "node": ">=4.0" 116 | }, 117 | "peerDependenciesMeta": { 118 | "debug": { 119 | "optional": true 120 | } 121 | } 122 | }, 123 | "node_modules/form-data": { 124 | "version": "4.0.1", 125 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", 126 | "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", 127 | "dependencies": { 128 | "asynckit": "^0.4.0", 129 | "combined-stream": "^1.0.8", 130 | "mime-types": "^2.1.12" 131 | }, 132 | "engines": { 133 | "node": ">= 6" 134 | } 135 | }, 136 | "node_modules/function-bind": { 137 | "version": "1.1.2", 138 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 139 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 140 | "funding": { 141 | "url": "https://github.com/sponsors/ljharb" 142 | } 143 | }, 144 | "node_modules/get-intrinsic": { 145 | "version": "1.2.4", 146 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", 147 | "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", 148 | "dependencies": { 149 | "es-errors": "^1.3.0", 150 | "function-bind": "^1.1.2", 151 | "has-proto": "^1.0.1", 152 | "has-symbols": "^1.0.3", 153 | "hasown": "^2.0.0" 154 | }, 155 | "engines": { 156 | "node": ">= 0.4" 157 | }, 158 | "funding": { 159 | "url": "https://github.com/sponsors/ljharb" 160 | } 161 | }, 162 | "node_modules/gopd": { 163 | "version": "1.0.1", 164 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", 165 | "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", 166 | "dependencies": { 167 | "get-intrinsic": "^1.1.3" 168 | }, 169 | "funding": { 170 | "url": "https://github.com/sponsors/ljharb" 171 | } 172 | }, 173 | "node_modules/has-property-descriptors": { 174 | "version": "1.0.2", 175 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", 176 | "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", 177 | "dependencies": { 178 | "es-define-property": "^1.0.0" 179 | }, 180 | "funding": { 181 | "url": "https://github.com/sponsors/ljharb" 182 | } 183 | }, 184 | "node_modules/has-proto": { 185 | "version": "1.0.3", 186 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", 187 | "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", 188 | "engines": { 189 | "node": ">= 0.4" 190 | }, 191 | "funding": { 192 | "url": "https://github.com/sponsors/ljharb" 193 | } 194 | }, 195 | "node_modules/has-symbols": { 196 | "version": "1.0.3", 197 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 198 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 199 | "engines": { 200 | "node": ">= 0.4" 201 | }, 202 | "funding": { 203 | "url": "https://github.com/sponsors/ljharb" 204 | } 205 | }, 206 | "node_modules/hasown": { 207 | "version": "2.0.2", 208 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 209 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 210 | "dependencies": { 211 | "function-bind": "^1.1.2" 212 | }, 213 | "engines": { 214 | "node": ">= 0.4" 215 | } 216 | }, 217 | "node_modules/mime-db": { 218 | "version": "1.52.0", 219 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 220 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 221 | "engines": { 222 | "node": ">= 0.6" 223 | } 224 | }, 225 | "node_modules/mime-types": { 226 | "version": "2.1.35", 227 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 228 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 229 | "dependencies": { 230 | "mime-db": "1.52.0" 231 | }, 232 | "engines": { 233 | "node": ">= 0.6" 234 | } 235 | }, 236 | "node_modules/object-inspect": { 237 | "version": "1.13.3", 238 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", 239 | "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", 240 | "engines": { 241 | "node": ">= 0.4" 242 | }, 243 | "funding": { 244 | "url": "https://github.com/sponsors/ljharb" 245 | } 246 | }, 247 | "node_modules/openid": { 248 | "version": "2.0.12", 249 | "resolved": "https://registry.npmjs.org/openid/-/openid-2.0.12.tgz", 250 | "integrity": "sha512-Mga9CvtLy3NXTWs6QZ1yhCbam9foyEL3PjCgjzBwDRWdjt10I9W7eVMx0RZ0MNJAkGJp72pawtr4C9CyUy+wPQ==", 251 | "dependencies": { 252 | "axios": "^1.6.0", 253 | "qs": "^6.5.2" 254 | }, 255 | "engines": { 256 | "node": ">= 0.6.0" 257 | } 258 | }, 259 | "node_modules/proxy-from-env": { 260 | "version": "1.1.0", 261 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 262 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" 263 | }, 264 | "node_modules/punycode": { 265 | "version": "1.4.1", 266 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 267 | "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" 268 | }, 269 | "node_modules/qs": { 270 | "version": "6.13.1", 271 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.1.tgz", 272 | "integrity": "sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==", 273 | "dependencies": { 274 | "side-channel": "^1.0.6" 275 | }, 276 | "engines": { 277 | "node": ">=0.6" 278 | }, 279 | "funding": { 280 | "url": "https://github.com/sponsors/ljharb" 281 | } 282 | }, 283 | "node_modules/set-function-length": { 284 | "version": "1.2.2", 285 | "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", 286 | "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", 287 | "dependencies": { 288 | "define-data-property": "^1.1.4", 289 | "es-errors": "^1.3.0", 290 | "function-bind": "^1.1.2", 291 | "get-intrinsic": "^1.2.4", 292 | "gopd": "^1.0.1", 293 | "has-property-descriptors": "^1.0.2" 294 | }, 295 | "engines": { 296 | "node": ">= 0.4" 297 | } 298 | }, 299 | "node_modules/side-channel": { 300 | "version": "1.0.6", 301 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", 302 | "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", 303 | "dependencies": { 304 | "call-bind": "^1.0.7", 305 | "es-errors": "^1.3.0", 306 | "get-intrinsic": "^1.2.4", 307 | "object-inspect": "^1.13.1" 308 | }, 309 | "engines": { 310 | "node": ">= 0.4" 311 | }, 312 | "funding": { 313 | "url": "https://github.com/sponsors/ljharb" 314 | } 315 | }, 316 | "node_modules/url": { 317 | "version": "0.11.4", 318 | "resolved": "https://registry.npmjs.org/url/-/url-0.11.4.tgz", 319 | "integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==", 320 | "dependencies": { 321 | "punycode": "^1.4.1", 322 | "qs": "^6.12.3" 323 | }, 324 | "engines": { 325 | "node": ">= 0.4" 326 | } 327 | } 328 | } 329 | } 330 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "node-steam-openid", 3 | "version": "2.0.0", 4 | "description": "A wrapper package around Steam's Authentication API. Supports promises :)", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "git+https://github.com/LeeviHalme/node-steam-openid.git" 12 | }, 13 | "keywords": [ 14 | "steam", 15 | "oauth", 16 | "api", 17 | "promises" 18 | ], 19 | "author": "Leevi Halme (https://leevihal.me)", 20 | "license": "MIT", 21 | "bugs": { 22 | "url": "https://github.com/LeeviHalme/node-steam-openid/issues" 23 | }, 24 | "homepage": "https://github.com/LeeviHalme/node-steam-openid#readme", 25 | "dependencies": { 26 | "axios": "^1.6.0", 27 | "openid": "^2.0.6", 28 | "url": "^0.11.1" 29 | } 30 | } 31 | --------------------------------------------------------------------------------