标签: google-oauth2

Google OAuth 2.0"错误":"redirect_uri_mismatch"

我已经花了一天,撞了一杯,我真的很生气,我不明白谷歌想要什么,有什么不对.

我在开发者控制台中启用了Google+ Api google_ api已启用 ,创建了新的OAuth客户端ID 客户ID

    $ch = curl_init('https://accounts.google.com/o/oauth2/token');
curl_setopt($ch,CURLOPT_POSTFIELDS,'code=4%2FPp1GWqC6PIr3wNYrZ5kK4T9oitxBoo0fBqBrVNQfE-g.ElKDUjQ7E28SoiIBeO6P2m-0RPaolgI&grant_type=authorization_code&redirect_uri=https%3A%2F%2Fmyprivatedomain.local.com%2Foauth2callback&client_id=%mycliet_id%&client_secret=%mysecret%');
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true);
var_dump(curl_exec($ch));
Run Code Online (Sandbox Code Playgroud)

在此处的说明中创建了所有内容:https://developers.google.com/+/web/signin/server-side-flow,gplus按钮显示在页面上,并成功请求授权用户访问.但是,当我执行第8 步时:初始化Google API客户端库并在 每次获得响应"错误"启动Google+服务我的请求:"redirect_uri_mismatch"

我知道,当您未在Google控制台中注册redirect_uri时,或者当您在其中输入类型错误时,会出现此错误,但我已将其注册,并且仅用于测试尝试设置不同的网址(更改的域名,更改的协议来自https到https),但它永远不会工作!我不知道还能检查什么,请至少建议一下.

oauth google-api-php-client google-oauth2

14
推荐指数
1
解决办法
6万
查看次数

是否可以通过Google的id_token获取个人资料信息?

当使用谷歌的OpenIDConnect认证系统,它可以指定emailprofile或两者的scope参数.如果您请求email范围,则"email"和"email_verified"声明将包含在id_token作为成功OAuth2身份验证会话的一部分返回的声明中.

以下是Google文档中的示例:

ID令牌的有效负载

ID令牌是包含一组名称/值对的JSON对象.这是一个示例,格式化为可读性:

{"iss":"accounts.google.com", 
 "at_hash":"HK6E_P6Dh8Y93mRNtsDB1Q", 
 "email_verified":"true",
 "sub":"10769150350006150715113082367", 
 "azp":"1234987819200.apps.googleusercontent.com", 
 "email":"jsmith@example.com", 
 "aud":"1234987819200.apps.googleusercontent.com", 
 "iat":1353601026, 
 "exp":1353604926,
 "hd":"example.com" 
}
Run Code Online (Sandbox Code Playgroud)

但是,请求profile范围似乎对id_token的内容没有任何影响.为了检索配置文件信息,您必须向不同的端点发出单独的HTTP请求(使用您刚刚收到的access_token进行身份验证)以获取看起来非常相似但具有更多信息的文档:

{
  "kind": "plus#personOpenIdConnect",
  "gender": string,
  "sub": string,
  "name": string,
  "given_name": string,
  "family_name": string,
  "profile": string,
  "picture": string,
  "email": string,
  "email_verified": "true",
  "locale": string,
  "hd": string
}
Run Code Online (Sandbox Code Playgroud)

理想情况下,我更愿意获取nameid_token JWT中包含的配置文件信息(只是,实际上),而不是必须单独调用.有没有办法指定其他字段并将它们作为声明包含在id_token中?如果没有,为什么要email特别处理并返回id_token?

google-openid oauth-2.0 openid-connect google-oauth2

14
推荐指数
2
解决办法
4778
查看次数

Google OAuth同意屏幕未显示应用徽标和名称

最近我们注意到我们的应用OAuth许可屏幕未显示徽标和应用名称.相反,它显示重定向URL.并且我们在开发人员控制台中没有提供任何条款和隐私.


在此输入图像描述


这就是我们的OAuth许可屏幕的设置方式:


在此输入图像描述

有人可以告诉我们做错了什么吗?

google-api google-oauth2

14
推荐指数
1
解决办法
5162
查看次数

强制用户通过Google OAuth2选择帐户

我的应用程序中有以下工作流程:

  1. 用户登录我的自定义应用
  2. 用户点击按钮即可关联其YouTube帐户
  3. 应用程序使用下面的代码列表发出服务器端请求
  4. 用户被重定向到google auth网址

此时,发生以下两种情况之一:

[我从不想要这种行为] - 如果用户只登录了一个Google帐户(例如gmail,Google Apps for Domains等等),则系统永远不会要求用户选择要关联的帐户.它只是假设他们想要使用他们登录的那个并继续它的快乐方式.

[我一直想要这种行为] - 如果用户未登录任何Google帐户,或者他们登录了多个Google帐户,则系统会要求他们选择要继续使用的帐户.

问题:即使用户当前登录到单个Google帐户,我还有办法强制用户选择帐户吗?

码:

private def getFlow() = {
  if (flow == null) {
    logger.info("Using OAuth client secrets file: " + GoogleOAuthService.CLIENT_SECRETS_JSON)
    clientSecrets = GoogleClientSecrets.load(JacksonFactory.getDefaultInstance(),
      new InputStreamReader(getClass.getResourceAsStream(GoogleOAuthService.CLIENT_SECRETS_JSON)));
    redirectUri = clientSecrets.getDetails().getRedirectUris().get(0)
    flow = new GoogleAuthorizationCodeFlow.Builder(
      httpTransport, JacksonFactory.getDefaultInstance(), clientSecrets, SCOPES).setDataStoreFactory(
      dataStoreFactory).setAccessType("offline").setApprovalPrompt("force").build()
  }
  flow
}

def newAuthorizationUrl(userId: String) = {
  val urlRequest = getFlow().newAuthorizationUrl()

  urlRequest.setAccessType("offline")
   .setRedirectUri(redirectUri).setState(userId).build()
}
Run Code Online (Sandbox Code Playgroud)

google-oauth google-oauth-java-client google-oauth2

13
推荐指数
2
解决办法
1926
查看次数

Google登录在切换到辅助Youtube帐户时会出错

我目前正在尝试使用gapi.auth2Google Sign-In for Websites API,这是我的代码:

- 加载库:

<script src="https://apis.google.com/js/platform.js?onload=onLoadGapiCallback" async defer></script>

- 初始化auth2变量:

var auth2;

window.onLoadGapiCallback = () => {
  gapi.load('auth2', () => {
    auth2 = gapi.auth2.init({
      'client_id': 'CLIENT_ID',
      'scope': 'profile email https://www.googleapis.com/auth/youtube.readonly'
    });
  });
};
Run Code Online (Sandbox Code Playgroud)

- 点击按钮时:

auth2.signIn().then(() => {
  console.log('auth is:', auth2.currentUser.get().getAuthResponse().access_token);
});
Run Code Online (Sandbox Code Playgroud)

这很有效,它初始化auth2变量,当我点击按钮时,它会显示SingIn提示,我选择了一个我的Google帐户.问题是从现在开始我必须选择一个YouTube帐户,如果我选择其他帐户而不是主帐户,我会得到一个像这样的异常对象:

{type: "tokenFailed", idpId: "google", error: "USER_LOGGED_OUT"}
Run Code Online (Sandbox Code Playgroud)

还有一个最后发送的XHR请求有这个响应:

{"error":"USER_LOGGED_OUT","detail":"No active session found."}
Run Code Online (Sandbox Code Playgroud)

所以它只适用于我选择主帐户,但我无法选择其他YouTube帐户.

我在这里错过了什么?我查看了所有这些文档,但没有人帮助我:

获取个人资料信息

Google登录JavaScript客户端参考

监视用户的会话状态

更新:从运行该代码示例(但与此scope:'profile email https://www.googleapis.com/auth/youtube.readonly')如果让我选择的第一个YouTube帐户每个谷歌账户才会工作.如果我选择任何其他Youtube帐户,我会收到此警报错误:

在此输入图像描述

google-api youtube-api gapi google-oauth2 google-signin

13
推荐指数
0
解决办法
562
查看次数

将新的Google或Facebook登录信息与现有帐户相关联

我刚刚按照本文中的说明操作中的说明将Google添加为我的MVC 5应用程序的登录提供程序.一切似乎都运行正常,但当我通过谷歌登录时,它希望我在我的应用程序中注册Google提供的电子邮件/用户名作为新帐户.如果我按原样保留电子邮件并单击"注册"按钮,它会告诉我该地址已被占用,因为我之前已在我的应用程序自己的登录提供程序上注册.

如何调整MVC项目模板生成的默认代码以允许我将Google登录与现有本地帐户相关联?

PS我和Facebook有完全相同的问题.

asp.net-mvc facebook oauth asp.net-mvc-5 google-oauth2

12
推荐指数
2
解决办法
5747
查看次数

使用应用程序所有者帐户坚持使用google oauth 2的重定向循环

我无法使用谷歌oauth登录网站.我有多个Gmail帐户,似乎工作正常,但当我尝试通过应用程序所有者帐户登录.它不会让我登录并让我重定向到帐户选择UI.在该帐户登录失败后,我无法登录任何其他帐户,直到我清除我的cookie.

注意:我正在使用带有omniauth-oauth2(1.2.0)的Rails(4.0.5)

gmail omniauth ruby-on-rails-4 google-oauth2

12
推荐指数
0
解决办法
199
查看次数

恢复生产系统的已删除(?)Google OAuth客户端应用

我们从Google API获得了401错误:

401. That’s an error.
Error: deleted_client

The OAuth client was deleted.
Run Code Online (Sandbox Code Playgroud)

似乎Google-OAuth-API客户端已被删除.也许在firebase上?当我们删除一个在Google API上也被删除的firebase项目时,真的很奇怪......

有没有办法恢复这个?!

非常感谢你的帮助!

最好

google-api oauth-2.0 google-api-client google-oauth google-oauth2

11
推荐指数
1
解决办法
1万
查看次数

使用Google oAuth 2.0时,刷新新用户登录页面

我正在尝试使用Google Sign For Websites建立一个网站.主要是为了了解它是如何工作的.

我按照Google提供的教程中概述的步骤进行了正常工作.用户可以成功登录我的站点,它可以将用户ID传递给后端,然后使用php脚本验证ID服务器端.

Php然后在网站上为用户创建会话.我无法弄清楚当用户点击Google登录按钮并且登录成功时我将如何刷新页面.刷新页面将允许使用新的php会话数据重新加载主页.

<div class="g-signin2 signin-button" data-onsuccess="onSignIn" data-theme="dark"></div>

function onSignIn(googleUser){

        // The ID token you need to pass to your backend:
        var id_token = googleUser.getAuthResponse().id_token;

        var xhr = new XMLHttpRequest();
        xhr.open('POST', 'https://mywebsite.com/tokensignin.php');
        xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
        xhr.onload = function() {
            console.log('Signed in as: ' + xhr.responseText);
        };
        xhr.send('idtoken=' + id_token);
      };
Run Code Online (Sandbox Code Playgroud)

我试过简单地location.reload()在代码的onload = function()部分内部使用.这会导致页面每次加载时都会无限刷新,但是由于Google xhr每次都通过此变量验证用户是否已登录.

我已经尝试通过他们的参考查看GoogleAuth.isSignedIn.listen(listener)用于监视任何更改,但它似乎没有满足我想要它或我没有正确使用它,因为我不知道听众应该是什么.

另一种选择可能是使用它们的GoogleAuth.attachClickHandler(container, options, onsuccess, onfailure)功能,但我不完全确定如何正确配置选项字段/变量.

如果有人能够提供一些有关这个世界如何运作的见解,我会非常感激.

总结一下,如果用户已经使用Google登录我的网站,我希望页面不执行任何操作,如果他们点击登录按钮,则在登录成功后我想刷新他们所在的页面.

javascript php jquery google-oauth2 google-signin

10
推荐指数
1
解决办法
2298
查看次数

Passport&JWT和谷歌/ Facebook战略 - 我如何结合JWT和谷歌/ Facebook战略?

这个问题适合任何熟悉的人

  • Node.js的
  • 表达
  • 护照
  • 带护照的JWT认证(JSON Web令牌)
  • Facebook OAuth2.0或Google OAuth2.0

我一直在做一些在线课程,并了解如何做以下两件事:

  1. 使用Passport本地策略+ JWT令牌进行身份验证
  2. 使用Passport Google/Facebook策略+ Cookie /会话进行身份验证.

我试图基本上结合这两门课程的内容.我想使用Google Strategy + JWT身份验证.我想使用JWT而不是cookie,因为我的应用程序将是一个网络/移动/平板电脑应用程序,我需要从不同的域访问api.

我对此有两个问题: 要启动Google/facebook OAuth管道,您需要调用'/ auth/facebook'或'/ auth/google'.两个Oauth流程基本相同,所以当我从现在开始说"/ auth/google"时,我指的是其中之一.现在我遇到的问题是:在客户端,我是否通过href按钮链接或axios/ajax调用调用'/ auth/google'路由?如果我使用href或axios/ajax方法,我仍然会遇到两种解决方案的问题.

href方法问题: 当我将<a>带有href 的标签分配给'/ auth/google'时,身份验证工作完全正常.用户被推送到Google Auth流程,他们登录并调用'/ auth/google/callback'路由.我现在遇到的问题是如何从'/ auth/google/callback'正确地将JWT令牌发送回客户端?

经过大量的谷歌搜索后,我看到人们只是通过重定向查询参数中的oauth回调将JWT传递回客户端.例如:

res.redirect(301, `/dashboard?token=${tokenForUser(req.user)}`);
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,现在我的浏览器历史记录中保存了身份验证功能!我可以注销(破坏localStorage中保存的令牌),然后只需查看我的浏览器URL历史记录,回到查询参数中包含令牌的URL,我会自动再次登录而无需经过谷歌策略!这是一个巨大的安全漏洞,显然是接近它的错误方法.

axios/ajax方法问题: 在我解释这个问题的问题之前,我肯定知道如果我得到这个工作,它将解决我以前的href问题所遇到的所有问题.如果我设法从axios.get()调用中调用'/ google/auth'并在响应正文中接收JWT,我将不会将该令牌作为url param发送,并且它不会保存在浏览器历史记录中!完美对吗?这种方法还存在一些问题:(

尝试调用时,axios.get('/auth/google')我收到以下错误:

在此输入图像描述

我是如何尝试解决问题的:

  • 我在我的npm服务器上安装了cors,并添加app.use(cors());到我的index.js中.
  • 我采取了一个刺,并将" http:// localhost:3000 "添加到Google开发人员控制台中的"授权JavaScript来源".

这些解决方案都没有解决问题,所以现在我真的感到困惑.我想使用axios/ajax方法,但我不确定如何克服这个cors错误.

抱歉这么长的消息,但我真的觉得我必须给你所有的信息,以便你能够正确地帮助我.

再次感谢,期待收到您的来信!

oauth-2.0 facebook-oauth jwt passport.js google-oauth2

10
推荐指数
2
解决办法
3128
查看次数