标签: google-authentication

如何验证Google身份验证API访问令牌?

如何验证Google身份验证访问令牌?

我需要以某种方式查询Google并询问:[给定访问令牌]是否对[example@example.com] Google帐户有效?

简短版本:
很清楚如何使用通过Google身份验证Api :: OAuth身份验证的Web应用程序提供的访问令牌,然后从一系列Google服务中请求数据.目前尚不清楚如何检查给定的访问令牌是否对给定的Google帐户有效.我想知道怎么做.

长版:
我正在开发一个使用基于令牌的身份验证的API.在提供有效的用户名+密码或从N个可验证服务中的任何一个提供第三方令牌时,将返回令牌.

其中一项第三方服务是Google,允许用户使用其Google帐户对我的服务进行身份验证.稍后将扩展到包括雅虎帐户,可信赖的OpenID提供商等.

基于Google的访问的示意图:

alt text http://webignition.net/images/figures/auth_figure002.png

"API"实体完全由我完全控制."公共接口"实体是任何基于Web或桌面的应用程序.一些公共界面在我的控制之下,其他公共界面不在我手中,而其他公共界面我甚至都不知道.

因此,我无法信任在步骤3中提供给API的令牌.这将与相应的Google帐户电子邮件地址一起提供.

我需要以某种方式查询Google并询问:此访问令牌是否对example@example.com有效

在这种情况下,example @ example.com是Google帐户的唯一标识符 - 用户登录其Google帐户时使用的电子邮件地址.这不能被视为Gmail地址 - 有人可以拥有一个没有Gmail帐户的Google帐户.

Google文档明确说明了如何通过访问令牌从多个Google服务中检索数据.似乎没有任何东西可以说明如何在一开始就检查给定的访问令牌是否有效.

更新 令牌对N个Google服务有效.我不能尝试使用Google服务的令牌作为验证它的方法,因为我不知道给定用户实际使用的所有Google服务的哪个子集.

此外,我永远不会使用Google身份验证访问令牌来访问任何Google服务,仅仅是为了验证所谓的Google用户实际上是他们所说的人.如果还有另一种方法,我很乐意尝试.

api web-services oauth google-authentication google-oauth

114
推荐指数
8
解决办法
9万
查看次数

我在哪里可以找到Google OAuth 2.0 API的范围列表?

我正在使用的示例将OAuth请求中的范围指定为:scope = https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email + https%3A%2F%2Fwww.googleapis.com%2Fauth% 2Fuserinfo.profile

它解码为两个URI:

我找不到文档,其中包含可用范围的完整列表以及每个范围内可访问的信息 - 有人知道这样的事情是否存在?

google-authentication oauth-2.0

110
推荐指数
6
解决办法
8万
查看次数

使用OAuth2为app*和*网站进行身份验证

我正在开发一个主要通过应用程序访问的网站,我想使用OAuth2进行用户注册和身份验证.由于它是Android应用程序,我将开始使用Google的OAuth2内容,因为它在Android上提供了不错的用户界面.

Google表示,"您可以选择使用Google的身份验证系统作为外包用户身份验证的方式.这可以消除创建,维护和保护用户名和密码存储的需要." 这就是我想要做的.然而,当我浏览他们的所有示例和诸如此类的东西时,我只能找到有关网站应用程序根据Google服务对用户进行身份验证的内容.

事实上,当我使用Google的OAuth2注册我的应用程序("客户端")时,网站客户端和"已安装"客户端(即移动应用程序)可以选择,但不能同时选择两者.我可以创建两个单独的客户端,但我读了OAuth2草案,我认为会有一个问题,我现在将解释.

以下是我设想的工作方式:

OAuth2流程图

  1. 用户要求MyApp访问他的私人数据.
  2. 应用程序使用Android的AccountManager类为Google的API请求访问令牌.
  3. Android向用户说"应用'MyApp'希望在Google上访问您的基本信息.这可以吗?"
  4. 用户说是的.
  5. AccountManager 使用手机上存储的凭据连接到Google的OAuth2服务器,并要求提供访问令牌.
  6. 返回访问令牌(在绿线后面).
  7. AccountManager 将访问令牌返回给MyApp.
  8. MyApp向MySite发送请求以获取用户的私有数据,包括访问令牌.
  9. MySite需要使用访问令牌验证用户.它验证了此处描述的令牌,谷歌 - "谷歌,这个令牌有效吗?".
  10. 现在,我想要发生的事情是谷歌说"是的,无论是谁给你的确是那个用户."但我认为实际发生的事情(基于OAuth2草案和Google的文档)是它会说"不"方式!该令牌仅对MyApp有效,而且你是MySite.GTFO!".

那我该怎么做呢?请不要说"使用OpenID"或"不要使用OAuth2"或其他类似无益的答案.哦,我真的想用漂亮的,以保持AccountManager用户界面,而不是糟糕的弹出WebView小号

编辑

来自Nikolay的临时答案(我会报告它是否有效!)它实际上应该有效,而Google的服务器并不关心访问令牌的来源.对我来说似乎有点不安全,但我会看看它是否有效!

更新

我用Facebook而不是Google实现了这种模式,它完全有效.OAuth2服务器不关心访问令牌的来源.至少Facebook没有,所以我认为谷歌也没有.

鉴于此,存储访问令牌是一个非常糟糕的主意!但是我们也不想让Facebook/Google的服务器检查每个请求的身份验证,因为它会减慢一切.可能最好的办法是为您的站点添加一个额外的身份验证cookie,当您的访问令牌被验证时,您可以将其分发,但更简单的方法就是将访问令牌视为密码并存储其哈希值.你不需要加盐它,因为访问令牌真的很长.所以上面的步骤变成了:

9. MySite需要使用访问令牌验证用户.首先,它检查哈希有效访问令牌的缓存.如果在那里找到令牌的散列,则它知道用户已经过身份验证.否则,它会按照此处所述与Google进行核对- Google,"此令牌是否有效?".

10.如果Google说访问令牌无效,我们会告诉用户GTFO.否则谷歌说"是的,这是一个有效的用户",然后我们检查我们的注册用户数据库.如果找不到Google用户名(或Facebook id,如果使用Facebook),我们可以创建新用户.然后我们缓存访问令牌的散列值.

android oauth google-authentication oauth-2.0

63
推荐指数
2
解决办法
2万
查看次数

错误:req#logout 需要回调函数

无法找到解决方案,尝试了一切,我只是使用护照的新手。错误:req#logout 需要一个回调函数, 我之前已经编码过,但当时我没有收到任何错误,但这次不知道为什么我收到这个,我还阅读了护照文档并尝试了所有解决方案

提前致谢

<%- include('partials/header') %>

<header>
    <nav class="flex align-item-center">
        <div class="div-left">
            <img id="userimg" src="img/user.png" alt="logo">
        </div>
        <div class="div-right flex">
            <div style="font-size: 14px">
                <a href="/logout" role="button"> Logout</a>
            </div>
        </div>
    </nav>
</header>

<%- include('partials/footer') %>
Run Code Online (Sandbox Code Playgroud)

js代码

require('dotenv').config();
const express = require("express");
const bodyParser = require("body-parser");
const ejs = require("ejs");
const mongoose = require("mongoose");
const session = require('express-session');
const passport = require('passport');
const passportLocalMongoose = require('passport-local-mongoose');
const GoogleStrategy = require('passport-google-oauth20').Strategy;
const findOrCreate = require('mongoose-findorcreate');

const app = express();

app.use(express.static("public"));
app.set('view …
Run Code Online (Sandbox Code Playgroud)

javascript google-authentication express passport.js

51
推荐指数
2
解决办法
4万
查看次数

谷歌登录失败com.google.android.gms.common.api.ApiException:10:

所以我陷入了这个令人沮丧的问题.我对Firebase上的Google Auth很新,但我完成了firebase文档指示如何集成Google SignIn Auth的所有内容,但我仍然在控制台中收到这个奇怪的错误,包括两部分:

12-03 11:07:40.090 2574-3478/com.google.android.gms E/TokenRequestor: You have wrong OAuth2 related configurations, please check. Detailed error: UNREGISTERED_ON_API_CONSOLE
Run Code Online (Sandbox Code Playgroud)

并且

Google sign in failed com.google.android.gms.common.api.ApiException: 10:
Run Code Online (Sandbox Code Playgroud)

在任何人试图指出先前已经在堆栈溢出问题上提出的类似问题之前,这是我在看到所有可用解决方案之后到目前为止所做的事情,但是还没有解决错误

  • 我的项目有SHA1指纹
  • 我有我的OAuth 2.0客户端ID,android客户端ID和Web客户端,在requestIdToken()中我已经放了web客户端ID.
  • 我并没有公布谷歌Play商店我的项目的APK.这意味着我没有意外生成另一个SHA1指纹.
  • 我已逐步跟踪Google登录Auth firebase文档.

这是我的代码片段:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_signup);
    ButterKnife.bind(this);

    String webClientId = getString(R.string.web_client_id);


    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestEmail()
            .requestIdToken(webClientId)
            .build();

    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */)
            .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
            .build();

    mGoogleSignInClient = GoogleSignIn.getClient(this, gso);


    GoogleSignInAccount account …
Run Code Online (Sandbox Code Playgroud)

android google-authentication firebase

38
推荐指数
7
解决办法
4万
查看次数

gapi.auth2.ExternallyVisibleError:cookiePolicy无效

我正在尝试在我的应用中添加Google登录身份验证系统,但我一直收到一个我没见过的奇怪错误.我正在使用谷歌示例代码.

我认为在加载api时可能会出现一些错误,所以我检查了异步加载,一切似乎都正常加载,但我在控制台中不断收到此错误:

gapi.auth2.ExternallyVisibleError:cookiePolicy无效

我到处寻找有同样问题的人,但我找不到类似的东西.

有任何想法吗?

编辑:我试图创建一个只包含教程代码的页面,但错误仍然存​​在.

google-authentication google-signin

35
推荐指数
2
解决办法
2万
查看次数

Flutter 中未定义的类“AuthResult”

我一直在尝试使用 Flutter 实现 Google 登录屏幕。

final AuthResult authResult = await _auth.signInWithCredential(credential);
Run Code Online (Sandbox Code Playgroud)

上面一行的编辑说:

未定义的类“AuthResult”

我该如何解决?任何帮助将不胜感激。

google-authentication dart firebase-authentication google-signin flutter

29
推荐指数
3
解决办法
2万
查看次数

首先使用Facebook进行身份验证然后使用Google导致Firebase for Android出现错误

据我在Firebase文档中了解,如果用户使用凭据对其帐户进行身份验证,则如果凭据尚未与其他凭据相关联,则应使用相同的凭据严格登录.

换句话说,如果我使用Google登录创建帐户,然后(退出后)尝试使用与Google凭据相同的电子邮件登录Facebook凭据,我应该在logcat中看到此异常:

"已存在具有相同电子邮件地址但登录凭据不同的帐户.请使用与此电子邮件地址关联的提供商登录."

是的,我毫不奇怪地得到了这个例外.但是,如果我使用Facebook创建帐户,然后尝试使用Google凭据登录,则此帐户(Facebook)的提供商将转换为Google.此时身份验证不会失败,但不是预期的结果.我想以某种方式将每个用户与特定凭据相关联.我该怎么解决这个问题?你可以看到下面的代码:

public class SignInActivity extends AppCompatActivity implements GoogleApiClient.OnConnectionFailedListener,
        View.OnClickListener {

    private static final String TAG = "SignInActivity";
    private static final int RC_SIGN_IN = 9001;

    private GoogleApiClient mGoogleApiClient;
    private FirebaseAuth mFirebaseAuth;
    private FirebaseAuth.AuthStateListener mFirebaseAuthListener;

    private CallbackManager mCallbackManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_sign_in);

        // Facebook Login
        FacebookSdk.sdkInitialize(getApplicationContext());
        mCallbackManager = CallbackManager.Factory.create();

        LoginButton mFacebookSignInButton = (LoginButton) findViewById(R.id.facebook_login_button);
        mFacebookSignInButton.setReadPermissions("email", "public_profile");

        mFacebookSignInButton.registerCallback(mCallbackManager, new FacebookCallback<LoginResult>() {
            @Override
            public void onSuccess(LoginResult loginResult) {
                Log.d(TAG, "facebook:onSuccess:" + loginResult);
                firebaseAuthWithFacebook(loginResult.getAccessToken());
            }

            @Override …
Run Code Online (Sandbox Code Playgroud)

android google-authentication facebook-login firebase firebase-authentication

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

使用MVC5中的OWIN Oauth进行的Google身份验证不会影响ExternalLoginCallback功能

我目前正在升级我的Google登录流程,以便在他们的OpenID登录方法之前使用OAuth.

到目前为止,我已经确定的步骤是我已将Microsoft.Owin.Security.Google软件包升级到版本2.1.0,因为此版本包含在UseGoogleAuthentication方法中包含选项的功能.

我试图在链接中使用Alex Wheat的解决方案: 从外部身份验证提供程序获取MVC5框架OAuth/OWin身份提供者的ExtraData

Startup.Auth.cs中的代码(也包括Facebook身份验证)来自于:

    var facebookAuthenticationOptions = new FacebookAuthenticationOptions()
        {
            AppId = "MYAPPID",
            AppSecret = "MYSECRET"
        };
        facebookAuthenticationOptions.Scope.Add("email");
        app.UseFacebookAuthentication(facebookAuthenticationOptions);

        app.UseGoogleAuthentication();
Run Code Online (Sandbox Code Playgroud)

对此:

var facebookAuthenticationOptions = new FacebookAuthenticationOptions()
        {
            AppId = "MYAPPID",
            AppSecret = "MYSECRET"
        };
        facebookAuthenticationOptions.Scope.Add("email");
        app.UseFacebookAuthentication(facebookAuthenticationOptions);


        var googleOAuth2AuthenticationOptions = new GoogleOAuth2AuthenticationOptions
        {
            ClientId = "MYCLIENTID",
            ClientSecret = "MYSECRET",
            CallbackPath = new PathString("/en/Account/ExternalLoginCallback"),
            Provider = new GoogleOAuth2AuthenticationProvider()
            {

            }
        };

        app.UseGoogleAuthentication(googleOAuth2AuthenticationOptions);
Run Code Online (Sandbox Code Playgroud)

在我向Google身份验证添加选项后,我的应用不允许为Google或Facebook调用ExternalLoginCallback操作(不更改Facebook代码,但问题仍会影响它).

在前端,单击外部登录按钮后,页面将我重定向到下面的链接并返回一个空白屏幕

https ....../en/Account/ExternalLoginCallback #__ = _(在=符号之前实际上只有一个下划线,如果我在地址栏上显示它,则SO语法将其删除).

对于Facebook和

HTTPS ....../EN /帐号/ ExternalLoginCallback

对于谷歌.它没有像往常那样点击下面的控制器方法(我试图在这个函数中放置调试断点,并且当有google身份验证选项时它永远不会停止.

    // GET: /Account/ExternalLoginCallback
    [AllowAnonymous]
    public …
Run Code Online (Sandbox Code Playgroud)

asp.net-mvc oauth google-authentication owin asp.net-identity

24
推荐指数
3
解决办法
3万
查看次数

Web Google Auth - 403 的解决方法:disallowed_useragent 存在吗?

StackOverflow 上有很多关于此问题的帖子,但没有一个为 Web 应用程序提供解决方法,以便在嵌入式浏览器(如 iOS 上的 Facebook/Facebook Messenger)中通过 Google Web Auth 登录服务;但我发现 Pinterest 的网络登录与 Google 按钮似乎可以正常工作,所以我想知道是否有人知道如何让它工作。

几年前,Google 禁止从 webview 登录 Google , Auth0 也发表了一篇有关解决方法的博客文章,但这一切似乎都集中在本机应用程序上,而不是提供 Google 作为登录选项的 Web 应用程序。

但我公司的应用程序是一个网络应用程序,我们希望当有人在 Facebook Messenger/Facebook 帖子上分享我们网站的链接时,用户可以使用 Google 登录,即使他们没有弹出本机 Safari 浏览器。根据上述文档,这似乎是不可能的 - 但实际上我发现 Pinterest 的“使用 Google 登录”按钮确实有效!所以看来有一种方法可以让 Google 登录正常工作(不确定他们是否与 Google 达成了特殊协议,或者他们是否正在做我们/Auth0 也可以做的事情)。

重现步骤:

  1. 在 iOS 中打开 Facebook Messenger(这应该也适用于 Facebook,但这说明了问题)
  2. 向自己发送一条包含 URL 的消息https://community.auth0.com
  3. 单击 Auth0 社区论坛的链接
  4. 点击登录
  5. 点击使用 Google 登录
  6. 您会看到 403: disallowed_useragent 错误。

为了证明似乎确实有一种方法可以在野外完成此操作:

  1. 确保您的手机未安装 Pinterest(否则您的手机将在本机应用程序中打开它)。
  2. 在 iOS 中打开 Facebook Messenger
  3. 向自己发送一条包含 …

authentication google-authentication webview google-oauth

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