最近我一直在玩AngularJS和Java EE 6.我在Jersey上构建了一个Web服务,并在Glassfish上部署了该项目.因为我需要某种身份验证和OAuth实现或者JDBCRealm看起来有点过分,所以我决定只在用户成功登录时创建一个会话.
@POST
@Path("/login")
@Produces({MediaType.APPLICATION_JSON})
@Consumes({MediaType.APPLICATION_JSON})
public Response login(LoginDAO loginData, @Context HttpServletRequest req) {
req.getSession().invalidate();
loginData.setPassword(PasswordGenerator.hash(loginData.getPassword()));
User foundUser = database.login(loginData);
if(foundUser == null) {
return Response.status(Status.CONFLICT).build();
}
req.getSession(true).setAttribute("username", foundUser.getUsername());
return Response.ok().build();
}
@GET
@Path("/ping")
public Response ping(@Context HttpServletRequest req) {
if(req.getSession().getAttribute("username") == null) {
return Response.ok("no session with an username attribute has been set").build();
}
return Response.ok(req.getSession(true).getAttribute("username")).build();
}
Run Code Online (Sandbox Code Playgroud)
这似乎工作正常,如果我从Postman发布/登录或从glassfish上部署的基本jQuery网页发送,我确实得到了正确的用户名并且已经放置了会话.如果我然后发送一个GET请求到/ ping我确实得到了我登录的用户名.
我在一个需要登录的node.js网络服务器上部署了一个AngularJS应用程序.因为这个服务器在另一个端口上,它在另一个域上,我不得不经历启用cors的痛苦.我这样做是通过构建一个容器响应过滤器来设置响应头.
public class CrossOriginResourceSharingFilter implements ContainerResponseFilter {
@Override
public ContainerResponse filter(ContainerRequest creq, ContainerResponse cresp) {
cresp.getHttpHeaders().putSingle("Access-Control-Allow-Origin", "http://localhost:8000");
cresp.getHttpHeaders().putSingle("Access-Control-Allow-Credentials", "true"); …Run Code Online (Sandbox Code Playgroud) 我正在使用Ionic在Codeigniter/Ion_Auth/codeigniter-restclient之上构建一个登录系统,当我尝试从"离子服务器"登录时,登录工作,但对logged_in()方法的下一个api请求返回false.
当我将浏览器指向www文件夹时,同样的事情正常.
所以这是一步一步的问题:
运行离子服务
你看到登录表单(http:// localhost:8100 /#/ app/login)
输入电子邮件并通过
其余的api返回"登录成功"
$ state.go('app.profile')工作并重定向到http:// localhost:8100 /#/ app/profile
REST get api/logged_in返回false,然后重定向到登录页面
如果我在常规浏览器中执行相同操作,则步骤1变为:打开浏览器并转到http:// localhost:8888/App/www /#/ app/login,在步骤6 REST get api/logged_in返回true并且我不要没有重定向到登录页面,我留在个人资料页面.
代码是一样的.所以我的猜测是,ion_auth可能无法获得它想要的cookie或会话被重置.我不确定这个问题是什么.这是我的第一个Ionic/App项目,所以我可能会错过一些使用在浏览器中运行的代码从移动应用程序进行身份验证的正确方法
谢谢
更新:似乎在使用"离子服务器"窗口时,对API的每个请求都会触发一个新会话.新会话存储在数据库中,ion_auth针对最后一个会话测试logged_in,其中不包含登录详细信息.
我有一个ExpressJS API服务器和一个在本地开发中运行的带有AngularJS应用程序的ExpressJS.
CORS GET请求工作正常,但POST和DELETE不发送任何cookie(凭据).
我尝试了各种配置选项,但从未让应用程序发送POST或DELETE的凭据.
我希望有人熟悉这一点,可能会看到我出错的地方.
我在/ etc/hosts中设置了两个本地域:
127.0.0.1 rsm.local
127.0.0.1 api.rsm.local
Run Code Online (Sandbox Code Playgroud)
所以http://rsm.local发送api请求http://api.rsm.local
AngularJS正在使用Restangular.
会话存储在MongoDB中,.rsm.local用于域,因此两个服务器都可以读取cookie.
客户端应用程序和api服务器都使用相同的cookie密钥和密钥.
app.use(express.session({
key: config.cookie_key,
secret: config.cookie_secret,
cookie: {
domain:'.rsm.local',
expires: config.cookie_expire
},
store: new mongoStore({
url: config.database,
collection: 'sessions',
auto_reconnect: true
})
}));
Run Code Online (Sandbox Code Playgroud)
这似乎可以很好地在两个应用程序之间共享会话状态.
API服务器是使用标准设置的,我认为是正确的CORS标头:
app.all('/api/*', function(req, res, next) {
res.setHeader('Access-Control-Allow-Origin', 'http://rsm.local:3000');
res.setHeader('Access-Control-Allow-Methods', 'GET,POST,PUT,DELETE,OPTIONS');
res.setHeader("Access-Control-Allow-Headers", "Accept, Cache-Control, Pragma, Origin, Authorization, Content-Type, X-Requested-With");
res.setHeader('Access-Control-Allow-Credentials', true);
next();
});
Run Code Online (Sandbox Code Playgroud)
客户端应用程序AngularJS已将Restanguarl配置为正确发送凭据我相信:
angular.module('rsm').config(function (RestangularProvider) {
RestangularProvider.setBaseUrl('http://api.rsm.local:3001/api/v1');
RestangularProvider.setDefaultHttpFields({
withCredentials: true,
useXDomain : true
});
});
Run Code Online (Sandbox Code Playgroud)
所以GET请求一切正常(例如列出所有并列出一个): …
我正在尝试使用socket.io实现身份验证和会话.
经过大量的研究1,我设置了以下使用快速和快速会话.
问题是,express和socket.io连接似乎有不同的会话,因为id我得到的是不同的.
此外,浏览器中没有从我的应用程序中设置cookie(这可能是两个组件创建不同会话的原因?)
我正在使用express 4.13.3express-session 1.12.1和socket.io 1.3.7.
下面是我设置的服务器端代码:
var app = require('express')();
var server = app.listen(80);
var parser = require('body-parser');
var Session = require('express-session');
var io = require('socket.io')(server);
var game = require('./game.js');
var session = Session({
secret: 'some secret',
resave: false,
saveUninitialized: false,
cookie: {
'name': 'test',
httpOnly: false,
secure: false,
maxAge: ((60 * 1000) * 60)
}
});
app.use(parser.urlencoded({
extended: false
}));
app.use(session);
app.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Origin, …Run Code Online (Sandbox Code Playgroud)