I'm 迁徙 https://developers.google.com/identity/gsi/web/guides/migration from 谷歌登录平台 https://developers.google.com/identity/sign-in/web/sign-in到较新的Google 身份服务库 https://developers.google.com/identity/gsi/web.
应用程序.svelte:
<svelte:head>
<script src="https://accounts.google.com/gsi/client" async defer></script>
</svelte:head>
<div id="g_id_onload"
data-client_id="x.apps.googleusercontent.com"
data-callback="handleCredentialResponse">
</div>
<div class="g_id_signin"
data-type="standard"
data-size="large"
data-theme="outline"
data-text="sign_in_with"
data-shape="rectangular"
data-logo_alignment="left">
</div>
<script>
function decodeJwtResponse(token) {
let base64Url = token.split('.')[1]
let base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
let jsonPayload = decodeURIComponent(atob(base64).split('').map(function(c) {
return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
}).join(''));
return JSON.parse(jsonPayload)
}
let responsePayload;
function handleCredentialResponse(response) {
// decodeJwtResponse() is a custom function defined by you
// to decode the credential response.
responsePayload = decodeJwtResponse(response.credential);
console.log("ID: " + responsePayload.sub);
console.log('Full Name: ' + responsePayload.name);
console.log('Given Name: ' + responsePayload.given_name);
console.log('Family Name: ' + responsePayload.family_name);
console.log("Image URL: " + responsePayload.picture);
console.log("Email: " + responsePayload.email);
}
</script>
重新加载页面,我在控制台中看到此错误:
[GSI_LOGGER]:“callback”的值不是函数。配置被忽略。
问题是什么?
经过几个小时的搜索,我找到了这个答案:从全局范围调用 Svelte 组件的函数 https://stackoverflow.com/questions/57954008/call-svelte-components-function-from-global-scope
Simply, handleCredentialResponse
需要是全局(窗口)范围。
JavaScript
window.handleCredentialResponse = (response) => {
// decodeJwtResponse() is a custom function defined by you
// to decode the credential response.
responsePayload = decodeJwtResponse(response.credential);
console.log("ID: " + responsePayload.sub);
console.log('Full Name: ' + responsePayload.name);
console.log('Given Name: ' + responsePayload.given_name);
console.log('Family Name: ' + responsePayload.family_name);
console.log("Image URL: " + responsePayload.picture);
console.log("Email: " + responsePayload.email);
}
打字稿
你需要修改Window
接口,以便 TS 不会引发错误:如何在 TypeScript 中显式设置“window”的新属性? https://stackoverflow.com/questions/12709074/how-do-you-explicitly-set-a-new-property-on-window-in-typescript
// global.d.ts
export {};
declare global {
interface Window {
handleCredentialResponse: (response: any) => void;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)