Apigee Edge 政策中的 Base64 编码

问题描述 投票:0回答:6

在 Apigee 政策中进行 Base64 编码的最简单方法是什么?我需要对要以编程方式发送的短信文本进行编码。

我知道我可以显式包含代码,但我更喜欢使用内置的功能(如果可用)。

apigee
6个回答
3
投票

实现此目的最有效的方法是创建一个 python 脚本策略,然后使用 python 的内置 base64 模块构建一个对参数进行 Base64 编码或解码的简单函数。

如果您从此处获取示例代理:http://apigee.com/docs/api-services/content/api-proxy-samples,您将在

/simpleProxy/apiproxy/resources/py
中找到一个Python示例。

策略 XML 是这样的:

<Script name="Script-GenerateAuthHeader">
  <ResourceURL>py://Authheader.py</ResourceURL>
</Script>

Python 代码如下所示:

import base64

username = flow.getVariable("request.formparam.client_id")
password = flow.getVariable("request.formparam.client_secret")

base64string = base64.encodestring('%s:%s' % (username, password))[:-1]

flow.setVariable("my.base64.blob", base64string)

或者,如果 python 不是您的风格,您可以使用 js 资源在 javascript 中执行此操作,甚至直接在 Node.js 代理中执行此操作。


1
投票

目前尚未内置简单注入 HTTP Basic Auth 标头或生成字符串的 base64 编码的功能。

您可以使用 Javascript 标注来完成此操作,如下所示。

政策 XML:

<Javascript name='JavaScript-SetAuthz'>
  <ResourceURL>jsc://nameOfTheJavaScriptFileHere.js</ResourceURL>
</Javascript>

JavaScript


1
投票

我们还添加了一个示例,展示如何在 JavaScript 中执行此操作:

https://github.com/apigee/api-platform-samples/tree/master/sample-proxies/base64encoder


1
投票

Apigee 中现在内置了更新的功能 - 消息模板中内置了encodeBase64 和decodeBase64。欲了解更多详情,请参阅: https://docs.apigee.com/api-platform/reference/message-template-intro#base64-encoding-functions


0
投票

-- 缺乏发表评论的声誉(真丢人),所以添加答案 --

由于您具体询问了有关编码文本而不是二进制内容的问题,因此您可以使用 b64encode 而不是encodestring 对 Cheeso 的答案进行细微改进:

base64string = base64.b64encode('%s:%s' % (username, password))

在我的测试中这也快了一点。


0
投票

根据 Mike 的建议,apigee 支持将 base64 编码和解码的内置功能作为消息模板的一部分。 可以用常数值来使用

<AssignMessage name="AM-Set-Custom-Response">
  <AssignTo createNew="false" type="response"/>
  <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
  <Set>
   <Headers>
     <Header name="x-h1">Hello, {decodeBase64('d29ybGQK')}</Header>
   </Headers>
  </Set>
</AssignMessage>

或者使用流变量

<AssignMessage name="AM-Set-Custom-Response">
  <AssignTo createNew="false" type="response"/>
  <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
  <Set>
   <Headers>
     <Header name="x-h1">Hello, {encodeBase64(user.name)}</Header>
   </Headers>
  </Set>
</AssignMessage>
© www.soinside.com 2019 - 2024. All rights reserved.