【发布时间】:2017-09-22 21:21:04
【问题描述】:
我一整天都在尝试让 Google 身份验证与 React 一起使用,但是在搜索了几个小时后,我发现我发现的只是一个错误的、有时工作的、混乱的问题。谁能看到我做错了什么? (这是一个学校项目,所以我正在学习!)
该项目将是一个在线时间表创建者。
我的主要 Index.js 具有以下渲染功能:
function renderApp() {
ReactDOM.render(
<Router history={browserHistory}>
<Route path="/" component={Login}></Route>
<Route component={AuthUserContainer}>
<Route path="/auth" component={Layout}>
<IndexRoute component={Overview}></IndexRoute>
<Route path="schedule(/:scheduleid)" component={Schedule}></Route>
</Route>
</Route>
</Router>,
app);
}
主页只是一个登录页面,由登录组件处理,如果身份验证成功,它将将用户重定向到 /auth。每次访问受保护的路由时,AuthUserContainer 都会持续处理身份验证。
Login 组件有一个 Google Sign In 按钮,所有受保护的路由都有(通过 Layout 组件)一个 Google Sign Out 按钮。
我的 Header.js 包含“Google 退出按钮”(signOutHandler):
export default class Header extends React.Component {
constructor(props) {
super(props);
this.state = {};
this.SignOutHandler = this.SignOutHandler.bind(this);
}
SignOutHandler() {
var auth2 = gapi.auth2.getAuthInstance();
auth2.signOut().then(function () {
console.log('User signed out.');
Authenticate.signOutUser();
});
}
render() {
return (
<div class="header-content">
<h2 class="header-title">Schedule</h2>
<h3 class="header-user-button">
<a href="/" onClick={this.SignOutHandler}>User First Name</a>
</h3>
</div>
);
}
}
我使用 Google 自己的示例代码并尝试针对 React 调整它。我使用此代码遇到的问题是“未捕获的 TypeError:无法读取未定义的属性 'getAuthInstance'”。由于我将登录和注销按钮拆分为单独的页面,因此 auth2 未正确初始化,但单击该按钮两次可以使其工作。在这里尝试手动初始化它经常给我Gapi未定义的错误......
最后是 Login.js:
export default class Login extends React.Component {
constructor(props) {
super(props);
this.state = {};
this.onSignIn = this.onSignIn.bind(this);
this.renderGoogleLoginButton = this.renderGoogleLoginButton.bind(this);
}
renderGoogleLoginButton() {
console.log('rendering google signin button')
gapi.signin2.render('my-signin2', {
'scope': 'https://www.googleapis.com/auth/plus.login',
'width': 200,
'height': 50,
'longtitle': true,
'theme': 'light',
'onsuccess': this.onSignIn
});
gapi.load('auth2', function() {
gapi.auth2.init();
});
}
componentDidMount() {
window.addEventListener('google-loaded', this.renderGoogleLoginButton);
}
onSignIn(googleUser) {
Authenticate.signInUser(googleUser.getBasicProfile());
this.props.router.push("/auth");
}
render() {
return (
<div class="container">
<h2 class="form-signin-heading">
Sign-in with Google account required
</h2>
<div id="my-signin2"></div>
</div>
);
}
}
我的这段代码也是基于 Google 自己的,但这根本不起作用(按钮没有加载,根本没有显示,或者它从未调用 onSignIn)。我还找到并尝试了this,这使它有点工作(有时)。我还尝试在 renderGoogleLoginButton() 中初始化 auth2,但这有时也有效...
renderGoogleLoginButton() 由自定义事件(google-loaded)的偶数处理程序调用,该事件在 Google API 加载时触发(就像在链接中一样)。 Authenticate 是我自己的类,它将我创建的令牌、getUserName 函数等捆绑在一起。
我还从 gapi 收到以下错误:“Uncaught TypeError: Cannot read property 'style' of null”,我认为它试图引用登录/注销按钮,但因为它们当时没有加载为空。
我找不到任何不会导致故障或错误的好的解决方案。 Googles own code 将所有内容都放在同一个 HTML 文档中,但是由于我想将其拆分为组件,因此它全部中断。也许我这样做完全错了?我对 React 很陌生,但希望它是可以理解的!
抱歉发了这么长的帖子,非常感谢您抽出宝贵时间,如果您有任何问题,请随时提问!
【问题讨论】:
标签: reactjs authentication google-authentication