Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何正确使用谷歌&x27;s Javascript OAuth2.0库_Javascript_Oauth 2.0_Google Oauth - Fatal编程技术网

如何正确使用谷歌&x27;s Javascript OAuth2.0库

如何正确使用谷歌&x27;s Javascript OAuth2.0库,javascript,oauth-2.0,google-oauth,Javascript,Oauth 2.0,Google Oauth,我正在尝试使用Oauth2从javascript客户端访问一些google API。我已经成功地让用户对请求进行身份验证,但是在运行下面的代码时出现了一些我想理解的意外行为。当我第一次单击“授权”按钮时,结果是: “[{”错误“:{”代码“:”401,“消息“:”需要登录“,”数据“:[{”域“:”全局“,”原因“:”需要“,”消息“:”需要登录“,”位置类型“:”标题“,”位置“:”授权“}],”id“:”gapiRpc“}]” 在第二次单击时,结果是 [{“id”:“gapiRpc”,“re

我正在尝试使用Oauth2从javascript客户端访问一些google API。我已经成功地让用户对请求进行身份验证,但是在运行下面的代码时出现了一些我想理解的意外行为。当我第一次单击“授权”按钮时,结果是:

“[{”错误“:{”代码“:”401,“消息“:”需要登录“,”数据“:[{”域“:”全局“,”原因“:”需要“,”消息“:”需要登录“,”位置类型“:”标题“,”位置“:”授权“}],”id“:”gapiRpc“}]”

在第二次单击时,结果是

[{“id”:“gapiRpc”,“result”:{“id”:“1115793426680xxxx”,“email”:”xxxxx@gmail.com“,“已验证的电子邮件”:true}]

下面是我正在测试的页面的代码

<div id='sign in'>
    <button onclick="init();">Authorize</button>
</div>
<p id="output">hello</p>

<script type="text/javascript">
    function init() {
        document.getElementById('output').innerHTML='loading oauth2 api'
        gapi.client.load('oauth2', 'v2', auth);
    }

    function auth() {
        var config = {
            client_id: '2264xxxxx-odt0g7jn8vspa3ot9ogjxxxxxxxxx.apps.googleusercontent.com',
            scope: 'https://www.googleapis.com/auth/userinfo.email',
            immediate:true
        };
        document.getElementById('output').innerHTML='authorizing'
        gapi.auth.authorize(config, authed());
    }

    function authed() {
        document.getElementById('output').innerHTML='authorized'
        var request = gapi.client.oauth2.userinfo.get().execute(
            function(resp, raw) {
                document.getElementById('output').innerHTML=raw
            }
        );
    }
 </script>
<script src="https://apis.google.com/js/client.js"></script>
<!--<script src="https://apis.google.com/js/client.js?onload=init"></script>-->

授权

您好

函数init(){ document.getElementById('output').innerHTML='loading oauth2 api' gapi.client.load('oauth2','v2',auth); } 函数auth(){ 变量配置={ 客户端id:'2264xxxxx-odt0g7jn8vspa3ot9ogjxxxxxxxxx.apps.googleusercontent.com', 范围:'https://www.googleapis.com/auth/userinfo.email', 立即:对 }; document.getElementById('output').innerHTML='authorizing' authorize(config,authored()); } 函数authed(){ document.getElementById('output').innerHTML='authorized' var request=gapi.client.oauth2.userinfo.get().execute( 功能(resp,原始){ document.getElementById('output')。innerHTML=raw } ); }


您能解释一下为什么我会在第一次执行代码时获得“需要登录”,在第二次执行时获得成功的身份验证吗?

由于在对gapi.auth.authorize的调用中,在“authored”之后紧跟着括号,authored()回调会在调用gapi.auth.authorize之前立即运行

此外,在authed()处理程序中,您需要检查使用immediate:true的授权检查是否成功;有关更多详细信息,请参见此处的参考文档:

另请参阅此处有关弹出框阻止的部分:

当“立即”授权失败时,将使用空令牌对象或包含“错误”字段的令牌对象调用已授权回调;在这些情况下,您需要提供一个用户界面元素,用户可以单击该元素重新运行gapi.auth.authorize调用,但“immediate”设置为false(或省略)。这允许打开授权弹出窗口,而不会与浏览器的弹出窗口阻止程序发生冲突