在谷歌Oauth回调后,Safari无法获得Uri碎片

时间:2015-12-30 10:59:18

标签: javascript oauth-2.0 google-authentication

我按照此文档实施了Google OAuth 2.0:https://developers.google.com/identity/protocols/OAuth2UserAgent

我设置了以下步骤:

  1. 用户单击“登录”按钮并打开一个新窗口。
  2. 格式化身份验证网址并将该新窗口重定向到Google。
  3. 用户完成了身份验证登录,Google将access_token重定向到我的回调
  4. 回调页面使用#验证URI片段中的返回access_token(例如:https://oauth2-login-demo.appspot.com/oauthcallback#access_token=1/fFBGRNJru1FQd44AzqT3Zg&token_type=Bearer&expires_in=3600&nonce=DgkRrHXmyu3KLd0KDdfq
  5. 我的问题是,对于Chrome和Firefox,它运行得很好。但是,Desktop Safari(9.0.1)和Mobile Safari(iOS 9.2)在接收任何哈希参数时失败:Safari Console

    我是否实施了错误的OAuth步骤?

    我的部分代码:

    • 第1步

      let that = this;
      let oauthWindow = window.open("", "oauthWindow", "height=518,width=964");
      
      that.setState(Object.assign({}, that.state, {loaded: false}));
      
      Parse.Cloud.run("google_util_request_login").then(function(result) {
      
          console.log(decodeURIComponent(result));
      
          oauthWindow.location = decodeURIComponent(result);
      
      }, function (error) {
          that.setState(Object.assign({}, that.state, {errorMessage: error, loaded: false}));
      });
      
    • 第2步: google_util_request_login 是一个云函数,它将返回格式化网址。

      • Github Repo: github.com/bblurock/parse-cloud-with-google-twitter-oauth/blob/master/index.js#L22-L40
        (抱歉给您带来不便,我的声誉不足以发布两个以上的链接)

2 个答案:

答案 0 :(得分:0)

Safari(与Firefox和Chrome不同)可能会在服务器重定向到另一个URI时从URI中删除#...

在我的情况下,我使用的是我的本地服务器重定向到http://localhost:8080/auth-callback.html/的redirect_uri http://localhost:8080/files/auth-callback.html/

在您的示例中,您提到了redirect_uri https://oauth2-login-demo.appspot.com/oauthcallback。当我去那个uri时,我不会被重定向到其他任何地方,所以这在你的特定情况下可能没有用,但是如果有一个更明确的路径,那么也许可以试试。

很抱歉,如果这不能解决您的问题,但我相信它会帮助处于类似情况的其他人。

答案 1 :(得分:0)

我遇到了同样的问题,使用Asana的API和Oauth创建一个应用程序...在Chrome,FF甚至IE 11上都可以正常运行,但在Safari上却无法正常工作。

这终于对我有用: https://community.auth0.com/t/hash-gets-lost-on-safari-webkit-browsers/7263/8

Safari在重定向URI的末尾需要一个'/': “ https://www.somedomain.com/somepathname/

那样,并且不要在重定向URI的末尾包含实际文件,即“ index.php”。