将字符串转换为Web安全的Base64格式

时间:2014-03-02 14:23:27

标签: google-apps-script google-admin-sdk

我正在测试如何使用带有Google Apps脚本的Admin SDK目录服务更新用户图片,其功能如下:

function updatePhoto(){
  var fileId = 'XXXXXXXXXXXXXXXXXXX';
  var b = DocsList.getFileById(fileId).getBlob();
  var encoded = Utilities.base64Encode(b.getBytes());

  encoded = encoded.replace(/\//g,'_').replace(/\+/g,'-').replace(/\=/g,'*');
  AdminDirectory.Users.Photos.update({
    "photoData": encoded },'harry.potter@abc.edu.hk');
}

然而,它并不总是有效。只要base64编码的字符串中有填充,它就会失败。参考Google的文档(https://developers.google.com/admin-sdk/directory/v1/reference/users/photos/update),我对这些描述感到有些困惑。它说:

  1. 等号(=)字符替换为星号(*)。
  2. 对于填充,使用句点(。)字符代替 RFC-4648 baseURL定义,使用等号(=)表示 填充。这样做是为了简化URL解析。
  3. 实际应该做什么? (=)用于Base64中的填充。那么,我应该使用(*)还是(。)?我确实尝试用(。)替换(=)但没有运气。

    有人可以帮忙吗?


    太奇怪了。它适用于我不替换(=)。

    function updatePhoto(){
      var fileId = 'XXXXXXXXXXXXXXXXXXX';
      var b = DocsList.getFileById(fileId).getBlob();
      var encoded = Utilities.base64Encode(b.getBytes());
    
      encoded = encoded.replace(/\//g,'_').replace(/\+/g,'-');
      AdminDirectory.Users.Photos.update({
        "photoData": encoded },'harry.potter@abc.edu.hk');
    

    }

4 个答案:

答案 0 :(得分:5)

API要求您使用URL安全的base64编码。执行base64编码后,尝试将/替换为_,将+替换为-。详细信息:

https://developers.google.com/admin-sdk/directory/v1/reference/users/photos/update

答案 1 :(得分:3)

我知道这已经很老了,但我正在做类似的工作,我想分享我的解决方案。您可以使用此函数将字符串转换为base64safeurl字符串:

protected static string Base64ForUrlEncode(string str)
        {

            StringBuilder result = new StringBuilder(Convert.ToBase64String(Encoding.ASCII.GetBytes(str)).TrimEnd('='));
            result.Replace('+', '-');
            result.Replace('/', '_');
            return result.ToString();
        }

此处有更多信息:http://www.codeproject.com/Tips/76650/Base-base-url-base-url-and-z-base-encoding

注意:这是C#代码,因此该解决方案适用于.NET开发。

答案 2 :(得分:0)

添加到@Jay lee&@Daniel Marin的答案:

如果您使用Python进行编码,则可以使用:

base64.urlsafe

功能,在Java中,您可以使用:

Base64.encodeBase64URLSafeString(byte[] binaryData)

答案 3 :(得分:0)

RFC 4648 指定“网络安全”base64 并将其称为“base64url”:https://datatracker.ietf.org/doc/html/rfc4648#section-5