1

DotNetOpenAuthを使用して、ユーザーに代わってユーザーを検索する基本的なプログラムを作成しようとしています。OAuthについて学習するための単純なプログラム。現在、認証しようとして立ち往生していますが、認証しようとすると、linkedInからHTTP400ステータスコードを取得します。

DesktopConsumersとWebConsumersの両方を使用してみましたが、どちらも同じように失敗します。例外の原因となる特定の関数が34行目のRequestUserAuthorizationの呼び出しであることを知っており、空の辞書とnullの両方を入力として使用しようとしましたが、何も起こりませんでした。

プログラムには、メインを含むTestLinkedIn.csクラスと、IConsumerTokenManagerの非常に単純な実装であるLinkedInTokenManager.csクラスの2つのクラスを使用しています。

TestLinkedIn.csのコードは次のとおりです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DotNetOpenAuth.Messaging;
using DotNetOpenAuth.OAuth.Messages;
using DotNetOpenAuth.OAuth;
using DotNetOpenAuth.OAuth.ChannelElements;

namespace Project
{
    class TestLinkedIn
    {
        #region Variables
        private static string APIKey = "APIKey";
        private static string APISecret = "APISecret";
        private static string OAuthToken = "OAuthToken";
        private static string OAuthSecret = "OAuthSecret";
        #endregion

        static void Main(string[] args)
        {
            ServiceProviderDescription linkedIn = LinkedInDescription();
            LinkedInTokenManager tokenManager = new LinkedInTokenManager(OAuthToken, OAuthSecret);//APIKey,APISecret);//
            DesktopConsumer web = new DesktopConsumer(linkedIn,tokenManager); 
            string requestToken = "";
            Uri authUrl = new Uri("https://steve.com");// ("https://api.linkedin.com/uas/oauth/requestToken");//"http" + "://" + "api.linkedin.com" + "/Home/OAuthCallBack");
            Dictionary<string, string> empty = new Dictionary<string, string>();
            try{
                //UserAuthorizationRequest request = web.PrepareRequestUserAuthorization(null, null, null, out requestToken);//null, null, null);//authUrl, null, null);
                //UserAuthorizationRequest request =web.Channel.Request(new AccessProtectedResourceRequest());
                //web.Channel.Send(request);
                authUrl = web.RequestUserAuthorization(empty, empty, out requestToken);
                Console.WriteLine(requestToken);
                Console.ReadKey();
            }
            catch (ProtocolException e)
            {
                Console.Write(e.StackTrace);
                Console.WriteLine("Error detected");
                //Console.ReadKey();
            }
        }

        private static ServiceProviderDescription LinkedInDescription(){
            ServiceProviderDescription linkedIn = new ServiceProviderDescription();
            linkedIn.AccessTokenEndpoint = new DotNetOpenAuth.Messaging.MessageReceivingEndpoint
                ("https://api.linkedin.com/uas/oauth/accessToken", DotNetOpenAuth.Messaging.HttpDeliveryMethods.PostRequest);
            linkedIn.RequestTokenEndpoint = new DotNetOpenAuth.Messaging.MessageReceivingEndpoint
                ("https://api.linkedin.com/uas/oauth/requestToken",DotNetOpenAuth.Messaging.HttpDeliveryMethods.PostRequest);
            linkedIn.UserAuthorizationEndpoint = new MessageReceivingEndpoint("https://www.linkedin.com/uas/oauth/authorize",
                HttpDeliveryMethods.PostRequest);
            linkedIn.TamperProtectionElements =new ITamperProtectionChannelBindingElement[]
                {new HmacSha1SigningBindingElement()};
            linkedIn.ProtocolVersion=ProtocolVersion.V10a;
            return linkedIn;
        }
    }
}

これがのコードですLinkedInTokenManager

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DotNetOpenAuth.OAuth.ChannelElements;
using DotNetOpenAuth.OAuth.Messages;

namespace Project
{
    class LinkedInTokenManager : IConsumerTokenManager
    {
        private Dictionary<string, string> tokens = new Dictionary<string, string>();
        private string consumerKey;
        private string consumerSecret;

    public LinkedInTokenManager(string Key, string Secret)
    {
        consumerKey = Key;
        consumerSecret = Secret;
    }
    public string ConsumerKey
    {
        get { return consumerKey; }
    }

    public string ConsumerSecret
    {
        get { return consumerSecret; }
    }

    public void ExpireRequestTokenAndStoreNewAccessToken(string consumerKey, string requestToken, string accessToken, string accessTokenSecret)
    {
        tokens.Remove(requestToken);
        tokens[accessToken] = accessTokenSecret;
    }

    public string GetTokenSecret(string token)
    {
        try
        {
            return tokens[token];
        }
        catch (KeyNotFoundException k)
        {
            return null;
        }
    }

    public TokenType GetTokenType(string token)
    {
        throw new NotImplementedException();
    }

    public void StoreNewRequestToken(UnauthorizedTokenRequest request, ITokenSecretContainingMessage response)
    {
        tokens[response.Token] = response.TokenSecret;
    }
  }
}

これは私がサーバーに投稿しているものです。

oauth_callback=oob&oauth_consumer_key=6415f7ed-d618-422a-b090-73f3056653d7&oauth_nonce=nGQjFcC1&oauth_signature_method=HMAC-SHA1&oauth_signature=XmUBfGVGDoBZDOC%2Bjp4Fj68MPGI%3D&oauth_version=1.0&oauth_timestamp=1357136418

これがエラーメッセージからのスタックトレースです。

at DotNetOpenAuth.Messaging.StandardWebRequestHandler.GetResponse(HttpWebRequest request, DirectWebRequestOptions options)
   at DotNetOpenAuth.Messaging.StandardWebRequestHandler.GetResponse(HttpWebRequest request)
       at DotNetOpenAuth.Messaging.Channel.GetDirectResponse(HttpWebRequest webRequest)
       at DotNetOpenAuth.Messaging.Channel.RequestCore(IDirectedProtocolMessage request)
       at DotNetOpenAuth.Messaging.Channel.Request(IDirectedProtocolMessage requestMessage)
       at DotNetOpenAuth.Messaging.Channel.Request[TResponse](IDirectedProtocolMessage requestMessage)
       at DotNetOpenAuth.OAuth.ConsumerBase.PrepareRequestUserAuthorization(Uri callback, IDictionary`2 requestParameters, IDictionary`2 redirectParameters, String& requestToken)
       at DotNetOpenAuth.OAuth.DesktopConsumer.RequestUserAuthorization(IDictionary`2 requestParameters, IDictionary`2 redirectParameters, String& requestToken)
       at APIphanySalesProject.TestLinkedIn.Main(String[] args) in c:\Users\Admin\Documents\Visual Studio 2012\Projects\Project\Project\TestLinkedIn.cs:line 34

何かご意見は?

4

2 に答える 2

0

私と同じ問題が発生している場合は、コンピューターの時刻設定を確認してください。正しいタイムスタンプを生成するには、時間とタイムゾーンの両方が正しい必要があります。これが私のプログラムの問題でした。

于 2013-01-09T19:42:47.067 に答える
0

https://www.linkedin.com/secure/developerでアプリケーションを登録するときに、Linkedin API の作業中に同じエラーが発生しました。OAuth キーが生成されたら、[取り消し] をクリックして、OAuth ユーザー トークンとユーザー シークレットが削除されることを確認してください。アプリケーションを介して呼び出しが行われると、新しい OAuth トークンが動的に作成されます。詳細については、次のドキュメントをお読み ください https://developer.linkedin.com/documents/authentication 詳細な手順については、 http://infinityexist.wordpress.com/2014/08/25/solution-for-400-bad-request-に従ってください。 of-access-token-in-linkedin-api/

于 2014-08-27T11:09:47.940 に答える