- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
$(window).on('unload', function() {
db.flipCounter.get(gon.slug, function(obj) {
var payload = {
slug: gon.slug,
localFlipCount: obj.fc,
time: Date.now()
}
navigator.sendBeacon('/analytics', csrfProtect(payload))
})
})
function csrfProtect(payload) {
var param = $("meta[name=csrf-param]").attr("content")
var token = $("meta[name=csrf-token]").attr("content")
if (param && token) payload[param] = token
return new Blob([JSON.stringify(payload)], { type: "application/x-www-form-urlencoded; charset=utf-8" })
}
在上面的代码中,我希望使用有效负载将 POST 发送到“/analytics”url。我收到以下错误(警告)... 试图触发请求:
Promise.js:840 Unhandled rejection: TypeError: Cannot create property 'authenticity_token' on string '{"slug":"test-page-by-marvin-danig","localFlipCount":1,"time":1524241435403}'
嗯。
...发出请求,我得到:
Processing by BooksController#analytics as */*
Parameters: {"{\"slug\":\"test-book-by-marvin-danig\",\"localFlipCount\":1,\"time\":1524243279653,\"param\":\"8rzDx/TNL8YeU1/NWgWSk6gB/UvmbB9Ip VajDCgfDUv5Q4pjh7x0GUG1il1jDJajtJyHf84Xv5Pt14fiCnA9w"=>"=\"}"}
Can't verify CSRF token authenticity.
exception
ActionController::InvalidAuthenticityToken
更新:问题仍未解决。这是我现在所在的位置:
我在 routes.rb
上打开了以下 GET 和 POST 路由:
# Analytics (flipCounter)
get 'auth_token', to: 'analytics#auth_token'
post 'receptor', to: 'analytics#receptor', as: :receptor
这些显然像这样映射到 analytics_controller
:
class AnalyticsController < ApplicationController
respond_to :js
def auth_token
session[:_csrf_token] = form_authenticity_token
end
def receptor
logger.debug "Check book slug first: #{params}"
begin
book = Book.friendly.find(params[:slug])
rescue ActiveRecord::RecordNotFound => e
book = nil
end
if book.exists?
book.flipcount += params[:flipcount].to_i
end
end
private
end
除了 auth_token
方法外,我还得到了一个 auth_token.json.erb
模板,该模板按以下方式提供:
{ "authenticity_token": "<%= session[:_csrf_token] %>" }
而客户端 javascript(糟糕的草稿)采用以下方式:
// When state of book changes to `not_flipping`:
flipCount += 1
const o = { slug: gon.slug, fc: flipCount }
// IndexedDb initiated elsewhere.
db.transaction('rw', db.flipCounter, function(e) {
db.flipCounter.put(o)
}).then(function(e) {
const URL = '/auth_token' // First fetch the authenticity_token!
fetch(URL, {
method: 'GET'
}).then(function(res) {
return res.json()
}).then(function(token) {
return postBookData(token)
}).catch(err => console.log(err))
}).catch(function(e) {
console.log(e)
})
function postBookData(token) {
db.flipCounter.get(gon.slug, function(obj) {
// var payload = new FormData()
// payload.append('slug', gon.slug)
// payload.append('localFlipCount', obj.fc)
// payload.append('authenticity_token', token.authenticity_token)
// payload.append('type', 'application/x-www-form-urlencoded;')
// payload.append('charset=utf-8', 'ok')
// payload.append('X-CSRF-Token', token.authenticity_token)
//var payload = { 'slug': gon.slug }
let body = {
slug: gon.slug,
flipcount: obj.fc,
time: Date.now()
}
let headers = {
type: 'application/x-www-form-urlencoded; charset=utf-8',
'X-CSRF-Token': token.authenticity_token
}
let blob = new Blob([JSON.stringify(body)], headers);
let url = '/receptor'
navigator.sendBeacon(url, blob);
}).then(function() {
flipCount = 0
var o = { slug: gon.slug, fc: flipCount }
}).catch(err => console.log(err))
}
navigator.sendBeacon
触发的请求对象不正确,因为 X-CSRF-Token
未设置,我显然在服务器端:
Started POST "/receptor" for 127.0.0.1 at 2018-04-26 09:00:33 -0400
Processing by AnalyticsController#receptor as */*
Parameters: {"{\"slug\":\"bookiza-documentation-by-marvin-danig\",\"fc\":1}"=>nil}
Can't verify CSRF token authenticity.
exception
ActionController::InvalidAuthenticityToken
Rendering public/500.html
Rendered public/500.html (1.0ms)
Completed 500 Internal Server Error in 337ms (Views: 335.8ms | ActiveRecord: 0.0ms)
有没有人在 Rails 应用程序上使用服务 worker 在完全离线的页面上实现了 navigator.sendBeacon
场景?
最佳答案
刚刚遇到这个问题,我的解决方案的js端如下:
window.addEventListener("unload", function() {
var url = "/your_metrics_path",
data = new FormData(),
token = $('meta[name="csrf-token"]').attr('content');
// add your data
data.append("foo", "bar");
// add the auth token
data.append("authenticity_token", token);
// off she goes
navigator.sendBeacon(url, data);
});
希望这对您有所帮助。
关于javascript - 处理 rails 中 navigator.sendBeacon 请求的 CSRF 真实性 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49946055/
我浏览了Truthiness in Python并理解 [] 和类似的空对象在 Python 中被解释为 False。 但是当我在 REPL 中输入以下内容时,它返回 False: >>> [] ==
我是 JavaScript 的新手,我正在尝试从 Internet 资源中学习它。虽然我知道会有很多 cr*p Material ,但大多数人似乎都同意的一件事是 JS 中事物的真实性(只是举个例子
Android/Iphone 应用程序将从服务器访问应用程序数据。[Django-Python] 如何确保与移动应用程序的通信安全? 期望:对密码等敏感信息足够安全,除了暴力破解之外,没有直接的解密方
我目前有一个应用程序,它使用常规 Devise 身份验证进行登录和注销,但使用 Devise 的 token_authenticatable 模块创建一个唯一 token ,该 token 在从书签提
我正在使用 rails 4.0.3 和 passenger和 authlogic构建 Web 应用程序并在用户登录时遇到问题,但在创建新的 UserSession 时使用以前的用户真实性 token
有谁知道在 Ruby on Rails 3 中如何管理真实性 token ?在展示如何使用 HTML5 数据属性的所有不显眼的 Javascript Ruby on Rails 3 文章中,我在任何地
Rails 中的真实性 token 是什么? 最佳答案 会发生什么 当用户查看表单以创建、更新或销毁资源时,Rails 应用会创建一个随机的 authenticity_token,将此 token 存
当我遇到一些真实性 token 问题时,我正在开发一个新的 Rails 4 应用程序(在 Ruby 2.0.0-p0 上)。 在编写响应 json 的 Controller 时(使用 respond_
我正在将devise(最新版本-3.2.0)与rails(最新版本-4.0.1)一起使用 我正在做简单的身份验证(没有ajax或api),并且CSRF身份验证 token 出现错误。检查下面的POST
我正在尝试在 Rails 中执行跨平台请求。 我的 html 代码是:- Title
我正在使用 Sinatra 框架在 ruby 中构建一个简单的应用程序。它主要基于“获取”——大多数请求将用于列出数据。但是,应用程序中有几个关键屏幕将收集用户输入。我想确保该应用尽可能安全,目前
我正在尝试使用 uploadify ( http://www.uploadify.com ) 在 rails 3 应用程序中获取文件上传进度条,但我被困在真实性 token 上。我当前的uploadi
我正在尝试对一个简单的 Rails 应用程序执行 JMeter 后期操作,但我得到以下回复: 在 2015-05-04 12:40:15 -0700 开始为 127.0.0.1 发布“/flights
我的问题是关于加强 .NET 程序集之间的安全性。这是场景: Foundation 程序集部署在服务器上。 应用程序中附带了一系列插件程序集。 插件使用Foundation的功能。 由于Foundat
在 rails 4 应用程序的同一页面上,我有一个 在头部: 和下面的 body : js 调用需要 csrf token 。但是为什么form token与csrf token不同呢?表
在我们的 Rails 应用程序中,用户经常将多个浏览器选项卡一次打开数小时或数天。当在这些选项卡之一中,用户注销然后重新登录(或 session 过期并创建新 session )时,就会出现问题。 这
我有一个使用 Windows Phone 8 SDK 的 Phonegap 2.3.0 通过 iframe 加载的 Web 应用程序。通过 iframe 加载它的问题是,当我发送 $.post() 请
我的 Rails 应用程序订阅了一个外部系统 POST 通知(名为 Orion context broker)。我管理发送 json 数据和处理响应(ruby->Orion)。 但是当收到通知请求时,
我正试图在 Rails 中获得完整的页面缓存,但我在 CSRF 方面遇到了很大的障碍——或者可能只是我对它的理解。我目前有 form_authenticity_token存储在 cookie 中的字符
我正在开发一个简单的网站,让管理员提出问题并让用户解决问题。我在管理部分使用 ActiveAdmin,在用户解决部分使用简单的 AJAX 调用。起初尝试通过 ActiveAdmin::Devise 登
我是一名优秀的程序员,十分优秀!