我使用的是laravelssignedRoutes,并且已经在服务器上签署了一条路由,现在我需要将该路由再次提交给服务器,但是需要使用JavaScript从客户端提交。下面的代码是我将其发送到服务器之前所拥有的。
let formData = {
signature: '51bd52ece280dd29857aa7443e9178e64cf27047e831f4cdfd32c951c4571f65',
testing: '12345',
expires: '1530209048',
user: '7',
password: this.password,
passwordConfirm: this.passwordConfirm
}
return axios.post(route('backend.user.activate'), formData)
当我在服务器上收到此发帖请求
public function activate(Request $request)
{
if ($request->hasValidSignature()) {
dd('we cool!');
}
“我们很酷!”不会为我打印,这意味着Laravel作为帖子发送时无法验证有效签名。
我也尝试过像这样
return axios.post(route('backend.user.activate', urlSignature), formData)
其中
urlSignature="7?expires=1530209048&testing=12345&signature=51bd52ece280dd29857aa7443e9178e64cf27047e831f4cdfd32c951c4571f65"
但是laravel仍然无法验证签名是否有效,因为它可以像这样的简单路径工作
Route::get('/activate/{user}', 'Auth\ActivateController@showActivate')->name('backend.user.activate.show');
但是一旦我发帖
Route::post('/activate/{user}', 'Auth\ActivateController@activate')->name('backend.user.activate');
失败。
我需要使用该帖子,因为我必须在该帖子中发送密码,并且我不希望通过get请求发送密码。
编辑:
signedUrl
$url = URL::temporarySignedRoute('backend.user.activate.show', now()->addHours(24), ['user' => $this->user->id]);
路线
Route::post('/activate/{user}', 'Auth\ActivateController@activate')->name('backend.user.activate');
内部vue文件:
计算属性
urlSignature() {
console.log(window.location.pathname.match(/[^\/]*$/)[0] + window.location.search)
return window.location.pathname.match(/[^\/]*$/)[0] + window.location.search
},
对服务器进行发布呼叫:
return axios.post(route('backend.user.activate', this.urlSignature))
.then((response) => {
this.activated = true
})
生成的网址:
http://laraone.oo/backend/activate/8%3Fexpires%3D1530213677%26signature%3D793bd75d461b41ee587a65b9064e7ed41e4d4a149ed81f316d1fbb7cbdde70a2
用户在电子邮件中看到的原始URL是:
http://laraone.oo/backend/activate/8?expires=1530213677&signature=793bd75d461b41ee587a65b9064e7ed41e4d4a149ed81f316d1fbb7cbdde70a2
注意如何8?变成8%3,其余的特殊字符也一样。
如果您想知道我要做什么。
用户收到电子邮件并单击生成的链接以验证帐户后,我还希望他们也设置自己的密码,首先在选择密码并按“激活”后,我将从vuejs客户端使用密码向服务器发送请求,同时我再次尝试将签名的url内容发送到服务器。在保存密码并激活用户之前,需要执行此操作。
但是,我仍然无法使其正常工作。还有其他想法吗?