Пример аутентифицированного запроса OAuth с использованием. NET framework - PullRequest
0 голосов
/ 18 января 2020

Приведенный ниже код Node.JS отправляет API-запрос с аутентификацией OAuth на 0 ножек:

'use strict';
var OAuth = require('OAuth');
var express = require('express');
var app = express();

var oauth = new OAuth.OAuth(
  'http://example.com/oauth/request_token',
  'http://example.com/oauth/access_token',
  'mykey',
  'none',
  '1.0',
  null,
  'HMAC-SHA1'
);

app.get('/', function (req, res) {
  oauth.get(
    'http://example.com/api',
    'token123',
    'tokensecret123',
    function (error, data, response){
      data = JSON.parse(data);
      res.json(data);
    });
});

Мне нужно преобразовать этот код в C# или VB. NET. Любой образец запроса с проверкой подлинности OAuth в. Net тоже поможет.

Ответы [ 2 ]

1 голос
/ 18 января 2020

Я делаю это с библиотекой RestSharp , которая помогает работать с REST API.

Приведенный ниже код отправляет запрос на получение токена от OAuth:

var restClient = new RestClient();
restClient.BaseUrl = new Uri("theApiBaseUrl");

string encodedCredentials = Convert.ToBase64String(Encoding.Default.GetBytes($"yourAppId:yourSecret"));

// change the request below per the API requirement
RestRequest request = new RestRequest("theApiUrlForAuthentication", Method.POST);
request.AddHeader("Accept", "application/json");
request.AddHeader("Content-Type", "application/x-www-form-urlencoded");
request.AddHeader("Authorization", $"Basic {encodedCredentials}");
request.AddQueryParameter("grant_type", "client_credentials");
request.AddQueryParameter("scope", "api");

IRestResponse response = restClient.Execute(request);

// the token should be in the JSON string response.Content
// now you'll want to deserialize the JSON to get the token
var jsonWithToken = MyFunctionToGetToken(response.Content);

Теперь у вас есть токен для аутентифицированных вызовов к API:

var restClient = new RestClient();
restClient.BaseUrl = new Uri("theApiBaseUrl");

RestRequest request = new RestRequest("theApiEndpoint", Method.GET);
request.AddHeader("Accept", "application/hal+json");
request.AddHeader("profile", "https://api.slimpay.net/alps/v1");
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", $"Bearer {token}");

RestClient.Execute(request);

Каждый API отличается, поэтому вам непременно придется изменить мой код (добавить или удалите заголовки, кодируя учетные данные, ...), чтобы он работал для вас.

0 голосов
/ 19 января 2020

Спасибо @Guillaume Sasdy за то, что направил меня к RestSharp. Вот рабочее решение, которое работает так же, как код node.js в моем вопросе. Поскольку API, к которому я обращаюсь, использует OAuth с 0-ю ножками, токен доступа и секрет доступа известны заранее и значительно упрощают процесс.

const string consumerKey = "mykey";
const string consumerSecret = "none";
var baseUrl = "https://example.com";
var client = new RestClient(baseUrl);

var request = new RestRequest("/api");
client.Authenticator = OAuth1Authenticator.ForProtectedResource(
    consumerKey, consumerSecret, "token123", "tokensecret123"
);

var response = client.Execute(request);
...