如何在GAE / J上创建OAuth HMAC-SHA1签名?

时间:2010-08-14 13:50:06

标签: java google-app-engine oauth hmac

编辑:java equivalent to php's hmac-SHA1
(很有希望,尝试a.t.m。)

我的理解是,要创建签名,我需要一个'基本字符串'和一个'键'。我想我知道如何创建基本字符串,并且我认为我应该使用Google为我的应用分配的“OAuth Consumer Secret”作为密钥。

但是我应该用这两个来获取签名呢? GAE / Java上有没有HMAC课程?

如果我只是存储OAuth Playground为我生成的内容,它会播放吗?你是怎么做的?或者OAuth签名是否有一些到期日期?

(我之前尝试过AuthSub,但failed too,尽管它看起来很简单。而OAuth对我来说似乎更“标准”,所以我想坚持使用OAuth。)

2 个答案:

答案 0 :(得分:2)

public String computeHmac(String baseString, String key)
    throws NoSuchAlgorithmException, InvalidKeyException, IllegalStateException, UnsupportedEncodingException
{
    Mac mac = Mac.getInstance("HmacSHA1");
    SecretKeySpec secret = new SecretKeySpec(key.getBytes(), mac.getAlgorithm());
    mac.init(secret);
    byte[] digest = mac.doFinal(baseString.getBytes());
    return Base64.encode(digest);
}

答案 1 :(得分:0)

出于某种原因,Quercus和GAE上的hmac_init会出错。一种解决方案是使用上面提到的java方法和类,将其导入PHP实例并调用compute。

1)添加你还没有的scr / phpgae目录ID 2)将phpgae.HmacSHA256行添加到src / WEB-INF / services / com.caucho.QuercusModule 3)将scr / phpgae / HmacSHA256.java添加到GAE应用程序中:

package phpgae;

import java.security.InvalidKeyException;

import java.security.NoSuchAlgorithmException;

import javax.crypto.Mac;

import javax.crypto.spec.SecretKeySpec;

import com.caucho.util.Base64;

import com.caucho.quercus.module.AbstractQuercusModule;

public class HmacSHA256 extends AbstractQuercusModule {

    public String compute(String baseString, String key) throws InvalidKeyException, NoSuchAlgorithmException {
        Mac mac;
        mac = Mac.getInstance("HmacSHA256");
        SecretKeySpec secret = new SecretKeySpec(key.getBytes(), mac.getAlgorithm());
        mac.init(secret);
        byte[] digest = mac.doFinal(baseString.getBytes());
        return Base64.encode(digest);
    }
}

import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import com.caucho.util.Base64; import com.caucho.quercus.module.AbstractQuercusModule; public class HmacSHA256 extends AbstractQuercusModule { public String compute(String baseString, String key) throws InvalidKeyException, NoSuchAlgorithmException { Mac mac; mac = Mac.getInstance("HmacSHA256"); SecretKeySpec secret = new SecretKeySpec(key.getBytes(), mac.getAlgorithm()); mac.init(secret); byte[] digest = mac.doFinal(baseString.getBytes()); return Base64.encode(digest); } }

注意我在这里使用SHA256。 Eclipse会动态编译所有内容,否则您需要手动编译类。

4)在PHP上,你就是这样做的:

<?php

import phpgae.HmacSHA256;

$c = new HmacSHA256;

echo $c->compute( 'your base string' ,  'your key' );

?>

您可以从PHP on Google App Engine

中找到更实用的http://php-apps.appspot.com/示例