ApiGee OAUTH 授权

Posted

技术标签:

【中文标题】ApiGee OAUTH 授权【英文标题】:ApiGee OAUTH Authorization 【发布时间】:2014-07-05 19:52:17 【问题描述】:

我是 apigee 的新手。我需要在我的代理中进行标注以从谷歌融合表中获取数据。 FT 服务需要使用 oath 2.0 进行安全呼叫。 我已经使用自定义代理制作了这个工作流程(没有任何 OAUTH 策略,并且在键值映射中存储令牌、刷新令牌和到期)

我还制作了 js 来计算过期时间和条件标注以刷新令牌。 我知道这不是正确的方法,但我仍然不知道如何使用构建 Oauth 策略进行此调用。 :( 谷歌方面的 oauth 流程对我来说很清楚,但无法理解我在哪里存储价值以及如何将 oauth 配置为本地方式......

我从 github 成功部署了 oauth-authcode 示例并使其正常工作,但是当我更改 https://accounts.google.com/o/oauth2/auth 上的默认目标端点 URL 并替换我的 client_id 时,我收到错误“无效的客户端 ID:XXXXX.apps.googleusercontent.com。ClientId 是无效”。

据我了解,第一个问题是获取授权码 我必须拨打 google oauth 之类的电话:

https://accounts.google.com/o/oauth2/auth
?response_type=code
&redirect_uri=URL that obtain access code
&client_id=XXXXX.apps.googleusercontent.com
&scope=https://www.googleapis.com/auth/fusiontables 
&access_type=offline
&approval_prompt=force
&login_hint=MYEMAIL@gmail.com
&state=ANYSTATE

然后google将授权码重定向到redirect_uri为

redirect_uri?code=ACCESSCODE&state=ANYSTATE 

我将代理 /oauth20 作为 bakckend 并将其指向 redirect_uri。

如何在此端配置 oauth 策略来存储此代码?

我创建产品 Fusion 并将 API 代理“/oauth20”添加为资源 我还创建了 Developer App Fusion。

我必须在开发者应用程序中填充哪些 URL 作为回调 URL?

我必须将哪个 url 用作 oauth 策略的重定向 url,如何存储我用于 google 的客户端 ID 和客户端密码和范围? 我无法在开发者应用中编辑消费者密钥和消费者秘密

那么我的api代理获取授权码。

如何更改此代码以访问令牌?

在我的应用程序中,我发布了 POST:

https://accounts.google.com/o/oauth2/token 
code=code 
client_id=ClientID 
client_secret=ClientSecret 
redirect_uri=https://vatsenko-test.apigee.net/v1/oauth20/oauth/authorize
grant_type=authorization_code 

然后提取令牌

$.access_token 
$.refresh_token 
$.expires_in

有什么方法可以手动配置 oauth 流程来获取令牌? (我的意思是硬编码 client_id、client_secret 和获取令牌并将其存储到 apigee 的代码,然后在 callout 中仅制定 verifyaccesstoken 策略)

【问题讨论】:

【参考方案1】:

您遇到的一些困惑是很自然的。尤其如此,因为您同时使用了 2 个 OAuth 系统(Google 和 Apigee 的),而不是单独使用 1 个。也就是说,您仍然可以解决这个问题 - 只需考虑一些设计因素。

我将采取的方法是在您编写问题时回答您的问题,但您可能还希望与 Apigee 合作进行进一步深入的设计讨论。

我从 github 成功部署了 oauth-authcode 示例并使其正常工作,但是当我更改 https://accounts.google.com/o/oauth2/auth 上的默认目标端点 URL 并替换我的 client_id 时,我收到错误“无效的客户端 ID:XXXXX.apps.googleusercontent.com。ClientId 是无效”。

您需要使用 Google OAuth 系统中的 client_id 才能利用 Google 的 OAuth 系统。

如何在这端配置oauth策略来存储这段代码?

通常您会使用网络服务器应用程序来处理此代码。如果您想使用 API 代理来做同样的事情,您可以将授权代码作为查询参数传递(例如,&code=XYZ)。您的 Apigee 代理会将代码称为 request.queryparameter.code

我必须在开发者应用程序中填充什么 url 作为回调 URL?

开发者应用中回调 URL 的 URL 应该是网络服务器应用回调 URL。在您的情况下,您声明要使用 Apigee API 代理,因此您应该使用它。当您在 Apigee 上生成授权代码时,此回调 URL 需要与作为 redirect_uri 查询参数一起传递的 URL 匹配。如果它们不匹配,您会从 Apigee 收到错误消息。正如您在最近的文章中所读到的那样,出于安全原因,我们已经进行了这项检查。

我必须将哪个 url 用作 oauth 策略的重定向 url,以及如何存储我用于 google 的客户端 ID 和客户端密码和范围?我无法在开发者应用中编辑 Consumer Key 和 Consumer Secret

如上所述,重定向 URI 需要与您为开发者应用设置的回调 URL 相同。我建议将 Google 的 client_id 和 client_secret 存储在 Key/Value Mapping 中。然后,当您调用 Google 检索他们的令牌时,您可以从键/值映射中提取这些值,并在标头中使用它们供 Google 使用。

如何更改此代码以访问令牌?

让我们退一步考虑一下 Apigee 的身份验证代码和访问令牌如何适合 Google 的身份验证代码和访问令牌。

为了让开发者应用与 Apigee 交互,您需要确保 Apigee 可以理解任何生成的身份验证代码和访问令牌。为了让 Apigee 进一步与 Google 的身份验证代码授权类型 OAuth 系统交互,您需要将 Google 的身份验证代码作为属性存储在 Apigee 的身份验证代码中。您可以在生成身份验证代码时通过<Attributes> 字段实现此目的。当您的 Developer 应用与 Apigee 交互时,Developer 应用将发送 Apigee 身份验证代码,该代码随后将包含一个带有 Google 身份验证代码的属性。您可以使用 getoauthv2info 从 Apigee 身份验证代码中提取属性。然后,您可以使用 Google 自己的 他们 识别的身份验证代码向 Google 调用。

当您提交 Google 的身份验证代码时,您将收到 Google 访问/刷新令牌作为回报。然后,您需要考虑是否要将 Apigee 的访问/刷新令牌替换为 Google 的...。这是一个设计的考虑。

如果您想替换 Apigee 的访问/刷新令牌,您可以利用 Apigee 的 <ExternalAccessToken><ExternalRefreshToken> 功能。在 Apigee 上使用这些字段生成访问令牌时,您可以确保 Apigee 识别 Google 生成的相同访问令牌。

或者,如果 Google 和 Apigee 令牌不需要匹配,那么您可以将 Google 的访问令牌和刷新令牌作为属性存储在 Apigee 的访问令牌中。这样,当 Developer 应用与 Apigee 交互时,必须使用 Apigee 的访问/刷新令牌(以及 client_id 和 secret)。然后,我们可以通过访问您存储的 Apigee 访问令牌属性来查找 Google 的访问令牌。在 VerifyAccessToken 之后,您可以通过 accesstoken.<custom attribute> 访问这些属性。

有什么方法可以手动配置 oauth 流程来获取令牌? (我的意思是硬编码 client_id、client_secret 和获取令牌并将其存储到 apigee 的代码,然后在 callout 中仅制定 verifyaccesstoken 策略)

如上所述,键/值映射将在这里为您提供帮助。在呼叫 Google 之前,您可以根据需要设置标头信息。并且如前所述,您可以将 Google 的身份验证代码作为属性存储在 Apigee 的身份验证代码中。

希望这会有所帮助。如果现场会议能更恰当地帮助您,请随时联系我们的支持人员或 Scrum Master。

【讨论】:

我理解您的回答,apigee 中没有特殊的地方可以存储外部访问代码和外部令牌/刷新令牌... 并且所有 Oauth 策略仅维护 apigee oauth 流。您建议将 google access token/refresh/expires 存储为用户令牌或开发人员令牌的属性。每次我需要从融合表中获取数据时,我都会简单地将消费者令牌中的自定义属性附加为 Bearer。但是刷新令牌呢?每次获取之前我都必须检查过期时间并刷新令牌。我不相信 apigee 没有支持此流程的政策... 你认为只在消费者令牌属性中存储谷歌刷新令牌,但访问缓存中的令牌存储,其生命周期等于到期时间,这有意义吗?以及在这种情况下如何配置缓存流? 授权码没有特殊的地方,但有外部访问/刷新令牌。请参阅我描述要使用的字段的部分。支持外部刷新令牌——没问题,属性与否。如果您使用外部字段来访问/刷新令牌而不是尝试缓存它们,那么设计将更简单、更容易遵循。缓存访问令牌的代码维护难度不值得。 嗨,伊戈尔,这个答案对你有帮助吗?

以上是关于ApiGee OAUTH 授权的主要内容,如果未能解决你的问题,请参考以下文章

新浪微博oauth2.0授权怎么弄的?

OAuth2.0授权

oauth 隐式授权与授权码授权?

OAuth1.0与OAuth2.0的区别与联系

OAuth2 授权类型 - 授权码 (python)

OAuth 2.0 授权标头