在RESTful API中使用会话是否真的违反了RESTfulness?我看到很多意见朝着两个方向发展,但我不相信会话是无REST的.在我看来,我的观点是:
会话如何违反这一点?
因此,对于客户端,会话cookie与任何其他基于HTTP头的身份验证机制完全相同,除了它使用Cookie头而不是Authorization其他专有头.如果cookie值服务器端没有附加会话,为什么会产生影响呢?只要服务器表现为 RESTful ,服务器端实现就不需要关注客户端.因此,cookie本身不应该使API无REST,而会话只是客户端的cookie.
我的假设是错的吗?什么使会话cookie RESTless?
我有一个PHP文件,有时从已启动会话的页面调用,有时从没有启动会话的页面调用.因此,当我有session_start()这个脚本时,我有时会收到"会话已经开始"的错误消息.为此,我把这些行:
if(!isset($_COOKIE["PHPSESSID"]))
{
session_start();
}
Run Code Online (Sandbox Code Playgroud)
但这次我收到了这条警告信息:
注意:未定义的变量:_SESSION
有没有更好的方法来检查会话是否已经开始?
如果我使用@session_start它会使事情正常工作,只是关闭警告?
对于我正在研究的新node.js项目,我正在考虑从基于cookie的会话方法切换(我的意思是,将id存储到包含用户浏览器中的用户会话的键值存储)使用JSON Web令牌(jwt)进行基于令牌的会话方法(无键值存储).
该项目是一个利用socket.io的游戏 - 在一个会话中将有多个通信通道(web和socket.io)的情况下,基于令牌的会话将非常有用.
如何使用jwt方法从服务器提供令牌/会话失效?
我还想了解在这种范例中我应该注意哪些常见(或不常见)的陷阱/攻击.例如,如果此范例容易受到与基于会话存储/ cookie的方法相同/不同类型的攻击.
会话商店登录:
app.get('/login', function(request, response) {
var user = {username: request.body.username, password: request.body.password };
// Validate somehow
validate(user, function(isValid, profile) {
// Create session token
var token= createSessionToken();
// Add to a key-value database
KeyValueStore.add({token: {userid: profile.id, expiresInMinutes: 60}});
// The client should save this session token in a cookie
response.json({sessionToken: token});
});
}
Run Code Online (Sandbox Code Playgroud)
基于令牌的登录:
var jwt = require('jsonwebtoken');
app.get('/login', function(request, response) {
var user = {username: request.body.username, …Run Code Online (Sandbox Code Playgroud) 登录$.ajax()到站点后,我尝试$.ajax()向该站点发送第二个请求 - 但是当我检查使用FireBug发送的标头时,请求中不包含会话cookie.
我究竟做错了什么?
我刚刚开始使用python开始学习Web应用程序开发.我遇到了"cookies"和"会话"这两个词.我理解cookie,因为它们将一些信息存储在浏览器的键值对中.但是我对会话有点困惑,在会话中我们也将数据存储在用户浏览器的cookie中.
例如 - 我使用username='rasmus'和登录password='default'.在这种情况下,数据将被发布到服务器,如果经过身份验证,该服务器应该检查并登录.但是,在整个过程中,服务器还会生成会话ID,该ID将存储在浏览器的cookie中.现在,服务器还将此会话ID存储在其文件系统或数据存储中.
但基于会话ID,如何在我后续遍历网站时知道我的用户名?它是否将数据作为dict存储在服务器上,其中键是会话ID username,email等等细节是值?
我在这里很困惑.需要帮忙.
我刚刚发现,ASP.Net Web应用程序中的每个请求在请求开始时都会获得一个Session锁,然后在请求结束时释放它!
如果这对你造成影响,就像我一开始对你而言,这基本上意味着以下几点:
任何时候ASP.Net网页需要很长时间才能加载(可能是由于数据库调用速度慢等),并且用户决定他们想要导航到另一个页面,因为他们厌倦了等待,他们不能!ASP.Net会话锁强制新页面请求等待,直到原始请求完成其缓慢的负载.Arrrgh.
任何时候UpdatePanel加载缓慢,并且用户决定在UpdatePanel完成更新之前导航到另一个页面......他们不能!ASP.net会话锁强制新页面请求等待原始请求完成其缓慢的负载.双Arrrgh!
那有什么选择呢?到目前为止,我想出了:
我真的不敢相信ASP.Net微软团队会在版本4.0的框架中留下如此巨大的性能瓶颈!我错过了一些明显的东西吗 为会话使用ThreadSafe集合有多难?
我有一个REST端点作为
class LoginResource(restful.Resource):
def get(self):
print(session)
if 'USER_TOKEN' in session:
return 'OK'
return 'not authorized', 401
Run Code Online (Sandbox Code Playgroud)
当我尝试访问时
curl -v -b ~/Downloads/cookies.txt -c ~/Downloads/cookies.txt http://127.0.0.1:5000/
* About to connect() to 127.0.0.1 port 5000 (#0)
* Trying 127.0.0.1...
* connected
* Connected to 127.0.0.1 (127.0.0.1) port 5000 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.27.0
> Host: 127.0.0.1:5000
> Accept: */*
>
* HTTP 1.0, assume close after body
< HTTP/1.0 401 UNAUTHORIZED
< Content-Type: …Run Code Online (Sandbox Code Playgroud) 我的Web应用程序使用会话在用户登录后存储有关用户的信息,并在应用程序中从一个页面移动到另一个页面时维护该信息.在这个特定的应用程序,我存储user_id,first_name和last_name人的.
我想在登录时提供"Keep Me Logged In"选项,这将在用户的计算机上放置一个cookie两周,这将在他们返回应用程序时以相同的细节重新启动他们的会话.
这样做的最佳方法是什么?我不想将它们存储user_id在cookie中,因为看起来这样可以让一个用户轻松尝试伪造另一个用户的身份.
session ×10
cookies ×3
php ×3
rest ×2
ajax ×1
architecture ×1
asp.net ×1
curl ×1
flask ×1
iis ×1
javascript ×1
jquery ×1
jwt ×1
node.js ×1
performance ×1
remember-me ×1
security ×1
vim ×1