使用 OAuth 访问令牌访问 SOAP 服务?

发布于 2024-10-13 09:27:37 字数 280 浏览 1 评论 0原文

我目前正在尝试通过 Chrome 扩展程序访问 Google 服务。我的理解是,对于 JS 应用程序,Google 的首选身份验证机制是 OAuth。我的应用程序目前已成功通过 OAuth 对服务进行身份验证。

查询服务的首选机制是通过 SOAP。然而,SOAP 有它自己的“身份验证令牌”概念,该概念设置在 XML 正文中。根据 Google 文档,我没有可以使用的旧式“ClientLogin”令牌。

如何使用经过 OAuth 身份验证的访问令牌运行 SOAP 查询?或者我应该使用不同的机制来查询或身份验证?

I'm currently trying to access a Google service via a Chrome extension. My understanding is that for JS apps Google's preferred authentication mechanism is OAuth. My app currently successfully authenticates via OAuth to the service.

The preferred mechanism to query the service is via SOAP. However SOAP has it's own 'auth token' concept which is set in the body of the XML. I do not have a old-style 'ClientLogin' token to use per Google's docs.

How can I run SOAP queries using my OAuth-authenticated access token? Or should I be using different mechanism to query or authenticate?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

逆光下的微笑 2024-10-20 09:27:37

回答我自己:

通过正常机制对 OAuth 进行身份验证,即在 JS 中:

var oauth = ChromeExOAuth.initBackgroundPage({
 'request_url': 'https://www.google.com/accounts/OAuthGetRequestToken',
 'authorize_url': 'https://www.google.com/accounts/OAuthAuthorizeToken',
 'access_url': 'https://www.google.com/accounts/OAuthGetAccessToken',
 'consumer_key': 'anonymous',
 'consumer_secret': 'anonymous',
 'scope': 'https://domain_for_your_api/',
 'app_name': 'Your app name'
});

然后对 SOAP 请求进行身份验证并作为回调运行:

function authenticateAndGetAlerts() {
    oauth.authorize(runMyRequest);
}

SOAP 标头是所记录内容的较小版本,省略了仅 ClientLogin API 所需的字段。

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="https://adwords.google.com/api/adwords/mcm/v201008" xmlns:ns2="https://adwords.google.com/api/adwords/cm/v201008" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <SOAP-ENV:Header>
  <ns1:RequestHeader xsi:type="ns2:RequestHeader">
   <ns2:developerToken>Your developer token</ns2:developerToken>
   <ns2:userAgent>Your app name</ns2:userAgent>
  </ns1:RequestHeader>
 </SOAP-ENV:Header>

身体正常。

然后使用适当的方法(JS 中的 oauth.sendSignedRequest)发布此内容,该方法会将所需的 OAuth 字段添加到查询字符串中:

var request = {
 'method': 'POST',
 'body': soapenvelope
};   
oauth.sendSignedRequest(url, callback, request);

完成。如果您需要手动执行查询而不是使用像 sendSignedRequest 这样的东西,它看起来像:

servicename.google.com/where/your/service/lives?oauth_consumer_key=anonymous&oauth_nonce=something&oauth_signature=something&oauth_signature_method=HMAC-SHA1&oauth_timestamp=something&oauth_token=something

TLDR:查询字符串中的 OAuth,省略 SOAP 标头中的所有身份验证信息。

Answering myself:

Authenticate to OAuth via the normal mechanism, ie, in JS:

var oauth = ChromeExOAuth.initBackgroundPage({
 'request_url': 'https://www.google.com/accounts/OAuthGetRequestToken',
 'authorize_url': 'https://www.google.com/accounts/OAuthAuthorizeToken',
 'access_url': 'https://www.google.com/accounts/OAuthGetAccessToken',
 'consumer_key': 'anonymous',
 'consumer_secret': 'anonymous',
 'scope': 'https://domain_for_your_api/',
 'app_name': 'Your app name'
});

Then authenticate and run your SOAP requests as a callback:

function authenticateAndGetAlerts() {
    oauth.authorize(runMyRequest);
}

The SOAP header is a smaller version of what's documented, omitting the fields that are only necessary for ClientLogin API.

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="https://adwords.google.com/api/adwords/mcm/v201008" xmlns:ns2="https://adwords.google.com/api/adwords/cm/v201008" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <SOAP-ENV:Header>
  <ns1:RequestHeader xsi:type="ns2:RequestHeader">
   <ns2:developerToken>Your developer token</ns2:developerToken>
   <ns2:userAgent>Your app name</ns2:userAgent>
  </ns1:RequestHeader>
 </SOAP-ENV:Header>

Body is per normal.

Then POST this using the appropriate method (oauth.sendSignedRequest in JS) that will add the required OAuth fields to the query string:

var request = {
 'method': 'POST',
 'body': soapenvelope
};   
oauth.sendSignedRequest(url, callback, request);

Done. If you need to do the query manually rather than use sometong like sendSignedRequest, it looks like:

servicename.google.com/where/your/service/lives?oauth_consumer_key=anonymous&oauth_nonce=something&oauth_signature=something&oauth_signature_method=HMAC-SHA1&oauth_timestamp=something&oauth_token=something

TLDR: OAuth in query string, omit all auth info from SOAP header.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文