我只是在通过“使用 oauth 登录”回调刀片模板将数据从 Laravel API 发送到 Vue SPA 时遇到了这个问题。
我花了一些时间才弄清楚如何修复有效载荷。感谢Amit Gupta的回答,我在这个问题中找到了答案。
这是退出 Laravel 的有效负载,用于上下文:
return view('oauth/callback', [
'user' => $user,
]);
然后,在callback.blade.php,我有这个代码:
<html>
<head>
<meta charset="utf-8">
<title>{{ config('app.name') }}</title>
<script>
window.opener.postMessage(
{
user: {!! $user !!},
},
"{{ url('/') }}"
);
window.close();
</script>
</head>
<body>
</body>
</html>
我不得不改变这个:
user: "{{ $user }}",
到这里:
user: {!! $user !!},
在修复之前,我将一个字符串化对象插入到字符串中,所以我被SyntaxError: Unexpected token o in JSON at position 1 错误所困扰,因为{ 和} 字符没有用双引号括起来。
这是我接收有效负载的 JavaScript:
onMessage(e) {
const hasUser = (e.data.user && (Object.keys(e.data.user).length > 0));
if ((e.origin !== window.origin) || !hasUser) {
return undefined;
}
console.log('user payload', e.data.user);
console.log('type', typeof e.data.user);
if (this.hasIntendedUrl) {
return this.$router.push(this.$store.getters['auth/intendedUrl'])
.then(() => this.$store.dispatch('auth/clearIntendedUrl'))
.catch(() => {});
}
return this.$router.push({ name: 'home' }).catch(() => {});
},
您可以看到我不需要JSON.parse(),因为typeof e.data.user 是object。
很抱歉,这里的答案很长,但我想展示一个完全合格的解决方案。对我来说,这只是一个类型转换问题,首先基于 JSON 对负载进行字符串化,然后进行 JSON 解析。这意味着 Laravel 应该专注于准备对象的传输安全版本,而 JavaScript 应该专注于将其转换回 Object。
在同一个文件中混合 PHP 和 JS 总是一个棘手的问题。正如您在我的示例中看到的那样,那些无害的 " 包装 "{{ $user }}" 是 JavaScript 代码被指示将对象放入字符串中,而这不能是 JSON.parse()'d。