注意:我在这个问题上有4个赏金,但下面没有提出的答案是这个问题所需要的答案.所需的一切都在下面的Update 3中,只是寻找要实现的Laravel代码.
更新3:此流程图正是我想要完成的流程,下面的所有内容都是原始问题以及一些较旧的更新.该流程图总结了所需的一切.
下面的流程图中的绿色部分是我知道如何做的部分.红色部分及其旁注是我正在寻找帮助完成使用Laravel代码.
我已经做了很多研究,但是当使用Laravel和JWT httponly cookie进行自我消费的API时,信息总是很短而且不完整(大多数在线教程只显示JWT存储在本地存储中,这不是很安全).看起来像包含JWT by Passport的httponly cookie应该用于识别Javascript端的用户,当每次请求发送到服务器以验证用户是否是他们所说的用户时.
还有一些额外的东西需要全面了解如何使这个设置工作,我没有在一个教程中遇到这个包括:
我希望这个问题的答案可以作为一个易于遵循的指南,为未来的读者和那些正在努力寻找一个自我消费API的上述观点的答案.
更新1:
CreateFreshApiToken
之前的功能,但是在撤销用户令牌时这不起作用(上面的第3点和第4点).这是基于此评论的核心laravel开发商,谈论时CreateFreshApiToken
中间件:由此中间件创建的JWT令牌不会存储在任何位置.它们不能被撤销或"不存在".它们只是为您的api调用提供了一种通过laravel_token cookie进行authed调用的方法.它与访问令牌无关.另外:您通常不会在发布它们的同一个应用程序上使用客户发出的令牌.您可以在第一方或第三方应用中使用它们.使用中间件或客户端发出的令牌,但不能同时使用两者.
所以似乎能够迎合第3点和第4点来撤销令牌,如果使用CreateFreshApiToken
中间件则不可能这样做.
Authorization: Bearer <token>
处理安全的httpOnly cookie 似乎不是一种方法.我认为请求/响应应该包含安全的httpOnly cookie作为请求/响应头,像这样基于laravel文档:使用此身份验证方法时,默认的Laravel JavaScript脚手架指示Axios始终发送X-CSRF-TOKEN和X-Requested-With标头.
headerswindow.axios.defaults.headers.common = {
'X-Requested-With': 'XMLHttpRequest',
'X-CSRF-TOKEN': (csrf_token goes here)
};
Run Code Online (Sandbox Code Playgroud)
这也是我寻找涵盖上述所有要点的解决方案的原因.道歉,我使用的是Laravel 5.6而不是5.5.
更新2:
似乎密码授予/刷新令牌授权组合是要走的路.使用密码授予/刷新令牌授权组合寻找易于遵循的实施指南.
密码授予: 此授权适用于与我们信任的客户交易,例如我们自己网站的移动应用.在这种情况下,客户端将用户的登录凭据发送到授权服务器,服务器直接发出访问令牌.
刷新令牌授权: 当服务器发出访问令牌时,它还会为访问令牌设置到期时间.当我们想要在访问令牌过期时刷新访问令牌时,使用刷新令牌授予.在这种情况下,授权服务器将在发出访问令牌时发送刷新令牌,该令牌可用于请求新的访问令牌.
我正在寻找一个易于实现,直接,全面的答案,使用密码授予/刷新令牌授权组合,涵盖上述原始5点的所有部分与httpOnly安全cookie,创建/撤销/刷新令牌,登录cookie创建,注销cookie撤销,控制器方法,CSRF等
csrf-protection laravel cookie-httponly laravel-5 laravel-passport
我有一个在Tomcat 7服务器上运行的Web应用程序.具有会话ID的cookie默认具有标志HttpOnly
和Secure
.我想禁用JSESSIONID
cookie的这个标志.但它不会工作.我在我的web.xml
文件中更改了这个,但它无法正常工作.
<session-config>
<session-timeout>20160</session-timeout>
<cookie-config>
<http-only>false</http-only>
<secure>false</secure>
</cookie-config>
</session-config>
Run Code Online (Sandbox Code Playgroud)
我知道这是一个安全风险,因为攻击者能够窃取cookie并劫持会话,如果他找到了xss vuln.
该JSESSIONID
饼干应与HTTP和HTTPS与AJAX请求被发送.
编辑:
我HttpOnly
通过在conf/context.xml
文件中添加以下选项成功禁用了该标志:
<Context useHttpOnly="false">
....
</Context>
Run Code Online (Sandbox Code Playgroud) 这是一个设置cookie的函数:
public void addCookie(String cookieName, String cookieValue, Integer maxAge, HttpServletResponse response) {
Cookie cookie = new Cookie(cookieName, cookieValue);
cookie.setPath("/mycampaigns");
cookie.setSecure(isSecureCookie);
cookie.setMaxAge(maxAge);
response.addCookie(cookie);
}
Run Code Online (Sandbox Code Playgroud)
我相信servlet 3.0,有一种方法可以直接执行此操作.不幸的是,我的组织在这个时刻使用2.5和UPGRADING不是一个选项.
有没有办法使用响应来设置cookie?这是我在网上找到的一个例子
response.setHeader("SET-COOKIE", "[SOME STUFF]" +"; HttpOnly")
Run Code Online (Sandbox Code Playgroud)
如果这是我想要的唯一方法,那么我将取代"[SOME STUFF]"以便我不会丢失我的功能当前存储在cookie中的任何数据?
我可以看到HttpOnly
cookie 对安全性有好处,但是它们无法在没有服务器交互的情况下进行注销,对吧?1因此,当网络出现故障时,您无法注销并离开.我可以想象一个解决方法,但我想先问一下
1假设你实际上正在使用它们.
我有一个包含这些参数的cookie:
Name: workgroup_session_id
Content: ""
Domain: agrobman1.tsi.lan
Path: /
Send for: Any kind of connection
Accessible to script: No (HttpOnly)
Created: Wednesday, November 4, 2015 at 9:31:58 AM
Expires: When the browsing session ends
Run Code Online (Sandbox Code Playgroud)
我试图使用此代码使用PHP删除cookie:
setcookie("workgroup_session_id", "\"\"", time() - 3600, "/", "agrobman1.tsi.lan", false, true);
Run Code Online (Sandbox Code Playgroud)
但我仍然无法删除它.有谁知道如何使用PHP或JS删除此类型的cookie?
我阅读了为 Flask cookie 设置“安全”属性,但它用于设置安全 cookie,但我正在尝试设置 HTTPONLY cookie。它们都是某种安全的 cookie,但规格不同(阅读更多)。
cookie 需要保护,因为它是关于用户的登录信息。
我尝试通过html5音频标签播放一些mp3文件.对于桌面而言,这非常适合(使用Chrome),但是当涉及到移动浏览器(也是Chrome(适用于Android))时,似乎存在一些困难:
我用一些密码保护了流,因此流媒体服务器需要找到一个特殊的身份验证cookie(spring security remember-me).但不知何故,移动浏览器在通过音频标签访问mp3流时不会发送此cookie.当我直接输入流URL到地址栏时,一切正常.
当我搜索我发现的丢失的cookie时,移动浏览器仍然发送一些cookie(例如JSESSIONID),但不是全部.进一步调查(使用PHP的快速PoC)显示移动浏览器似乎拒绝通过具有HttpOnly Flag设置的audio-tag发送cookie.所以我的问题是:
这是一个指定的行为,为什么移动和桌面版本(Chrome)之间存在差异,是否有一种方法可以控制客户端的行为?
我想使用HttpOnly
cookie,我在Java中设置如下:
...
Cookie accessTokenCookie = new Cookie("token", userToken);
accessTokenCookie.setHttpOnly(true);
accessTokenCookie.setSecure(true);
accessTokenCookie.setPath("/");
response.addCookie(accessTokenCookie);
Cookie refreshTokenCookie = new Cookie("refreshToken", refreshToken);
refreshTokenCookie.setHttpOnly(true);
refreshTokenCookie.setSecure(true);
refreshTokenCookie.setPath("/");
response.addCookie(refreshTokenCookie);
...
Run Code Online (Sandbox Code Playgroud)
我得到了客户端的cookie响应,但是当我发送下一个请求时,我没有请求cookie.也许我错过了一些东西,但据我所知,这些HttpOnly
cookie必须由浏览器在每次请求(JavaScript无法访问这些cookie)时发送到定义的路径.
我有以下请求标题:
Accept:application/json, text/plain, */*
Accept-Encoding:gzip, deflate, br
Accept-Language:en-US,en;q=0.8,hu;q=0.6,ro;q=0.4,fr;q=0.2,de;q=0.2
Authorization:Basic dXNlcm5hbWU6cGFzc3dvcmQ=
Connection:keep-alive
Content-Length:35
content-type:text/plain
Host:localhost:8080
Origin:http://localhost:4200
Referer:http://localhost:4200/
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36
X-Requested-With:XMLHttpRequest
Run Code Online (Sandbox Code Playgroud)
以及以下响应标头:
Access-Control-Allow-Credentials:true
Access-Control-Allow-Origin:http://localhost:4200
Access-Control-Expose-Headers:Access-Control-Allow-Origin, Content-Type, Date, Link, Server, X-Application-Context, X-Total-Count
Cache-Control:no-cache, no-store, max-age=0, must-revalidate
Content-Length:482
Content-Type:application/json;charset=ISO-8859-1
Date:Fri, 03 Feb 2017 13:11:29 GMT …
Run Code Online (Sandbox Code Playgroud) 我有一个基本的SPA(反应)<-> API(网络核心2.2)设置,带有2个环境:dev和prod(小型项目)。API
侧面有一个身份验证机制,用于检查httponly
每个包含JWT的请求中cookie 的存在。
在开发环境中,它可以正常运行okey-dokey:,allowCredentials()
并且已withCredentials = true
在API和react应用程序中进行了设置。两者都在我的本地主机的不同端口上运行。
但是在生产环境中(单独的Heroku dynos),它不会设置httponly
cookie:我可以使用我的凭据登录,响应标题包含带有jwt的cookie,但是我要发出的其他每个请求都将不包含cookie。 cookie标头在请求标头中!
然后我得到一个401 Unauthorized ...
错误(这是逻辑上的)。我花了数小时尝试所有事情,这让我发疯。
我的简单身份验证XHR(原始)调用:
var request = new XMLHttpRequest()
request.open('POST', apiAuthenticateUser, true)
request.setRequestHeader('Content-type', 'application/json')
request.withCredentials = true
request.send(postData)
Run Code Online (Sandbox Code Playgroud)
我Startup.cs
在.net核心api中的配置:
var request = new XMLHttpRequest()
request.open('POST', apiAuthenticateUser, true)
request.setRequestHeader('Content-type', 'application/json')
request.withCredentials = true
request.send(postData)
Run Code Online (Sandbox Code Playgroud)
那就是我如何在api控制器动作响应中设置包含jwt的httponly cookie:
public void Configure(IApplicationBuilder app, IHostingEnvironment env) {
if (env.IsDevelopment()) {
app.UseDeveloperExceptionPage();
IdentityModelEventSource.ShowPII = true;
} else {
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseCors(
options …
Run Code Online (Sandbox Code Playgroud) javascript request-headers response-headers cookie-httponly asp.net-core
我有一个express-node服务器。我发送 JWT 访问令牌作为响应,并仅通过 httpOnly cookie 发送 JWT 刷新令牌。在浏览器中使用它时,该刷新令牌会随每个后续请求自动发送。
但是当我尝试在 React Native 项目中使用它时,httpOnly cookie 不会自动保存在应用程序中,服务器也不会通过 api 请求获取任何 cookie。我认为react-native中没有可以保存httpOnly cookie的地方。有人建议我将其保存在 AsyncStorage 中,但由于它是 httpOnly cookie ,我无法通过 javascript 读取它,因此无法将其保存到任何地方。
React Native 不保存或处理仅 http 的 cookie 吗?
cookie-httponly ×10
cookies ×6
httponly ×2
java ×2
javascript ×2
jwt ×2
access-token ×1
angular ×1
asp.net-core ×1
flask ×1
html5-audio ×1
laravel ×1
laravel-5 ×1
php ×1
python ×1
react-native ×1
servlet-2.5 ×1
session ×1
tomcat7 ×1
web-services ×1