尝试使用 Firebase 通过 Steam OpenID 设置登录

Trying to set up a sign in through steam OpenID with Firebase

我目前正在从事一个涉及通过 Steam 登录的项目,我想涉及到 Firebase。我发现这个指南 (https://codepen.io/johnchristopherjones/post/setting-up-openid) 看起来很棒并且展示了这样做的方法,但看起来这个人设置 firebase 的方式现在已经过时了。我是这方面的新手,但我目前正在更新代码,但我遇到了错误,需要下一步该怎么做的指导,或者我走在正确的道路上?

Server.js

var express = require("express");
    var app = express();
    var session = require("express-session");
    var firebase = require("firebase")(session);

    var FirebaseStoreOptions = {
      host: "",

     token: "",
    reapInterval: 600000
     };

    app.use(
      (config = {
    apiKey: apiKey,
    authDomain: "firebaseapp.com",
    databaseURL: "",
    projectId: "",
      })
    );
firebase.initializeApp(config);

var openIdStrategy = require("password-openid").Strategy;
var SteamStrategy = new OpenIDStrategy(
  {
    // OpenID provider configuration
    providerURL: "http://steamcommunity.com/openid",
    stateless: true,
    // How the OpenID provider should return the client to us
    returnURL: "http://localhost:4000/auth/openid/return",
    realm: "http://localhost:4000/"
  },
  function(identifier, done) {
    process.nextTick(function() {
      var user = {
        identifier: identifier,
        steamId: identifier.match(/\d+$/)[0]
      };
      return done(null, user);
    });
  }
);

var passport = require("passport");
passport.use(SteamStrategy);
passport.serializeUser(function(user, done) {
  done(null, user.identifier);
});
passport.deserializeUser(function(identifier, done) {
  // For this demo, we'll just return an object literal since our user
  // objects are this trivial.  In the real world, you'd probably fetch
  // your user object from your database here.
  done(null, {
    identifier: identifier,
    steamId: identifier.match(/\d+$/)[0]
  });
});

app.use(passport.initialize());
app.use(passport.session());
app.post("/auth/openid", passport.authenticate("openid"));
app.get("/auth/openid/return", passport.authenticate("openid"), function(
  request,
  response
) {
  if (request.user) {
    response.redirect("/?steamid=" + request.user.steamId);
  } else {
    response.redirect("/?failed");
  }
});
app.post("/auth/logout", function(request, response) {
  request.logout();
  // After logging out, redirect the user somewhere useful.
  // Where they came from or the site root are good choices.
  response.redirect(request.get("Referer") || "/");
});
app.get("/", function(request, response) {
  response.write("<!DOCTYPE html>");
  if (request.user) {
    response.write(
      (request.session.passport && JSON.stringify(request.user)) || "None"
    );
    response.write('<form action="/auth/logout" method="post">');
    response.write('<input type="submit" value="Log Out"/></form>');
  } else {
    if (request.query.steamid) {
      response.write("Not logged in.");
    }
    response.write('<form action="/auth/openid" method="post">');
    response.write(
      '<input name="submit" type="image" src="http://steamcommunity-a.' +
        'akamaihd.net/public/images/signinthroughsteam/sits_small.png" ' +
        'alt="Sign in through Steam"/></form>'
    );
  }
  response.send();
});
var port = 4000;
var server = app.listen(port);
console.log("Listening on port " + port);

出于显而易见的原因,我在上面的代码中唯一删除的是我的 Firebase 信息。我目前的错误是 app.use() requires a middleware function。感谢您的帮助:)

您需要 2 个文件和这些依赖项才能使其正常工作。

server.js

const express = require('express');
const session = require('express-session');
const FirebaseStore = require('connect-session-firebase')(session);
const firebase = require('firebase-admin');
const ref = firebase.initializeApp({
credential: firebase.credential.cert('steam.json'),
databaseURL: '**your firebase database name**.firebaseio.com'
});
var app = express();


app.use(session({
store: new FirebaseStore({
  database: ref.database()
}),
secret: 'keyboard cat',
resave: true,
saveUninitialized: true
}));

var OpenIDStrategy = require('passport-openid').Strategy;
var SteamStrategy = new OpenIDStrategy({
    // OpenID provider configuration
    providerURL: 'http://steamcommunity.com/openid',
    stateless: true,
    // How the OpenID provider should return the client to us
    returnURL: 'http://localhost:4000/auth/openid/return',
    realm: 'http://localhost:4000/',
},
function(identifier, done) {
    process.nextTick(function () {
        var user = {
            identifier: identifier,
            steamId: identifier.match(/\d+$/)[0]
        };
        return done(null, user);
    });
});

var passport = require('passport');
passport.use(SteamStrategy);

passport.serializeUser(function(user, done) {
done(null, user.identifier);
});

passport.deserializeUser(function(identifier, done) {
done(null, {
    identifier: identifier,
    steamId: identifier.match(/\d+$/)[0]
});
});

app.use(passport.initialize());
app.use(passport.session());

app.post('/auth/openid', passport.authenticate('openid'));

app.get('/auth/openid/return', passport.authenticate('openid'),
function(request, response) {
    if (request.user) {
        response.redirect('/?steamid=' + request.user.steamId);
    } else {
        response.redirect('/?failed');
    }
});

app.post('/auth/logout', function(request, response) {
request.logout();
response.redirect(request.get('Referer') || '/')
});

app.get('/', function(request, response) {
response.write('<!DOCTYPE html>')
if (request.user) {
    response.write(request.session.passport &&
        JSON.stringify(request.user) || 'None');
    response.write('<form action="/auth/logout" method="post">');
    response.write('<input type="submit" value="Log Out"/></form>');
} else {
    if (request.query.steamid) {
        response.write('Not logged in.');
    }
    response.write('<form action="/auth/openid" method="post">');
    response.write(
        '<input name="submit" type="image" src="http://steamcommunity-a.' +
        'akamaihd.net/public/images/signinthroughsteam/sits_small.png" ' +
        'alt="Sign in through Steam"/></form>');
}
response.send();
});

var port = 4000;
var server = app.listen(port);
console.log('Listening on port ' + port);

steam.json 在此处复制您的 firebase 服务帐户凭据 例如像这样

{
"type": "service_account",
"project_id": "",
"private_key_id": "",
"private_key": "-----BEGIN PRIVATE KEY-----\n-----END PRIVATE KEY-----\n",
"client_email": "",
"client_id": "",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://accounts.google.com/o/oauth2/token",
"auth_provider_x509_cert_url": "",
"client_x509_cert_url":  ""
}

依赖关系

"dependencies": {
"connect-session-firebase": "^4.0.1",
"express": "^4.14.0",
"express-session": "^1.14.2",
"firebase-admin": "^4.0.4",
"passport": "^0.3.2",
"passport-openid": "^0.4.0"
},