Sto cercando di creare un servizio daemon Ruby per accedere all'API di riposo di Office 365. Recentemente è stato reso possibile farlo tramite il flusso "client_credentials" di OAuth, come dettagliato in questo post del blog: 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.aspxAPI di Office 365 Rest - autenticazione settimana Daemon
Non riesco a generare un token di accesso valido. L'endpoint Token mi restituisce un JWT tuttavia quando si utilizza questo token ho ricevuto una 401 con questo messaggio:
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
Capisco che il flusso client_credentials richiede di presentare un cert X.509, purtroppo tutti gli esempi presenti nel blog i post sono per C#.
Sto utilizzando un certificato autofirmato generato e una chiave privata per eseguire un'asserzione del client quando si richiede il token. Ho seguito i passaggi nel post del blog per generare il certificato e aggiornare il manifest per utilizzare questo certificato.
Questo è il codice rubino per riferimento:
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
Ovviamente ho rimosso alcuni bit di informazione per la sicurezza. Anche se è rubino, puoi vedere che sto usando il mio certificato per convalidare il client utilizzando una connessione SSL.
Ecco alcuni di più informazioni sull'errore:
"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"
Qualsiasi aiuto sarebbe apprezzato.
Modifica
Per gli altri che cercano di fare qualcosa di simile in Ruby ecco una Sintesi del codice che uso: https://gist.github.com/NGMarmaduke/a088943edbe4e703129d
L'esempio utilizza un ambiente Rails ma dovrebbe essere abbastanza facile da rimuovere i bit specifici di Rails.
Ricordarsi di sostituire l'ID CLIENT, TENANT_ID e CERT_THUMBPRINT con i valori corretti e indirizzare il percorso certificato ei metodi della chiave client sul percorso file corretto.
Poi si può fare qualcosa di simile:
mailbox = OfficeAPI.new("[email protected]")
messages = mailbox.request_messages
Ehi @Nick hai mai ottenuto questo lavoro? Mi piacerebbe vedere il tuo codice. Sto cercando di fare qualcosa di simile in Ruby e non riesco a farlo funzionare anche dopo aver provato a fare ciò che la risposta di Jason ha detto di fare. –
Hey Joel, ho appena aggiunto qualche altro dettaglio alla domanda, con una nota del mio codice –
Perfetto. Grazie mille! –