Utworzono serwer autoryzacji OAuth2 przy użyciu DotNetOpenAuth, który działa poprawnie - używam przepływu hasła właściciela zasobów i pomyślnie wymieniam dane logowania użytkownika na token dostępu.Jak mogę autoryzować dostęp do zasobów usługi ServiceStack przy użyciu tokenów dostępu OAuth2 za pośrednictwem DotNetOpenAuth?
Chcę teraz użyć tego tokena dostępu do pobierania danych z bezpiecznych punktów końcowych w interfejsie API usługi ServiceStack i nie mogę się dowiedzieć, jak to zrobić. Zbadałem dostawców Facebooka, Google itp. Dołączonych do ServiceStack, ale nie jest jasne, czy powinienem stosować ten sam schemat, czy nie.
Co staram się osiągnąć (myślę!) Jest
- OAuth klient (mój app) prosi właściciel zasobu ('Katarzyna Smith') o poświadczenia
- Client przesyła żądanie do serwera autoryzacji , otrzymuje token dostępu , który otrzymuje
- Klient żąda bezpiecznego zasób z serwera zasobów (
GET /users/csmith/photos
)- token dostępu jest zawarty w nagłówku HTTP, na przykład
Authorization: Bearer 1234abcd...
- token dostępu jest zawarty w nagłówku HTTP, na przykład
- Serwer zasób odszyfrowuje token dostępu do weryfikacji tożsamości właściciela zasobów
- Serwer zasób sprawdza, czy właściciel zasób ma dostępu do żądanego zasobu
- Serwer zasobów zwraca wartość zasób do klienta
kroki 1 i 2 pracują, ale nie mogę dowiedzieć się, jak zintegrować kod zasobów serwera DotNetOpenAuth z ramami autoryzacji ServiceStack.
Czy istnieje jakiś przykład tego, jak to osiągnąć? Znalazłem podobny post StackOverflow na How to build secured api using ServiceStack as resource server with OAuth2.0?, ale nie jest to kompletne rozwiązanie i wydaje się nie używać modelu dostawcy autoryzacji ServiceStack.
EDIT: Trochę więcej szczegółów. Tutaj są dwie różne aplikacje internetowe. Jednym z nich jest serwer autoryzacji/autoryzacji - nie ma w nim żadnych danych klienta (tzn. Nie ma interfejsu API danych), ale udostępnia metodę/oauth/token, która akceptuje nazwę użytkownika/hasło i zwraca token dostępu OAuth2 i odświeżenie tokena, a także zapewnia możliwość odświeżania tokena. Jest on zbudowany na ASP.NET MVC, ponieważ jest prawie identyczny z próbką AuthorizationServer dołączoną do DotNetOpenAuth. Może to zostać zastąpione później, ale na razie jest to ASP.NET MVC.
Dla rzeczywistego API danych używam ServiceStack, ponieważ uważam, że jest znacznie lepszy niż WebAPI lub MVC do ujawniania usług danych ReST.
Dlatego w poniższym przykładzie:
Client to aplikacja działa na lokalnym komputerze użytkownika, serwer Auth jest ASP.NET MVC + DotNetOpenAuth i Serwer zasobów to ServiceStack
Specjalny fragment kodu DotNetOpenAuth, który jest wymagany, to:
// scopes is the specific OAuth2 scope associated with the current API call.
var scopes = new string[] { "some_scope", "some_other_scope" }
var analyzer = new StandardAccessTokenAnalyzer(authServerPublicKey, resourceServerPrivateKey);
var resourceServer = new DotNetOpenAuth.OAuth2.ResourceServer(analyzer);
var wrappedRequest = System.Web.HttpRequestWrapper(HttpContext.Current.Request);
var principal = resourceServer.GetPrincipal(wrappedRequest, scopes);
if (principal != null) {
// We've verified that the OAuth2 access token grants this principal
// access to the requested scope.
}
Zakładając, że jestem na dobrej drodze, potrzebuję uruchomić ten kod gdzieś w potoku żądania ServiceStack, aby sprawdzić, czy nagłówek Authorization w żądaniu API reprezentuje prawidłowego zleceniodawcę, który ma przyznano dostęp do wnioskowanego zakresu.
Zaczynam myśleć najbardziej logicznym miejscem do realizacji tego jest w atrybutu niestandardowego, że mogę używać do dekoracji swoje implementacje usług ServiceStack:
using ServiceStack.ServiceInterface;
using SpotAuth.Common.ServiceModel;
namespace SpotAuth.ResourceServer.Services {
[RequireScope("hello")]
public class HelloService : Service {
public object Any(Hello request) {
return new HelloResponse { Result = "Hello, " + request.Name };
}
}
}
Takie podejście pozwoliłoby również określenie zakresu (ów) wymagane dla każdej metody usługi. Wydaje się to jednak działać wbrew zasadzie "wtykania" za OAuth2 i haczykom rozszerzalności wbudowanym w model AuthProvider ServiceStack.
Innymi słowy - Martwię jestem walić w paznokci z buta, bo nie mogę znaleźć młotka ...
Czy [dostawcy uwierzytelnień OpenId dla ServiceStack] (https://www.nuget.org/packages/ServiceStack.Authentication.OpenId) pasują do Twoich potrzeb? Oto dokumentacja - [Obsługa uwierzytelniania OpenId 2.0] (https://github.com/ServiceStack/ServiceStack/wiki/OpenId) –
Ten pakiet może dostarczyć użytecznego przykładu kodu: [Skonfiguruj backend ServiceStack, aby akceptował tokeny na Okaziciela OAuth2] (http : //www.nuget.org/packages/Auth10.ServiceStack/) –
Jeśli chodzi o autoryzację, zalecana lektura dla wbudowanych ról i wsparcia uprawnień znajduje się tutaj: http://stackoverflow.com/questions/12095094/servicestack-web- services-security/12096813 # 12096813 i tutaj jest pełniejszy przykład dodania niestandardowego dostawcy OAuth niż ten, który łączysz: http://davetimmins.wordpress.com/2013/04/12/using-oauth-with-arcgis-online -i-servicestack/- masz rację. Nie widzę przykładów, które całkowicie integrują te dwie autoryzacje OAuth wraz z autoryzacją ról i uprawnień. –