标签: google-oauth

PHP API Youtube上传,例外:无法启动可恢复上传,必须将上传发送到上传URL

我正在尝试构建一个用于将视频上传到YouTube的服务器应用程序.在我的服务器应用程序中,用户可以将视频直接上传到我的YouTube频道以公开.

在此输入图像描述

  1. 我的应用程序的客户端部分获取视频并将其上载到我的服务器.
  2. 然后,我的服务器使用YouTube API将视频上传到我的YouTube频道.

为了使这项工作,我创建了一个虚拟Web应用程序,可以捕获生成的刷新令牌,并将其存储在一个key.txt文件中

{"access_token":"MYTOKEN","token_type":"Bearer","expires_in":3600,"created":1435654774}
Run Code Online (Sandbox Code Playgroud)

upload_video.php脚本会自动更新"key.txt",如果文件access_token是过时的.这是来自的代码upload_video.php:

$key = file_get_contents('key.txt');

$application_name = 'YouTube_Upload'; 
$client_secret    = 'MY_CLIENT_SECRET';
$client_id        = 'MY_CLIENT_ID';
$scope            = array('https://www.googleapis.com/auth/youtube.upload', 'https://www.googleapis.com/auth/youtube', 'https://www.googleapis.com/auth/youtubepartner');

$videoPath        = "Test.f4v";
$videoTitle       = "A tutorial video";
$videoDescription = "A video tutorial on how to upload to YouTube";
$videoCategory    = "22";
$videoTags        = array("youtube", "tutorial");

try{
    // Client init
    $client = new Google_Client();
    $client->setApplicationName($application_name);
    $client->setClientId($client_id);
    $client->setAccessType('offline');
    $client->setAccessToken($key);
    $client->setScopes($scope);
    $client->setClientSecret($client_secret);

    if ($client->getAccessToken()) {

        /**
         * Check …
Run Code Online (Sandbox Code Playgroud)

php google-api youtube-api google-oauth

17
推荐指数
1
解决办法
2317
查看次数

如何获取经过Google身份验证的用户(oauth2)的Google聊天(环聊)ID?

我正在使用xmpp客户端进行谷歌聊天.我需要Google Talk ID,其类似于用户的"xxxxx@public.talk.google.com".使用oauth2,我可以获取电子邮件ID(gmail)和其他个人资料信息,但我无法弄清楚如何获取Google聊天ID.

我知道我可以使用电子邮件ID代替Google聊天ID用于所有目的.我需要Google聊天ID,因为我在我的用户表中使用电子邮件ID作为标识符.每当用户在Google聊天(环聊)中收到消息时,我都会将ID从"xxxxx@public.talk.google.com"获取.我无法检查我的用户表中是否有发件人记录.如果我可以在人们使用我的客户端进行身份验证时检索Google聊天ID,我可以将其存储在用户表中,并在用户收到消息时使用它来匹配.

发送邮件工作正常,因为我有目标用户的电子邮件ID,我可以用它来发送邮件.

请建议是否可以获取Google聊天ID

google-api google-talk hangout google-oauth

17
推荐指数
1
解决办法
8803
查看次数

保存当前的GIDGoogleUser,而不是每次启动时都登录

我正在用GIDSignInButton我的用户签到谷歌.问题是,我不确定如何保存当前用户,以便每个用户每次打开应用程序时都不必登录.我尝试过使用signInSilently()The operation couldn’t be completed. (com.google.GIDSignIn error -4.)每次都得到.

头文件中的错误说明了这一点:

// Indicates there are no auth tokens in the keychain. This error code will be returned by
  // signInSilently if the user has never signed in before with the given scopes, or if they have
  // since signed out.
  kGIDSignInErrorCodeHasNoAuthInKeychain = -4,
Run Code Online (Sandbox Code Playgroud)

就我而言,用户已经使用给定的范围登录,但他们还没有退出.所以我不确定是什么导致了这个错误.

用户登录后,如何将该实例保存到我signInSilently()之后可以使用的位置?是否还涉及刷新和访问令牌?

ios google-oauth swift

17
推荐指数
1
解决办法
1785
查看次数

android GoogleAuthUtil.getTokenWithNotification Intent回调未触发

我有一个后台服务,调用GoogleAuthUtl.getTokenWithNotification它,它正常工作,但我正在尝试实现此功能的回调部分,但是无法正常工作.

我已经实现了一个广播接收器并将其添加到清单中,我的应用程序中也有一个活动.以下是相关的代码段.

GoogleAuthUtil.getTokenWithNotification

GoogleAuthUtil.getTokenWithNotification(this.getContext(), account, "oauth2:" + GmailScopes.GMAIL_SEND, null, new Intent(AuthReceiver.AUTH_INTENT));
Run Code Online (Sandbox Code Playgroud)

AuthReceiver

public class AuthReceiver extends BroadcastReceiver
{
    public final static String AUTH_INTENT = "com.testoauth.AUTH_INTENT";

    public AuthReceiver()
    {
    }

    @Override
    public void onReceive(Context context, Intent intent)
    {
        Log.d("RECEIVER", "Received Auth broadcast.");
        NotificationManager notificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.cancelAll();
    }
}
Run Code Online (Sandbox Code Playgroud)

AndroidManifest

<receiver android:name=".AuthReceiver" android:enabled="true" android:exported="true">
    <intent-filter>
        <action android:name="com.testoauth.AUTH_INTENT" />
    </intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)

我不知道为什么它没有收到广播.我没有在日志中看到任何异常,并且没有任何迹象表明接收器完全被调用,它在调试时甚至不会在断点处中断.我做错了什么吗?

编辑

我正在使用min sdk 16和目标sdk 25

GoogleAuthUtil.getTokenWithNotification API文档中:

此方法专门用于后台任务.如果出现需要用户干预的错误,此方法负责推送相关通知.在用户解决通知之后,广播回叫.如果用户取消,则不会触发回调.

无论用户是否取消,都不会触发回调.除了ActivityManager显示通知(Displayed com.google.android.gms/.auth.uiflows.gettoken.GetTokenActivity)的说法之外,没有迹象表明com.testoauth.AUTH_INTENT已经在日志中发送了指定的广播意图(在这种情况下)."收到的Auth广播".日志中也没有消息.

包含此功能( …

android google-authentication google-play-services google-oauth android-broadcastreceiver

17
推荐指数
1
解决办法
786
查看次数

ASP.net核心web api:使用Facebook/Google OAuth访问令牌进行身份验证

几天来,我正试图通过Google和Facebook获得OAuth身份验证,以便在我的ASP.net核心web api项目中工作.

我现在的状态是:

  • 我有一个ASP.net核心Web Api项目,用户需要在其中进行身份验证
  • 我有一个有角度的2 web应用程序,它应该使用我的web api(带身份验证)
  • 我有一个Android应用程序,它应该使用我的web api(带身份验证)

我的目标是:

  • 使用Google/Facebook作为OAuth提供商进行登录
  • 稍后:添加自己的用户帐户(可能使用IdentityServer4)
  • 无需重定向到特殊的登录网站(如IdentityServer4解决方案).只需点击应用中的facebook/google按钮,即可访问,完成!

在我的Android和角度应用程序中,我能够从谷歌/ Facebook检索访问令牌.现在,我想使用OAuth隐式流,使用给定的访问令牌对我的web api上的用户进行身份验证(将令牌作为承载令牌放入标头中)

有我的问题:有没有任何genric方式来轻松做到这一点?我不想使用facebook/google SDK.

我试过以下:

  • 使用IdentityServer4:有了这个,我可以在我的webapi上使用facebook/google登录,但是需要重定向到IdentityServer4登录页面.有没有办法在我的应用程序中点击google/fb-Button并登录,而无需重定向到identityServer登录页面?
  • 使用谷歌/ Facebook验证的中间件(https://docs.microsoft.com/en-us/aspnet/core/security/authentication/social/):但是他们没有验证我发送承载令牌(试过无数种方法来实现适当的验证).这甚至可以在web api中使用吗?
  • 试图使用Microsoft.AspNetCore.Authentication.JwtBearer-Middleware并自己为google/facebook添加必要的选项,但也没有验证(以及无数次尝试)

在过去的几天里,我已经尝试了很多可能的解决方案,我完全陷入困境并且忘记了为实现这一目标我需要做些什么.在这一点上,我已经阅读了几乎每个asp.net web api oauth教程/ stackoverflow条目,但无法弄清楚如何在我的情况下使用这个我想要的.大多数教程仅适用于mvc-Websites或使用IdentityServer4重定向到其登录页面.

任何建议或解决方案?我错过了什么?

c# authentication google-oauth asp.net-core-webapi angular

17
推荐指数
1
解决办法
5359
查看次数

如何重置google oauth 2.0授权?

我正在使用Google API Client Library for JavaScript(Beta)在Web应用程序上授权用户google帐户(用于youtube操作).一切正常,但我不知道如何从我的应用程序"注销"用户,即重置访问令牌.

例如,以下代码检查用户授权,如果没有,则显示用户登录帐户的弹出窗口,并允许Web应用程序访问用户数据:

gapi.auth.authorize({client_id: CLIENT_ID, scope: SCOPES, immediate: false}, handleAuth);
Run Code Online (Sandbox Code Playgroud)

但客户端库没有重置授权的方法.

有一种解决方法可以将用户重定向到"accounts.google.com/logout",但这种方法不是我需要的:因此我们不仅从我的应用程序,而且从任何地方,从谷歌帐户注销用户.

Google常见问题解答和客户端库说明都没有帮助.

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

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

OAuth 2.0访问令牌已过期,并且刷新令牌不可用

我有一个基于Web的应用程序,它使用Google OAuth2.0作为登录框架.直到昨天它还能很好地工作.访问令牌过期后,applcation无法获取刷新令牌.除此之外,"请求许可"页面已更改为"具有离线访问权限",而不是"知道您在Google上的身份"和"查看您的电子邮件"

最初,"请求许可"页面将要求访问"了解您在Google上的身份"和"查看您的电子邮件".用户注销并尝试第二次登录后,"请求权限"页面也是相同的.

但是,直到昨天,"请求权限"页面已更改为"具有脱机访问权限".访问令牌过期后,我得到了错误消息:

PHP致命错误:未捕获的异常'Google_AuthException',并显示消息'OAuth 2.0访问令牌已过期,并且刷新令牌不可用.对于自动批准的回复,不会返回刷新令牌.在/home2/xxxx/public_html/test/google-api-php-client/src/auth/Google_OAuth2.php:221

我试过了$client->setAccessType('online');.但是,我仍然遇到了这个致命的错误.以下是获取访问令牌的代码:

    if ($client->getAccessToken()) {
      $token = $client->getAccessToken();
      $authObj = json_decode($token);
      $refreshToken = $authObj->refresh_token;
      $user = $oauth2->userinfo->get();
      $me = $plus->people->get('me');
      $email = filter_var($user['email'], FILTER_SANITIZE_EMAIL); // get the USER EMAIL ADDRESS using OAuth2

      $optParams = array('maxResults' => 100);
      $activities = $plus->activities->listActivities('me', 'public', $optParams);


      $_SESSION['access_token'] = $client->getAccessToken();
    } else {
      $authUrl = $client->createAuthUrl();
    }
Run Code Online (Sandbox Code Playgroud)

我试图像我一样搜索类似的问题,但我找不到一个.这发生在昨天以后.在此之前,我从未对代码做过任何更改.

access-token oauth-2.0 google-oauth

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

谷歌登录击中两次?

我正在通过JS使用谷歌登录,看来我的代码获取数据两次.我不确定为什么会这样.

当我点击"使用Google登录"按钮时,它会向用户吐出(console.log(result))数据.然后出现提示,要求我选择我的帐户(我登录了几个谷歌帐户).当我点击我想要的帐户时,代码会再次吐出该用户数据.

为什么会这样?这是一个问题,因为在我吐出数据的地方,我想做一个ajax调用来验证用户,然后重定向它们.所以从本质上说,它试图这样做两次 - 这并不酷,如果我不想使用凭据登录google在第一次转发时回传?

(function() {
   var po = document.createElement('script');
   po.type = 'text/javascript'; po.async = true;
   po.src = 'https://apis.google.com/js/client:plusone.js';
   var s = document.getElementsByTagName('script')[0];
   s.parentNode.insertBefore(po, s);
 })();

function googleLogin() {
    var additionalParams = {
        'callback': googleCallback
    };

    gapi.auth.signIn(additionalParams);
}

function googleCallback(authResult) {
    if (authResult['status']['signed_in']) {
        gapi.client.load('oauth2', 'v2', function() {
            gapi.client.oauth2.userinfo.get().execute(function(resp) {
                console.log(resp);
            })
        });
    } else {
        console.log('Sign-in state: ' + authResult['error']);
    }
}
Run Code Online (Sandbox Code Playgroud)

更新:如果我退出所有Google帐户(除了一个且只有一个),谷歌的调用仍然是重复的.这次它登录,我看到console.log()两次输出数据.访问令牌是相同的.

更新2: console.log(resp)输出两次

更新3:更多说明:

萤火虫

javascript google-api google-authentication google-api-client google-oauth

16
推荐指数
1
解决办法
4724
查看次数

Google API PHP离线访问,"invalid_grant:代码已被兑换"

如何在用户撤销授权之前永久授权Google客户端?

我正在尝试创建一个连接到Google日历的应用.它必须在PHP中运行,因此我使用谷歌提供的Google API PHP客户端.

该应用程序需要具有脱机访问权限,以便在用户不在会话中时可以使用.该应用程序旨在让用户在网站等上公开管理和显示他的日历.

我使用服务方法(具有客户端ID和客户端密钥)在Google控制台中创建了凭据.使用Google API客户端,我还要求用户授权.我打开一个新的浏览器窗口,用户授权,Google会返回授权码.我使用此代码,存储并使用它来授权客户端,该客户端成功连接到Google日历并交换数据.

现在,我明白这是一个即将到期的令牌.除非我使用离线访问,我设置.但是,几分钟或更短时间后,我总会收到错误:Error fetching OAuth2 access token, message: 'invalid_grant: Code was already redeemed.

这是我用来连接客户端的代码:

$client = new \Google_Client();
$client->setApplicationName( 'My App' );
$client->setScopes( array( \Google_Service_Calendar::CALENDAR ) );
$client->setClientId( $this->google_client_id );
$client->setClientSecret( $this->google_client_secret );
$client->setRedirectUri( $this->google_client_redirect );
$client->setAccessType( 'offline' );

if ( $code = $this->google_client_auth ) {

    try {

        $client->authenticate( $code );

    } catch( \Exception $e ) {
            var_dump( $e );
    }    

}

return new \Google_Service_Calendar( $client );
Run Code Online (Sandbox Code Playgroud)

这是一个类中的方法.

客户端ID和客户端密钥存储在应用程序设置中.

我也将用户返回的代码存储在一个设置中,但我认为这是我做错的地方?我在一个单独的方法(也使用相同的客户端ID)中将链接放到Google OAuth窗口并秘密和设置离线方法).并获得授权工作.我可以到达日历.它只是不会持续很长时间...

php oauth google-api google-oauth google-api-php-client

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

在渐进式网络应用中重定向到Google OAuth流程

我一直在使用React和Next.js开发应用程序,目前正在添加PWA支持.

用户通过Google OAuth流程登录该应用.我最初使用的是JS客户端,它使用弹出窗口,但在PWA中遇到了错误.我现在通过将用户重定向到Google的OAuth网址来使用正常的OAuth流程.

这在浏览器中工作正常.在iOS上的独立PWA中,它会在新的Safari窗口中打开OAuth页面.这意味着OAuth流程在Safari中执行,最后用户在Safari中使用应用程序而不是独立的PWA.

我正在使用这种方法重定向:

export function setHref(newLocation: string) {
  window.location.href = newLocation;
}
Run Code Online (Sandbox Code Playgroud)

这甚至看起来是每个人都建议在重定向PWA时避免弹出窗口的方法.这最近改变了吗?或者是否有另一种方法可以在独立的渐进式Web应用程序中执行重定向/ OAuth流程?

javascript oauth google-oauth progressive-web-apps

16
推荐指数
2
解决办法
3798
查看次数