Próbuję utworzyć usługę Daemon usługi Ruby, aby uzyskać dostęp do interfejsu API usługi Office 365. Niedawno stało się to możliwe dzięki przepływowi "client_credentials" protokołu OAuth, tak jak to opisano w tym poście: http://blogs.msdn.com/b/exchangedev/archive/2015/01/22/building-demon-or-service-apps-with-office-365-mail-calendar-and-contacts-apis-oauth2-client-credential-flow.aspxInterfejs API usługi Office 365 - Uwierzytelnianie tygodnia demona
Próbuję wygenerować ważny token dostępu. Punkt końcowy znak zwraca mi JWT jednak podczas korzystania z tego tokenu Otrzymałem 401 z tej wiadomości:
The access token is acquired using an authentication method that is too weak to allow access for this application. Presented auth strength was 1, required is 2
Rozumiem, że przepływ client_credentials wymaga cię przedstawić cert X.509, niestety wszystkie przykłady w blogu post są dla C#.
Używam wygenerowanego samopodpisanego certyfikatu i klucza prywatnego do wykonania asercji klienta podczas żądania tokena. Postępowałem zgodnie z instrukcjami w poście na blogu, aby wygenerować certyfikat i zaktualizować manifest, aby korzystać z tego certyfikatu.
Jest to kod Ruby dla odniesienia:
def request_token
uri = URI.parse("https://login.windows.net/== TENANT-ID ==/oauth2/token?api-version=1.0")
https = Net::HTTP.new(uri.host, uri.port)
req = Net::HTTP::Post.new(uri.request_uri)
req.set_form_data(
:grant_type => 'client_credentials',
:redirect_uri => 'http://spready.dev',
:resource => 'https://outlook.office365.com/',
:client_id => '== Client ID ==',
:client_secret => '== Client secret =='
)
https.use_ssl = true
https.cert = client_cert
https.key = client_key
https.verify_mode = OpenSSL::SSL::VERIFY_PEER
resp = https.start { |cx| cx.request(req) }
@access_token = JSON.parse(resp.body)
end
Oczywiście usunąłem niektóre bity informacji dla bezpieczeństwa. Nawet jeśli jest to rubin, widzisz, że używam mojego certyfikatu do sprawdzania poprawności klienta za pomocą połączenia SSL.
Oto kilka infomation od błędu:
"x-ms-diagnostics" => "2000010;
reason=\"The access token is acquired using an authentication method that is too weak to allow access for this application. Presented auth strength was 1, required is 2.\";
error_category=\"insufficient_auth_strength\"",
"x-diaginfo"=>"AM3PR01MB0662",
"x-beserver"=>"AM3PR01MB0662"
Każda pomoc będzie docenić.
Edit
Dla innych, którzy chcą zrobić coś podobnego w Ruby oto Streszczenie kod używam: https://gist.github.com/NGMarmaduke/a088943edbe4e703129d
Przykład wykorzystuje środowisko Rails, ale powinien być dość łatwe do wytnij specyficzne bity Rails.
Należy pamiętać o zastąpieniu IDENTYFIKATORA KLIENTA, TENANT_ID i CERT_THUMBPRINT poprawnymi wartościami i wskaż ścieżkę certyfikatu i metody klucza klienta do prawej ścieżki pliku.
Następnie można zrobić coś takiego:
mailbox = OfficeAPI.new("[email protected]")
messages = mailbox.request_messages
Hej, który pomógł ci kiedyś zadzwonić? Chciałbym zobaczyć twój kod. Próbuję zrobić coś podobnego w Ruby i nie mogę sprawić, żeby działało, nawet po próbie wykonania tego, o czym mówił Jason. –
Hej Joel, właśnie dodałem trochę więcej szczegółów do pytania, z istotą mojego kodu –
Perfect. Dzięki za tonę! –