当前位置: 首页 > 知识库问答 >
问题:

如何实现OAUTH 2.0以访问Google Analytics

宰父夕
2023-03-14

我已经读到谷歌停止了之前的身份验证方法来访问谷歌API,所以现在我们必须使用OAuth2身份验证方法。我已经读到,我们必须去开发人员控制台获取ClientID和客户机机密,这样我们才能执行身份验证。但我在编写成功登录所需的更改代码方面遇到了很大的困难。

我正在寻找在登录级别进行更改的指导方针。我试图应用我在网上找到的一些代码,但我没有成功。关于开发者控制台,我已经有了一个带有客户端ID和秘密的项目,所以我没有生成一个新的,而是使用已经生成的客户端ID和秘密。

这是谷歌变更前的工作代码:

    {
    /// <summary>
    /// Summary description for GoogleAnalytics
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    [System.Web.Script.Services.ScriptService]
    public class GoogleAnalytics : System.Web.Services.WebService
    {
        [WebMethod]
        public string GetAnalyticsPageViews()
        {
            string returnValue = string.Empty;

            object cacheObjPageViewsCount = CacheService.Get(CacheService.ANALYTICSPAGEVIEWS);

            if (cacheObjPageViewsCount != null)
                returnValue = cacheObjPageViewsCount as string;
            else
            {
                try
                {
                    string userName = Configurations.GetConfigurationValueAsString("GoogleAnalyticsUsername");
                    string passWord = Configurations.GetConfigurationValueAsString("GoogleAnalyticsPassword");
                    string profileId = Configurations.GetConfigurationValueAsString("GoogleAnalyticsProfileId");

                    const string dataFeedUrl = "https://www.googleapis.com/analytics/v2.4/data";

                    AnalyticsService service = new AnalyticsService("ApplicationName");
                    if (!string.IsNullOrEmpty(userName))
                    {
                        service.setUserCredentials(userName, passWord);
                    }

                    DataQuery query1 = new DataQuery(dataFeedUrl);
                    query1.Ids = "ga:" + profileId;
                    query1.Metrics = "ga:visits";
                    query1.Sort = "ga:visits";
                    query1.GAStartDate = DateTime.Now.AddYears(-1).ToString("yyyy-MM-dd");
                    query1.GAEndDate = DateTime.Now.ToString("yyyy-MM-dd");
                    query1.StartIndex = 1;
                    DataFeed dataFeedVisits = service.Query(query1);
                    DataEntry dataEntry = (DataEntry)dataFeedVisits.Entries[0];
                    returnValue = dataEntry.Metrics[0].Value;
                }
                catch (Exception exc)
                {
                    LogService.LogException(exc);
                    returnValue = string.Empty;
                }

                CacheService.Add(CacheService.PP_ANALYTICSPAGEVIEWS_COUNT_CACHE_KEY, returnValue);
            }

            return returnValue;
        }
    }
}

这是我试图完成的改变

而不是使用if“service.setUserCredentials(用户名、密码)我使用“GoogleOAutho2.authenticate();”这样做的结果是,它会打开一个新页面,出现以下错误:请求中的重定向URI:http://localhost:60279/authorize/与注册的重定向URI不匹配。

我不明白为什么我要发送到一个新页面,以前的身份验证方法没有发生这种情况,我错过了什么?

提前谢谢你,N

我被发送到的页面:

https://accounts.google.com/o/oauth2/auth?access_type=offline

(此代码基于此示例)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Google.Apis.Analytics.v3;
using Google.Apis.Auth.OAuth2;
using System.Threading;
using Google.Apis.Util.Store;
using Google.Apis.Services;
using System.Security.Cryptography.X509Certificates;
using System.IO;

namespace GoogleOAuth2 { 

class GoogleOAutho2
{

    static string[] scopes = new string[] {
        AnalyticsService.Scope.Analytics,  // view and manage your Google Analytics data
        AnalyticsService.Scope.AnalyticsEdit,  // Edit and manage Google Analytics Account
        AnalyticsService.Scope.AnalyticsManageUsers,   // Edit and manage Google Analytics Users
        AnalyticsService.Scope.AnalyticsReadonly};     // View Google Analytics Data

    static String CLIENT_ID = "CLIENTID"; // found in Developer console
    static String CLIENT_SECRET = "SECRET";// found in Developer console
    // here is where we Request the user to give us access, or use the Refresh Token that was previously stored in %AppData%


    public static bool authenticate()
    {

        try
        {
            UserCredential credential = GoogleWebAuthorizationBroker.AuthorizeAsync(new ClientSecrets { ClientId = CLIENT_ID, ClientSecret = CLIENT_SECRET }, scopes, Environment.UserName, CancellationToken.None, new FileDataStore("XXX.GoogleAnalytics.Auth.Store")).Result;

            return true;
        }
        catch (Exception exeption)
        {
            string error = exeption.Message;
            return false;
        }
    }
}
}

共有1个答案

邵伟泽
2023-03-14

不确定这是否有帮助。我没有使用这些相同的类,甚至没有C#。我使用的方法是直接超文本传输协议调用。在我的实现中,我调用https://accounts.google.com/o/oauth2/auth作为redirect_uri参数传递API控制台中指定的相同值(见屏幕截图)。

 类似资料:
  • 本文向大家介绍如何实现跨域访问?相关面试题,主要包含被问及如何实现跨域访问?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: JSONP:通过动态创建script,再请求一个带参网址实现跨域通信。document.domain + iframe跨域:两个页面都通过js强制设置document.domain为基础主域,就实现了同域。 JSONP:ajax请求受同源策略影响,不允许进行跨域请求,

  • laravel的一个问题,我简化了一下是这样。 我想让访问接口 /a,未登录状态访问返回 0, 登录状态下返回 1,如何实现? 正常是这样。topic 状态为 1 时可以任何人访问,状态未 2 时,只有作者可以访问。 上边这种情况,无论登录与否,$user 都是 null。 如果 route 加上 middleware('auth'), 那么未登录状态又无法访问。

  • 问题内容: java中如何实现访问控制,public, protected, default和private关键字有何区别? 问题答案:

  • 本文向大家介绍Nginx 禁止IP访问如何实现,包括了Nginx 禁止IP访问如何实现的使用技巧和注意事项,需要的朋友参考一下 Nginx 禁止IP访问 我们在使用的时候会遇到很多的恶意IP攻击,这个时候就要用到Nginx 禁止IP访问了。下面我们就先看看Nginx的默认虚拟主机在用户通过IP访问,或者通过未设置的域名访问(比如有人把他自己的域名指向了你的ip)的时候生效最关键的一点是,在serv

  • OAuth2ClientOptions credentials=new OAuth2ClientOptions().setClientId(clientId).setClientSecret(clientSecret).setFlow(Oauth2FlowType.client).setTokenPath(“oauth/token URL”); 错误:访问令牌错误;io/vertx/ext/jwt

  • 当客户端请求资源服务器使用OAuth2.0访问令牌获取受保护的资源时,该服务器如何验证该令牌?OAuth 2.0刷新令牌协议?