web-dev-qa-db-ja.com

RestSharpでOAuth2を使用する方法

サーバーエンド(Spring Java)でOAuth2を整理する数日後、C#で記述されたクライアントで作業を開始しました。 RestSharpを使用してWeb APIを呼び出していますが、OAuth2で実際に問題を抱えています。ドキュメントはほとんどなく、オンラインで見つけたいくつかの例は機能しません。誰かが私に最新で使用可能なコードサンプルを提供できますか?

これまでのところ、私は以下を持っています:

var client = new RestClient("http://example.com/myapi/oauth/token");
RestRequest request = new RestRequest() { Method = Method.POST };

request.AddHeader("Content-Type", "application/json");
request.AddParameter("grant_type", "client_credentials");
request.AddParameter("client_id", "client-app");
request.AddParameter("client_secret", "secret");

var response = client.Execute(request);

私はこのコードをデバッグモードで実行しているだけで、応答を調べると不正になります。

同じパラメーターを使用してコンソールでcurlを実行すると正常に動作しますが、C#で動作させることはできません。 curlコマンドは次のとおりです。

curl -H "Accept: application/json" client-app:[email protected]/myapi/oauth/token -d grant_type=client_credentials

ところで、真のAPI URLやその他の情報をプレースホルダーに置き換えました。

27
Dimitris

RFC 6749-4.4.2を参照してください。クライアント資格情報-アクセストークンリクエスト

リクエストの基本フォーマットは次のとおりです

POST /token HTTP/1.1
Host: server.example.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded

grant_type=client_credentials

あなたのcURLリクエスト

curl -H "Accept: application/json" \
     -d grant_type=client_credentials \
     client-app:[email protected]/myapi/oauth/token 

CURLコマンドが機能する理由

  1. デフォルトのContent-Type(指定されていない場合)POST(-dスイッチを使用する場合のデフォルト))はapplication/x-www-form-urlencodedです
  2. 指定されていない場合、デフォルトの認証タイプは Basic です。ユーザー名とパスワードは、-uオプションまたはURLで渡されます

    -u username:password (client-app:secret)
    
    -- or put it in the url --
    
    client-app:[email protected]/myapi/oauth/token
    

    --basicまたは--digestで認証タイプを指定することもできます

CURLコマンドで-vスイッチを使用して、リクエストに含まれるすべてのヘッダーを表示できます。

RestSharp修正:

  1. Content-Typeapplication/x-www-form-urlencodedに設定します

  2. 基本認証を追加する

    client.Authenticator = new HttpBasicAuthenticator("client-app", "secret");
    
  3. 取り除く

    request.AddParameter("client_id", "client-app");
    request.AddParameter("client_secret", "secret");
    
  4. Acceptヘッダーをapplication/jsonに設定します

47
Paul Samsotha

次の両方の機能を動作させることができます。

 public RestClient getClient2(string user, string token)
    {
        RestClient client = new RestClient();
        client.BaseUrl = new Uri(baseUrl);
        client.Authenticator = new HttpBasicAuthenticator(user, token);                
        //client.Authenticator = new OAuth2UriQueryParameterAuthenticator(token); //works
        //client.Authenticator = new OAuth2AuthorizationRequestHeaderAuthenticator(token); // doesn't work

        return client;
    }

  public GitHubUser GetGitHubUser2()
    {
        RestRequest request = new RestRequest();        
        request.Resource = "/users/huj";
        request.RootElement = "GitHubUser";

        RestClient client = getClient2(myUser, myToken);

        return Execute<GitHubUser>(client, request);        
    }


    /// <summary>
    /// http://stackoverflow.com/questions/30133937/how-to-use-oauth2-in-restsharp
    /// </summary>
    /// <returns>GitHubUser</returns>
    public GitHubUser GetGitHubUser3()
    {
        //RestRequest request = new RestRequest(Method.POST);  //empty data
        RestRequest request = new RestRequest();
        request.AddHeader("Content-Type", "application/x-www-form-urlencoded");
        request.AddHeader("Accept", "application/json");
        request.AddParameter("grant_type", "client_credentials");

        request.Resource = "/users/huj";
        request.RootElement = "GitHubUser";

        RestClient client = getClient2(myUser, myToken);

        return Execute<GitHubUser>(client, request);
    }
4
Jirong Hu