首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OAuth签名生成

OAuth签名生成
EN

Stack Overflow用户
提问于 2016-11-04 09:23:53
回答 2查看 752关注 0票数 2

我有一个Magento 2与Wordpress的集成。我正在调用Wordpress中的REST API调用,它需要身份验证。我使用的是OAuth 1.0a。

看起来我在创建OAuth签名时遇到了麻烦。Wordpress总是返回错误:

string(106) "{"code":"json_oauth1_signature_mismatch","message":"OAuth signature does not match","data":{"status":401}}"

创建OAuth签名的代码如下所示(我基于Magento中找到的代码)

代码语言:javascript
复制
public function buildAuthorizationHeader(
        $params,
        $requestUrl,
        $signatureMethod = self::SIGNATURE_SHA1,
        $httpMethod = 'POST'
    ) {
        $headerParameters = [
            'oauth_nonce' => $this->_nonceGenerator->generateNonce(null),
            'oauth_timestamp' => $this->_nonceGenerator->generateTimestamp(),
            'oauth_version' => '1.0',
            'oauth_signature_method' => $signatureMethod
        ];
        $headerParameters = array_merge($headerParameters, $params);
        $headerParameters['oauth_signature'] = $this->_httpUtility->sign(
            $params,
            $signatureMethod,
            $headerParameters['oauth_consumer_secret'],
            $headerParameters['oauth_token_secret'],
            $httpMethod,
            $requestUrl
        );

        $authorizationHeader = $this->_httpUtility->toAuthorizationHeader($headerParameters);
        $authorizationHeader =  str_replace('realm="",', '', $authorizationHeader);
        return $authorizationHeader;
    }

任何关于我做错了什么的线索。

提前谢谢你,

EN

回答 2

Stack Overflow用户

发布于 2016-11-04 21:37:36

我没有签署完整的参数,只签署了一个子集。现在工作完美了。我正在张贴我的类,以防有人发现它有用:)

代码语言:javascript
复制
use Magento\Framework\App\Helper\AbstractHelper;

class OAuth extends AbstractHelper
{
    const SIGNATURE_SHA1 = 'HMAC-SHA1';

    /**
     * @var  \Zend_Oauth_Http_Utility
     */
    protected $_httpUtility;

    /**
     * @var \Magento\Framework\Oauth\NonceGeneratorInterface
     */
    protected $_nonceGenerator;

    public function __construct(
        \Magento\Framework\Oauth\NonceGeneratorInterface $nonceGenerator,
        \Zend_Oauth_Http_Utility $httpUtility = null
    ) {
        $this->_nonceGenerator = $nonceGenerator;
        // null default to prevent ObjectManagerFactory from injecting, see MAGETWO-30809
        $this->_httpUtility = $httpUtility ?: new \Zend_Oauth_Http_Utility();
    }

    public function buildAuthorizationHeader(
        $params,
        $requestUrl,
        $httpMethod = 'POST'
    ) {
        $headerParameters = [
            'oauth_nonce' => $this->_nonceGenerator->generateNonce(null),
            'oauth_timestamp' => $this->_nonceGenerator->generateTimestamp(),
            'oauth_version' => '1.0',
            'oauth_signature_method' => self::SIGNATURE_SHA1
        ];
        $headerParameters = array_merge($headerParameters, $params);
        $headerParameters['oauth_signature'] = $this->_httpUtility->sign(
            $headerParameters,
            self::SIGNATURE_SHA1,
            $headerParameters['oauth_consumer_secret'],
            $headerParameters['oauth_token_secret'],
            $httpMethod,
            $requestUrl
        );

        $authorizationHeader = $this->_httpUtility->toAuthorizationHeader($headerParameters);
        $authorizationHeader =  str_replace('realm="",', '', $authorizationHeader);
        return $authorizationHeader;
    }

}
票数 0
EN

Stack Overflow用户

发布于 2019-11-20 14:51:35

现在回答已经太晚了,但张贴这篇文章将用于其他人的参考。

使用OAuth生成Groovy1.0签名:

代码语言:javascript
复制
import javax.crypto.spec.SecretKeySpec;
import javax.crypto.Mac;
import java.net.URLEncoder; 
import com.eviware.soapui.support.types.StringToStringMap;
def method = "POST";
def protocal = "https";
def host = "testurl.com";
def port = "8888";
def baseURI = "https://testurl.com:8888";
def api = "/getAccess";
def encodedURL = URLEncoder.encode(baseURI + api,"UTF-8");
def baseString = method + "&" + encodedURL + "&clientID=1234567890" + "&clientPassword=testpassword";
 SecretKeySpec key = new SecretKeySpec(("1232131231232132131232321321").getBytes("UTF-8"),"HmacSHA1"); 
 //1232131231232132131232321321 - Secret key
    Mac mac = Mac.getInstance("HmacSHA1");
    mac.init(key); 
    byte[] bytes = mac.doFinal(baseString.getBytes("UTF-8")); 
    StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
    sb.append(String.format("%1\$02X", b));
}
log.info( sb.toString().toLowerCase());

在Javascript中:

代码语言:javascript
复制
var method = "POST";
var protocal = "https";
var host = "testUrl.com";
var port = "8888";
var baseURI = "https://testUrl.com:8888/";
var api = "/getAccess";
var encodedURL = encodeURIComponent(baseURI + api)
var baseString = method + "&" + encodedURL + "&clientID=" + "client-id" + "&clientPassword=" + "client-pass"
var signature = CryptoJS.HmacSHA1(baseString, "123123123123123123");
// 123123123123123123 - secret key
var hexSignature = signature.toString(CryptoJS.enc.Hex);
console.log(hexSignature);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40413909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档