google有几种方法可以检查文件是否为空,但我需要做相反的事情.
If (file is NOT empty)
do things
Run Code Online (Sandbox Code Playgroud)
我怎么批量做?
快速背景:
我正在编写一个Mongo/Express/Angular/Node SPA并使用护照我已经设置了OAuth登录选项来处理用户身份验证/授权.
使用护照我在服务器上成功维护会话,因此我的所有XHR请求(需要它)都在检查登录用户.
在登录服务器时,将基本用户会话信息放入cookie中供客户端在授权回调中查找,然后我使用angular-cookies'$ CookieStore访问客户端上的cookie,将其保存到rootscope并清除cookie .
问题:
除了用户刷新浏览器的任何事件之外,这是完美的工作,这导致我的rootcope会话显然被擦除.
所以我正在考虑将会话信息存储在浏览器本地存储中(使用store.js),然后即使在初始加载时我也可以检查浏览器本地存储中存在的会话,如果已经有会话则绕过OAuth登录.
这是不好的做法,还是在浏览器本地存储中存储用户会话信息时存在一些后勤/安全问题?
此应用程序没有任何敏感数据,注册是免费的,登录实际上只有那里,所以我可以跟踪用户并存储在应用程序中为每个用户创建的数据.并且用户会话永远不会有密码(我只允许OAuth登录没有本地选项).
我相信RESTful API的最佳实践是无状态.我读过关于无状态身份验证的abit,但我不完全清楚如何实现它(看起来像一堆令牌等).PassportJS是一个很好的身份验证库,但它不是无状态的?是否有某种库可以帮助我创建无状态API(带身份验证)?我想使用像谷歌,Twitter等一样的SSO(单点登录),所以如果图书馆为我处理这个(就像PassportJS那样)会很好.
我很擅长使用护照进行身份验证,因此需要大量的代码片段
我的服务器配置为:
var router = require('./app/config/routes');
var googleStrategy = require('./app/config/passport');
var session = require("express-session");
var passport = require('passport');
app.use(session({secret : '<secret-key>'}));
app.use(passport.initialize());
app.use(passport.session());
googleStrategy(passport);
Run Code Online (Sandbox Code Playgroud)
我的路由配置为
module.exports = function(app, passport) {
app.get('/auth/google', function() {
passport.authenticate('google', {scope: ['profile', 'email']});
});
app.get('/auth/google/callback', function() {
passport.authenticate('google', {
successRedirect: '/profile',
failureRedirect: '/fail'
});
});
.... ALSO configured /profile and /fail
};
Run Code Online (Sandbox Code Playgroud)
我的护照配置为
passport.serializeUser(function(user, callback){
console.log('serializing user.');
callback(null, user);
});
passport.deserializeUser(function(user, callback){
console.log('deserialize user.');
callback(null, user);
});
var processRequest = function(token, refreshToken, profile, callback){
process.nextTick(function(){
console.log('id …Run Code Online (Sandbox Code Playgroud) 我在Passport/ExpressJS中使用会话时遇到问题.
当我登录时req.session,我可以看到护照是{}:
{ cookie:
{ path: '/',
_expires: Mon Sep 29 2014 19:37:16 GMT-0300 (BRT),
originalMaxAge: 3594522,
httpOnly: true,
secure: true },
passport: {} }
Run Code Online (Sandbox Code Playgroud)
此外,我正在使用Facebook进行身份验证,并且passport.deserializeUser没有被调用.这是我的代码:
passport.use(new FacebookStrategy({
// pull in our app id and secret from our auth.js file
clientID : configAuth.facebookAuth.clientID,
clientSecret : configAuth.facebookAuth.clientSecret,
callbackURL : configAuth.facebookAuth.callbackURL
},
// facebook will send back the token and profile
function(token, refreshToken, profile, done) {
// asynchronous
process.nextTick(function() {
console.log("profile " + profile.id);
console.log("profile.name "+profile.name.givenName) …Run Code Online (Sandbox Code Playgroud) 这是我的Angular代码中的普通ES5函数,它可以工作:
app.run(function($templateCache){ $templateCache.put('/some','thing') });
Run Code Online (Sandbox Code Playgroud)
我想将它转换为ES6箭头功能
app.run($templateCache => $templateCache.put('/some','thing'));
Run Code Online (Sandbox Code Playgroud)
但它给出了错误
Uncaught Error: [$injector:unpr] Unknown provider: '/some'Provider <- '/some'
http://errors.angularjs.org/1.4.6/$injector/unpr?p0='%2Fsome'Provider%20%3C-%20'%2Fsome'
REGEX_STRING_REGEXP @ angular.js:68
(anonymous function) @ angular.js:4287
getService @ angular.js:4435
(anonymous function) @ angular.js:4292
getService @ angular.js:4435
invoke @ angular.js:4467
(anonymous function) @ angular.js:4297
forEach @ angular.js:336
createInjector @ angular.js:4297
doBootstrap @ angular.js:1657
bootstrap @ angular.js:1678
angularInit @ angular.js:1572
(anonymous function) @ angular.js:28821
trigger @ angular.js:3022
eventHandler @ angular.js:3296
Run Code Online (Sandbox Code Playgroud)
ES6箭头功能是否与Angular不兼容?
编辑:我想也许Angular无法推断名称$templateCache,因此无法注入它,但后来我将其记录到控制台,它确实显示正确:
app.run($templateCache=>console.log($templateCache));
// =>
// Object {}
// destroy: function() …Run Code Online (Sandbox Code Playgroud) javascript angularjs ecmascript-6 angularjs-injector arrow-functions
我在node.js中使用护照
在我的app.js
var passport = require('passport')
require('./config/passport').boot(passport, config)
Run Code Online (Sandbox Code Playgroud)
在passport.js
var LocalStrategy = require('passport-local').Strategy
Run Code Online (Sandbox Code Playgroud)
运行应用程序,我收到此错误消息
module.js:340
throw err;
error:Cannot find module 'passport-local'
at Object.<anonymous> <F:\work\config\passport.js:2:21>
Run Code Online (Sandbox Code Playgroud)
我在F:\ work \node_modules中安装护照.
即使我把它
var LocalStrategy = require('passport-local').Strategy
Run Code Online (Sandbox Code Playgroud)
就在
var passport = require('passport')
Run Code Online (Sandbox Code Playgroud)
我仍然得到同样的错误
任何想法为什么?
使用facebook-passport时,通常要做的是redirect_uri在你使用的FacebookStrategy的构造函数中指定,如下所示:
passport.use("facebook", new FacebookStrategy({
//TODO: Correctly configure me
clientID: "XXXXXXX"
, clientSecret: "XXXXXXXXX"
, callbackURL: "http://localhost:3007/auth/facebook/callback"
},
function(accessToken,refreshToken,profile,done) {
User.findByFacebookId(profile.id, function(err,user) {
if(err){ return done(err);}
if(!user){ return done(null,false)}
return done(null, user);
});
})
);
Run Code Online (Sandbox Code Playgroud)
然后你会设置这样的路线:
app.get('/auth/facebook/login', passport.authenticate('facebook') );
app.get('/auth/facebook/login_callback', passport.authenticate('facebook', {
successRedirect:"/login_ok.html"
, failureRedirect:"/login_failed.html"
}
))
Run Code Online (Sandbox Code Playgroud)
是否可以更改回调网址,使其包含传递给初始登录调用的参数的信息?
注意:这个问题更多的是为了保留我需要一段时间才能解决的信息,以避免其他人沿着相同的路径前进.
所以我使用passport-local和express来处理用户登录.到目前为止,我已经能够在使用用户名时成功登录,但是用户名很难记住,我个人认为它们不应该用于处理用户,因此我尝试修改护照上提供的示例策略 - 本地页面通过电子邮件确认用户,但代码不起作用.
我对电子邮件的策略是:
passport.use(new LocalStrategy(function(email, password, done) {
User.findOne({ email: email }, {}, function(err, user) {
if (err) { return done(err); }
if (!user) { return done(null, false, { message: 'Unknown user ' + e }); }
user.comparePassword(password, function(err, isMatch) {
if (err) return done(err);
if(isMatch) {
return done(null, user);
} else {
return done(null, false, { message: 'Invalid password' });
}
});
});
}));
Run Code Online (Sandbox Code Playgroud)
它来自这个策略:
//The login strategy
passport.use(new LocalStrategy(function(username, password, done) {
User.findOne({ username: username }, function(err, …Run Code Online (Sandbox Code Playgroud) 是否有一个使用PostgreSQL设置PassportJS的演练教程(即用PostgreSQL替换MongoDB)?
passport.js ×8
node.js ×7
express ×3
angularjs ×2
javascript ×2
session ×2
batch-file ×1
ecmascript-6 ×1
facebook ×1
module ×1
oauth-2.0 ×1
stateless ×1
windows ×1