简体   繁体   English

Google使用Javascript API登录而不触发弹出窗口

[英]Google sign-in using Javascript API without triggering popup

I am using following code for users to be able to login using their Google account via Javascript API. 我使用以下代码让用户能够通过Javascript API使用他们的Google帐户登录。

HTML HTML

<a id="gp_login" href="javascript:void(0)" onclick="javascript:googleAuth()">Login using Google</a>

Javascript 使用Javascript

function gPOnLoad(){
     // G+ api loaded
     document.getElementById('gp_login').style.display = 'block';
}
function googleAuth() {
    gapi.auth.signIn({
        callback: gPSignInCallback,
        clientid: googleKey,
        cookiepolicy: "single_host_origin",
        requestvisibleactions: "http://schema.org/AddAction",
        scope: "https://www.googleapis.com/auth/plus.login email"
    })
}

function gPSignInCallback(e) {
    if (e["status"]["signed_in"]) {
        gapi.client.load("plus", "v1", function() {
            if (e["access_token"]) {
                getProfile()
            } else if (e["error"]) {
                console.log("There was an error: " + e["error"])
            }
        })
    } else {
        console.log("Sign-in state: " + e["error"])
    }
}

function getProfile() {
    var e = gapi.client.plus.people.get({
        userId: "me"
    });
    e.execute(function(e) {
        if (e.error) {
            console.log(e.message);
            return
        } else if (e.id) {
            // save profile data
        }
    })
}(function() {
    var e = document.createElement("script");
    e.type = "text/javascript";
    e.async = true;
    e.src = "https://apis.google.com/js/client:platform.js?onload=gPOnLoad";
    var t = document.getElementsByTagName("script")[0];
    t.parentNode.insertBefore(e, t)
})()

This code is working fine. 这段代码工作正常。 I want to use the above code (using Javascript) to login user from their Google account without triggering a popup window . 我想使用上面的代码(使用Javascript)从他们的Google帐户登录用户, 而不会触发弹出窗口 Like, user clicks the login link, asked for app permissions in the same window/tab, user grants permission, user redirected back to the page where Google login link was, profile data is saved and user is logged in. 例如,用户单击登录链接,在同一窗口/选项卡中询问应用程序权限,用户授予权限,用户重定向回Google登录链接所在的页面,保存配置文件数据并登录用户。

You can the use ux_mode parameter (options are 'redirect' or 'popup' ) and set a redirect_uri if you want to redirect to a different page. 如果要重定向到其他页面,可以使用ux_mode参数(选项为'redirect''popup' )并设置redirect_uri

It's also necessary to authorize the URL for the OAuth client on your google project page. 您还需要在Google项目页面上授权OAuth客户端的URL。

  function initClient() {
    gapi.client.init({
      apiKey: API_KEY,
      clientId: CLIENT_ID,
      discoveryDocs: DISCOVERY_DOCS,
      scope: SCOPES,
      ux_mode: 'redirect',
      //redirect_uri: custom url to redirect'
    }).then(function () {
      // Listen for sign-in state changes.
      gapi.auth2.getAuthInstance().isSignedIn.listen(updateSigninStatus);

      // Handle the initial sign-in state.
      updateSigninStatus(gapi.auth2.getAuthInstance().isSignedIn.get());
      authorizeButton.onclick = handleAuthClick;
      signoutButton.onclick = handleSignoutClick;
    });
  }

Such functionality is not provided through Google API. Google API不提供此类功能。 You should stick with gapi.auth.signIn. 你应该坚持使用gapi.auth.signIn。 I know just one way to make it work, but it's very hacky. 我知道只有一种方法可以使它工作,但它非常hacky。

gapi.auth.signIn opens authentication window. gapi.auth.signIn打开身份验证窗口。 Save authentication window url in your app 1 . 在您的应用中保存身份验证窗口网址1 Instead of calling gapi.auth.signIn, redirect user to that url. 而不是调用gapi.auth.signIn,将用户重定向到该URL。

To redirect successful authentication back to your website, add/modify redirect_url param in the url 2 . 要将成功的身份验证重定向回您的网站,请在URL 2中添加/修改redirect_url param。 Keep in mind that redirect_uri must be registered in developers console. 请记住,redirect_uri必须在开发人员控制台中注册。

Example: https://accounts.google.com/o/oauth2/auth?client_id=1234567890.apps.googleusercontent.com&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fplus.login&immediate=false&response_type=token &redirect_uri= http://example.com 示例: https//accounts.google.com/o/oauth2/auth?client_id=1234567890.apps.googleusercontent.com &scope =https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fplus.login &immediate =false &response_type =token &redirect_uri = http://example.com

This way google will redirect user back to your website. 这样谷歌会将用户重定向回您的网站。 access_token is provided through GET params. access_token是通过GET参数提供的。

1 If google changes their API this may break (since this method bypasses JS API and assumes that all those params in the url will be supported for ever). 1如果谷歌改变了他们的API,这可能会破坏(因为这种方法绕过了JS API,并假设网址中的所有这些参数都将得到支持)。

2 Redirect_url is introduced in offline access flow documentation . 2 Redirect_url在离线访问流文档中引入。 I don't think this param was intended to work in any other cases. 我认为这个参数不适用于任何其他情况。

I strongly advise not to use this idea (since it bypasses JS API and uses undocumented functionality). 我强烈建议不要使用这个想法(因为它绕过JS API并使用未记录的功能)。 Stick with gapi.auth.signIn. 坚持使用gapi.auth.signIn。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM