一步一步 oAuth Rest C# winform 示例 [关闭]

2023-12-30

我已经尝试了一段时间了,需要从头开始一步一步地为 magento 创建消费者应用程序。

我查看了以下内容:

  • Twitter 的 Spring.NET 社交扩展 http://springframework.net/social-twitter/

  • 开发定义的 OAuth http://code.google.com/p/devdefined-tools/wiki/OAuth

  • 使用 .NET 的 Twitter OAuth 身份验证 http://www.codeproject.com/Articles/247336/Twitter-OAuth-authentication-using-Net

还有很多其他的,但尚不清楚真正该做什么。我需要做的是用 C# 制作一个 winform,需要使用带有 oAuth 的 magento 的其余 api。真的在这里我有点失落。

事实上,我作为消费者获得的信息是

String callbackUrl = "liconnect://success";
String temporaryCredentialsRequestUrl = "http://domain.xxx/oauth/initiate?oauth_callback=" + HttpUtility.UrlEncode(callbackUrl);
String adminAuthorizationUrl = "http://domain.xxx/admin/oauth_authorize";
String accessTokenRequestUrl = "http://domain.xxx/oauth/token";
String apiUrl = "http://domain.xxx/api/rest";
String consumerKey = "KKKKKKKKKKKKKKK";
String consumerSecret = "SSSSSSSSSSSSSSSSSSS";

“liconnect://成功”;是要到达某个地方,但我还没有走那么远,哈哈......

oauth_token 和 oauth_token_secret 需要保存,所以我不知道是否可以从 with 中存储?但问题是,如果你不知道magento路径,你也必须登录..我尝试用HtmlAgilityPack构建一个scraper并一直到达登录表单,但即使你我通过了表单上的所有内容magento 页面认为存在问题。我猜想对标头做的事情..所以走这条路并没有奏效。

我也尝试过只发表一篇文章并使用 System.Security.Cryptography,但这也没有成功。

问题: 任何疯狂的程序员都会有一个可靠的“如何做”的路线,或者想要接受挑战,为人们提供一个路线吗?有很多人在这里问同样的问题。


UPDATE

好吧,对于那些似乎无法弄清楚这一点的人来说,有一种解决方法。所以我编写了一个 php 脚本来进行身份验证并将其存储在隐藏的文件中。然后我创建了一个登录名,这就是您使用 C# winform 所获得的登录名。所以..一个简单的例子,但请注意,这只是一个例子,因为您应该检查代理并对发布数据加盐以增加此处的安全性。第一次,您需要直接转到 php 文件,以便获得保留会话的文件。

这个例子:

<?php
/**
 * Example of retrieving the products list using Admin account 
 * via Magento REST API. OAuth authorization is used
 * Preconditions:
 * 1. Install php oauth extension
 * 2. If you were authorized as a Customer before this step, clear browser cookies for 'yourhost'
 * 3. Create at least one product in Magento
 * 4. Configure resource permissions for Admin REST user for retrieving all product data for Admin
 * 5. Create a Consumer
 **/
// $callbackUrl is a path to your file with OAuth authentication example for the Admin user
session_start();    

//The user name and pass are md5 on the C# side of things and send over like this so it's more then just pass your username and pass
$u="461d544a174bcb5asf2a9fd14576251e169";
$p="c3762e47e025a2e0b6f77afca8da626a81";
if(isset($_POST['username']) && $p == $_POST['pass'] && $u == $_POST['username']){
    $callbackUrl = "http://domain.xxx/quick_look.php";
    $temporaryCredentialsRequestUrl = "http://domain.xxx/oauth/initiate?oauth_callback=" . urlencode($callbackUrl);
    $adminAuthorizationUrl = 'http://domain.xxx/admin/oauth_authorize';
    $accessTokenRequestUrl = 'http://domain.xxx/oauth/token';
    $apiUrl = 'http://domain.xxx/api/rest';
    $consumerKey = 'nar78rw5nlkssddksdflklvkezgdria';
    $consumerSecret = 'mo0lnht5;sdf;lsdgjcfdpgad5';
    //sodoSess is a folder that is hidden and protected via .htaccess
    // note.. secure it or else!!
    function write_session($name,$value){
        $myFile = "sodoSess/".$name.".txt";
        $fh = fopen($myFile, 'w') or die("can't open file sodoSess/".$name.".txt");
        fwrite($fh, $value);
        fclose($fh);
    }
    
    function read_session($name){
        $myFile = "sodoSess/".$name.".txt";
        $fh = fopen($myFile, 'r') or die("can't open file sodoSess/".$name.".txt");
        $data = fgets($fh);
        fclose($fh);
        return $data;
    }
    
    
    if (!isset($_GET['oauth_token']) && read_session('state') == 1) {
        write_session('state',0);
    }
    try {
        $authType = (read_session('state') == 2) ? OAUTH_AUTH_TYPE_AUTHORIZATION : OAUTH_AUTH_TYPE_URI;
        $oauthClient = new OAuth($consumerKey, $consumerSecret, OAUTH_SIG_METHOD_HMACSHA1, $authType);
        $oauthClient->enableDebug();
    
        if (!isset($_GET['oauth_token']) && read_session('state')=="") {
            $requestToken = $oauthClient->getRequestToken($temporaryCredentialsRequestUrl);
            write_session('secret',$requestToken['oauth_token_secret']);
            write_session('state',1);
            header('Location: ' . $adminAuthorizationUrl . '?oauth_token=' . $requestToken['oauth_token']);
            exit;
        } else if (read_session('state') == 1) {
            $oauthClient->setToken($_GET['oauth_token'], read_session('secret'));
            $accessToken = $oauthClient->getAccessToken($accessTokenRequestUrl);
            write_session('state',2);
            write_session('token',$accessToken['oauth_token']);
            write_session('secret',$accessToken['oauth_token_secret']);
            header('Location: ' . $callbackUrl);
            exit;
        } else {
            $oauthClient->setToken(read_session('token'), read_session('secret'));
            //print_r($_POST);
            if(isset($_POST["addCustomer"])){

                require_once ( "/var/www/html/app/Mage.php" );
                umask(0);
                Mage::app('default');
                $customer = Mage::getModel('customer/customer');
                //$customer  = new Mage_Customer_Model_Customer();
                $password = "321456321456";
                $email = $_POST["email"];
                $firstname = $_POST["firstname"];
                $lastname = $_POST["lastname"];
                $street1 = $_POST["street1"];
                $street2 = $_POST["street2"];
                $city = $_POST["city"];
                $postcode = $_POST["postcode"];
                $telephone = $_POST["telephone"];
                
                
                $customer->setWebsiteId(Mage::app()->getWebsite()->getId());
                $customer->loadByEmail($email);
                //Zend_Debug::dump($customer->debug()); exit;
                if(!$customer->getId()) {
                    $customer->setEmail($email);
                    $customer->setFirstname($firstname);
                    $customer->setLastname($lastname);
                    $customer->setPassword($password);
                }
                try {
                    $customer->save();
                    $customer->setConfirmation(null);
                    $customer->save();
                    //Make a "login" of new customer
                    //Mage::getSingleton('customer/session')->loginById($customer->getId());
                    echo "added user";
                }
                catch (Exception $ex) {
                    //Zend_Debug::dump($ex->getMessage());
                }


                //Build billing and shipping address for customer, for checkout
                $_custom_address = array (
                    'firstname' => $firstname,
                    'lastname' => $lastname,
                    'street' => array (
                        '0' => $street1,
                        '1' => $street2,
                    ),
                    'city' => $city,
                    'region_id' => '',
                    'region' => '',
                    'postcode' => $postcode,
                    'country_id' => 'US',
                    'telephone' => $telephone,
                );
                $customAddress = Mage::getModel('customer/address');
                //$customAddress = new Mage_Customer_Model_Address();
                $customAddress->setData($_custom_address)
                            ->setCustomerId($customer->getId())
                            ->setIsDefaultBilling('1')
                            ->setIsDefaultShipping('1')
                            ->setSaveInAddressBook('1');
                try {
                    $customAddress->save();
                }
                catch (Exception $ex) {
                    //Zend_Debug::dump($ex->getMessage());
                }
                Mage::getSingleton('checkout/session')
                    ->getQuote()
                    ->setBillingAddress(Mage::getSingleton('sales/quote_address')->importCustomerAddress($customAddress));


                //echo $_POST["firstname"]." ".$_POST["lastname"]." <br/>-- ".$_POST["email"]." <br/>MADE IT!";
                
            }else{
                /* call class to handle everything */
                //for now what is the stock level here?
                $resourceUrl = "$apiUrl/products?filter[1][attribute]=sku&filter[1][in]=".$_POST['sku'];
                if(isset($_GET['p_id']))$resourceUrl .="/".$_GET['p_id'];
                $oauthClient->fetch($resourceUrl, array(), 'GET', array('Content-Type' => 'application/json'));
    
                $productsList = json_decode($oauthClient->getLastResponse());
                //print_r($productsList);
                foreach($productsList as $item){
                    $resourceUrl = "$apiUrl/stockitems/".$item->entity_id;
                    $oauthClient->fetch($resourceUrl, array(), 'GET', array('Content-Type' => 'application/json'));
                }
    
                $item = json_decode($oauthClient->getLastResponse());
                echo "<h1>currently there is</h1>".round($item->qty);
            }   
        }
    } catch (OAuthException $e) {
        print_r($e->getMessage());
        echo "<br/>";
        print_r($e->lastResponse);
    }
}else{
    echo "fail";
}
?>

现在在另一边.. Form1.cs 中的 C#(你的事件方法在哪里)

    private void button5_Click(object sender, EventArgs e)
    {
            var myValue = Microsoft.VisualBasic.Interaction.InputBox("What is the sku of the itme you wish to find", "Look product", "");
            if (myValue != "") {
                sendPost("&sku=" + myValue);
            }
    }
  public void sendPost(String postData) {
        //step 1 talk with site
        WebRequest req = WebRequest.Create("http://domain.xxx/quick_look.php");
        string MainPostData = "username=YOURUSERNAME_MD5&pass=YOURPASSWORD_MD5";

        byte[] send = Encoding.Default.GetBytes(MainPostData + (!String.IsNullOrWhiteSpace(postData) ? "&" + postData.TrimStart('&') : ""));
        req.Method = "POST";
        req.ContentType = "application/x-www-form-urlencoded";
        req.ContentLength = send.Length;
        //this is where you salt the data by adjusting the header 
        //then testing for that adjustment


        Stream sout = req.GetRequestStream();
        sout.Write(send, 0, send.Length);
        sout.Flush();
        sout.Close();

        WebResponse res = req.GetResponse();
        StreamReader sr = new StreamReader(res.GetResponseStream());
        string returnvalue = sr.ReadToEnd();
        HtmlAgilityPack.HtmlDocument hDoc = new HtmlAgilityPack.HtmlDocument();

        webBrowser1.Navigate("about:blank");
        webBrowser1.Document.OpenNew(true);
        webBrowser1.Document.Write("<html><body>" + returnvalue + "</body></html>");
        webBrowser1.Stop();
    }

就这样吧。您现在可以以安全的方式从 C# WinForms 连接到 magento api,这将需要永远(如果您添加盐和代理调整)来破解。我仍然想要一种方法来正确地做到这一点,但是......这有效。


您可以选择混合这两种资源来获得解决方案。

This example http://blog.markarteaga.com/OAuthWithSilverlightForWindowsPhone7.aspx适用于Windows Phone 7,只需稍加改动就可以在win窗体应用程序中使用(尽管我不敢尝试)并且Megneto API http://www.magentocommerce.com/wiki/doc/webservices-api/introduction_to_rest_api你必须意识到这一点。

Windows Phone 7 示例是 Twitter,应该能够通过更改 Magneto 的 oauth 流 url 进行自定义

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一步一步 oAuth Rest C# winform 示例 [关闭] 的相关文章

  • 当我使用“control-c”关闭发送对等方的套接字时,为什么接收对等方的套接字不断接收“”

    我是套接字编程的新手 我知道使用 control c 关闭套接字是一个坏习惯 但是为什么在我使用 control c 关闭发送进程后 接收方上的套接字不断接收 在 control c 退出进程后 发送方的套接字不应该关闭吗 谢谢 我知道使用
  • 获取按下的按钮的返回值

    我有一个在特定事件中弹出的表单 它从数组中提取按钮并将标签值设置为特定值 因此 如果您要按下或单击此按钮 该函数应返回标签值 我怎样才能做到这一点 我如何知道点击了哪个按钮 此时代码返回 DialogResult 但我想从函数返回 Tag
  • UML类图:抽象方法和属性是这样写的吗?

    当我第一次为一个小型 C 项目创建 uml 类图时 我在属性方面遇到了一些麻烦 最后我只是将属性添加为变量 lt
  • 未解决的包含:“cocos2d.h” - Cocos2dx

    当我在 Eclipse 中导入 cocos2dx android 项目时 我的头文件上收到此警告 Unresolved inclusion cocos2d h 为什么是这样 它实际上困扰着我 该项目可以正确编译并运行 但我希望这种情况消失
  • Newtonsoft JSON PreserveReferences处理自定义等于用法

    我目前在使用 Newtonsoft Json 时遇到一些问题 我想要的很简单 将要序列化的对象与所有属性和子属性进行比较以确保相等 我现在尝试创建自己的 EqualityComparer 但它仅与父对象的属性进行比较 另外 我尝试编写自己的
  • WPF 中的调度程序和异步等待

    我正在尝试学习 WPF C 中的异步编程 但我陷入了异步编程和使用调度程序的困境 它们是不同的还是在相同的场景中使用 我愿意简短地回答这个问题 以免含糊不清 因为我知道我混淆了 WPF 中的概念和函数 但还不足以在功能上正确使用它 我在这里
  • 指针问题(仅在发布版本中)

    不确定如何描述这一点 但我在这里 由于某种原因 当尝试创建我的游戏的发布版本进行测试时 它的敌人创建方面不起作用 Enemies e level1 3 e level1 0 Enemies sdlLib 500 2 3 128 250 32
  • C 预处理器库

    我的任务是开发源分析工具C程序 并且我需要在分析本身之前预处理代码 我想知道什么是最好的图书馆 我需要一些重量轻 便于携带的东西 与其推出自己的 为什么不使用cpp这是的一部分gcc suite http gcc gnu org onlin
  • Json.NET - 反序列化接口属性引发错误“类型是接口或抽象类,无法实例化”

    我有一个类 其属性是接口 public class Foo public int Number get set public ISomething Thing get set 尝试反序列化Foo使用 Json NET 的类给我一条错误消息
  • 指针减法混乱

    当我们从另一个指针中减去一个指针时 差值不等于它们相距多少字节 而是等于它们相距多少个整数 如果指向整数 为什么这样 这个想法是你指向内存块 06 07 08 09 10 11 mem 18 24 17 53 7 14 data 如果你有i
  • 如何将图像路径保存到Live Tile的WP8本地文件夹

    我正在更新我的 Windows Phone 应用程序以使用新的 WP8 文件存储 API 本地文件夹 而不是 WP7 API 隔离存储文件 旧的工作方法 这是我如何成功地将图像保存到 共享 ShellContent文件夹使用隔离存储文件方法
  • C# 中的递归自定义配置

    我正在尝试创建一个遵循以下递归结构的自定义配置部分
  • 将自定义元数据添加到 jpeg 文件

    我正在开发一个图像处理项目 C 我需要在处理完成后将自定义元数据写入 jpeg 文件 我怎样才能做到这一点 有没有可用的图书馆可以做到这一点 如果您正在谈论 EXIF 元数据 您可能需要查看exiv2 http www exiv2 org
  • for循环中计数器变量的范围是多少?

    我在 Visual Studio 2008 中收到以下错误 Error 1 A local variable named i cannot be declared in this scope because it would give a
  • 将 unsigned char * (uint8_t *) 转换为 const char *

    我有一个带有 uint8 t 参数的函数 uint8 t ihex decode uint8 t in size t len uint8 t out uint8 t i hn ln for i 0 i lt len i 2 hn in i
  • 实体框架 4 DB 优先依赖注入?

    我更喜欢创建自己的数据库 设置索引 唯一约束等 使用 edmx 实体框架设计器 从数据库生成域模型是轻而易举的事 现在我有兴趣使用依赖注入来设置一些存储库 我查看了 StackOverflow 上的一些文章和帖子 似乎重点关注代码优先方法
  • 需要哪个版本的 Visual C++ 运行时库?

    microsoft 的最新 vcredist 2010 版 是否包含以前的版本 2008 SP1 和 2005 SP1 还是我需要安装全部 3 个版本 谢谢 你需要所有这些
  • 控制到达非 void 函数末尾 -wreturn-type

    这是查找四个数字中的最大值的代码 include
  • 32 位到 64 位内联汇编移植

    我有一段 C 代码 在 GNU Linux 环境下用 g 编译 它加载一个函数指针 它如何执行并不重要 使用一些内联汇编将一些参数推送到堆栈上 然后调用该函数 代码如下 unsigned long stack 1 23 33 43 save
  • 恢复上传文件控制

    我确实阅读了以下帖子 C 暂停 恢复上传 https stackoverflow com questions 1048330 pause resume upload in c 使用 HTTP 恢复上传 https stackoverflow

随机推荐

  • 使用 SVM 进行实时面部表情分类

    我目前正在开发一个项目 我必须提取用户的面部表情 一次只能从网络摄像头提取一个用户 例如悲伤或快乐 我对面部表情进行分类的方法是 使用opencv检测图像中的人脸 使用ASM和stasm获取面部特征点 现在我正在尝试进行面部表情分类 SVM
  • LNK2019 错误 C++ 无法解析的外部符号

    我收到这些错误消息 错误1错误LNK2019 未解决 外部符号 public void thiscall ArrayIntStorage sortOwn void sortOwn ArrayIntStorage QAEXXZ 函数中引用 m
  • 莱斯的教学目的?

    目的是什么les汇编指令 为什么我们需要加载es部分and寄存器 书中给出了以下例子 les bx p Load p into ES BX mov es bx al Store away AL 为什么我们需要加载es and bx在这种情况
  • node.js 检查远程 URL 是否存在

    如何在不下拉的情况下检查 URL 是否存在 我使用以下代码 但它会下载整个文件 我只需要检查它是否存在 app get api v1 urlCheck function req res var url req query url var r
  • 如何在具有隔离范围的指令中侦听站点范围的事件

    我正在使用具有隔离范围的指令在 angularjs 中创建自定义图表小部件 这个想法是 每个小部件在收到有关如何创建自身的基本配置信息后应该能够独立存在 该小部件将通过侦听 update data 事件与应用程序的其他部分进行通信 当事件被
  • 如何在 SQLite 中插入具有唯一 ID 的重复行?

    这看起来很简单 我想在 SQLite 表中复制一行 INSERT INTO table SELECT FROM table WHERE rowId 5 如果没有显式的唯一列声明 则该语句将起作用 但声明了表的第一列rowID INTEGER
  • 使用ActionCable,多种识别方式

    我使用 ActionCable 开发 Ruby on Rails 5 1 应用程序 通过 Devise 进行用户身份验证 https rubytutorial io actioncable devise authentication 适用于
  • Intellij 调试 Docker 容器不断给我 IO 异常握手失败

    我正在尝试在 Intellij v2020 1 中设置远程调试器 但不断收到以下错误 无法打开调试器端口 localhost 5005 java io IOException 握手失败 连接过早关闭 在我的 docker compose 文
  • 是否可以在cmake中不生成ALL_BUILD项目?

    我不需要 ALL BUILD 子项目 我可以避免生成它吗 谢谢 CMake 问题 16979 正在生成 ALL BUILD 目标 https gitlab kitware com cmake cmake issues 16979 The A
  • Facebook Graph API gem

    我想在我的 Rails 应用程序中使用 Facebook 图形 API 与 FB 图形 API 一起使用的推荐 gem 是什么 Thanks 这是一个写得很好的 FB 图形支持 Ruby https github com nov fb gr
  • 在 SSRS 中复制并粘贴表 (tablix)

    我有一个包含一天数据的 tablix 我需要在底部有相同的数据 但在 3 个不同的行中 我想在底部复制主要日期表 3 次 然后为每个表使用不同的数据集 我尝试复制 tablix 并将其粘贴到Body在 tablix 下方 但出现以下错误 报
  • C#:将数组分配给另一个数组:复制还是指针交换?

    抱歉问这个问题 我一直在谷歌上搜索了一下 但似乎出现的是对克隆或复制方法的引用 而不是我的问题的实际答案C 我有两个字节数组 它们正在被两个线程访问 private byte buffer1 new byte size private by
  • 如何使用 python 读取 CSV 文件时跳过空白行

    这是我的代码 我可以打印每一行 但是当出现空白行时 它会打印 由于CSV文件格式 所以我想在出现空行时跳过 import csv import time ifile open C Users BKA4ABT Desktop Test Spe
  • 如何将输出的 Fortran 二进制 NxNxN 矩阵读入 Python

    我用 Fortran 写出了一个矩阵 如下所示 real kind kind 0 0d0 dimension 256 256 256 dense CALCULATION inquire iolength reclen dense open
  • 如何在不不断扫描的情况下检测目录或文件何时发生更改

    除了读取所有文件并将它们与以前的快照进行比较之外 有没有办法在 Windows 中的 C 中检测目录何时发生更改 如果需要的话 我不介意 PInvoke EDITFileSystemWatcher 类很棒 但有一个问题是您必须启动后台任务
  • 一对一字段 Django 管理员

    编辑为使用一对一字段 我想将建筑物的面积添加到 django modeladmin 中 表结构是 class Area models Model id models IntegerField Buildings db column id a
  • Kubernetes Nginx Ingress 删除部分 URL

    我正在 Kubernetes 在 AKS 上 部署一个简单的应用程序 该应用程序位于使用 Nginx 的 Ingress 后面 并使用 Nginx helm 图表进行部署 我遇到一个问题 由于某种原因 Nginx 似乎没有将完整的 URL
  • AWS lambda读取zip文件执行验证并解压到s3存储桶(如果验证通过)

    我有一个 zip 文件到达 s3 存储桶的要求 我需要使用 python 编写一个 lambda 来读取 zip 文件 执行一些验证并在另一个 S3 存储桶上解压缩 Zip 文件包含以下内容 a csv b csv c csv trigge
  • 读取 HttpPost 响应

    我使用此代码向 http 服务器发送请求 HttpClient client new DefaultHttpClient HttpPost post new HttpPost http 192 168 0 1 test php HttpRe
  • 一步一步 oAuth Rest C# winform 示例 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我已经尝试了一段时间了 需要从头开始