如何登录和登录

本文关键字:登录 何登录 | 更新日期: 2023-09-27 18:18:25

HELP !
我正在尝试升级我的程序,以支持谷歌在AdWords中使用的新oAuth。
使用我的网站,我能够为我的用户创建一个accessToken和一个accessTokenSecret,并将其存储在我的数据库中。

我的问题是当我稍后尝试使用这些凭据进行soap请求时。

  • 我需要从网站部分保存哪些信息?到目前为止,我只保存了accessToken和accessTokenSecret。还有别的吗?
  • 我如何使用accessToken, accessTokenSecret和我保存的其他任何东西来发出SOAP请求?(请尽可能"低级别","只在请求头中使用它们"不会帮助我)。

关于我的进程的一些信息:

  • 没有使用来自Google的客户端库(太多了,到目前为止我不需要它们)。
  • 在我使用的服务上使用VS2005 WSDL使用自动生成的SOAP代码。
  • c#代码。

任何帮助都是非常感激的。
谢谢!

=======================================================================================根据建议,我以以下方式扩展了GetWebRequest:

protected override WebRequest GetWebRequest(Uri uri)
        {
            WebRequest request = base.GetWebRequest(uri);
            String token = "XXXXXXXXXXX";//a valid token - changed for here.
            String secret = "XXXXXXXXXXXX";//a valid secret - changed for here.
            String consumerKey = "anonymous";
            String consumerSecret = "anonymous";
            String sigMet = "HMAC-SHA1";
            String oauth_timestamp = ((DateTime.UtcNow.Ticks - new DateTime(1970, 1, 1).Ticks) / (1000 * 10000)).ToString();
            String oauth_nonce = Guid.NewGuid().ToString();
            Parameter[] paramArray = new Parameter[]{
                                        new Parameter("oauth_consumer_key", consumerKey),
                                        new Parameter("oauth_token", token),
                                        new Parameter ("oauth_signature_method", sigMet),
                                        new Parameter ("oauth_timestamp", oauth_timestamp),
                                        new Parameter ("oauth_nonce", oauth_nonce)
                                        };
            String oauth_signature = CreateHMACSHA1Signature(
                                        request.Method,
                                        uri,
                                        paramArray,
                                        consumerSecret,
                                        secret
                                        );
            request.Headers.Add(
                            "Authorization: OAuth " +
                            "realm='"" + "https://www.google.com/" + "'"," +
                            "oauth_consumer_key='"" + Parameter.EncodeParameterString(consumerKey) + "'"," +
                            "oauth_token='"" + Parameter.EncodeParameterString(token) + "'"," +
                            "oauth_signature_method='"" + Parameter.EncodeParameterString(sigMet) + "'"," +
                            "oauth_signature='"" + Parameter.EncodeParameterString(oauth_signature) + "'"," +
                            "oauth_timestamp='"" + Parameter.EncodeParameterString(oauth_timestamp) + "'"," +
                            "oauth_nonce='"" + Parameter.EncodeParameterString(oauth_nonce) + "'""
                        );
            return request;
        }

函数CreateHMACSHA1SignatureOAuthGetRequestTokenOAuthAuthorizeToken相同。但是当与SOAP一起使用时,我得到以下错误:
System.Web.Services.Protocols.SoapException: AuthenticationError。OAUTH_TOKEN_HEADER_INVALID @ Service[ServicedAccountService.get]

知道为什么吗?

如何登录和登录

我已经在。net客户端库的背景下回答了这个问题,在谷歌广告API, c#, SOAP请求与新的oAuth 1.0?但是要在NoClientLibrary上下文中回答你的问题,

  1. 除了OAuth访问密钥和secret之外,您只需要消费者密钥。
  2. 您需要像请求普通OAuth保护的资源一样对请求进行签名。然后将签名放在SOAP web请求的授权HTTP头(而不是SOAP头)中。然而,获取SOAPHttpClientProtocol对象的底层HttpWebRequest并不是那么简单。您需要扩展SOAPHttpClientProtocol对象,覆盖受保护的GetWebRequest方法,并在此阶段设置您的OAuth头:类似于:

    protected override WebRequest GetWebRequest(Uri uri) {
      WebRequest request = base.GetWebRequest(uri);
      string oAuthHeader = SignTheRequestAndGetTheOAuthHeader(request);
      if (!string.IsNullOrEmpty(oAuthHeader)) {
         request.Headers["Authorization"] = oAuthHeader;
      }
      return request;
    }
    

这也意味着您必须手动修改自动生成的代码来更改存根服务类的基类,从长远来看,这是您不太喜欢的。另外,如果您不知道如何正常地请求受OAuth保护的资源,请参阅http://oauth.net/core/1.0/#anchor13上的相关文档。

现在,这是在。net客户端库中已经为您处理好的事情。该库并不难使用,在http://code.google.com/p/google-api-adwords-dotnet/wiki上有足够的wiki文章来指导您。我建议您使用。net客户端库,但如果您选择不这样做,那么在使用NoClientLibrary路线时,您应该注意以下陷阱列表:http://code.google.com/p/google-api-adwords-dotnet/wiki/NoClientLibrary.

我还想提一下AdWords API的官方讨论论坛是http://groups.google.com/group/adwords-api?pli=1,我经常在那里回答开发人员的问题。如果您有任何后续问题,请随时在那里提问,我很乐意回答您的问题。

欢呼,Anash

成功!!

我很好地发现了问题所在,这只是偶然。在创建签名时,我使用request.method作为方法参数。
这样做的问题是,此时方法是"GET",但SOAP机制将其更改为"POST"(因此它可以传递SOAP参数),这导致我的签名不工作。

我唯一需要做的就是修改:

String oauth_signature = CreateHMACSHA1Signature(
    request.Method,
    ...
    )

:

String oauth_signature = CreateHMACSHA1Signature(
    "POST",
    ...
    )