2017-08-09 46 views
1

我爲我的Spring Boot Microservices + Angular2應用程序使用Azure AD OAuth 2.0授權流程。我的應用程序如何在web API中驗證access_token(Azure AD OAuth 2.0)?

  1. (從頭端來我的春節,啓動應用程序第一次請求)春啓動應用程序
    流量重定向它Azure的登錄頁面。
  2. 用戶輸入他的憑據
  3. 授權服務器發送POST請求redirect_uri,這一要求有authorization_code與其他用戶的信息(如姓,名和用戶ID)一起。
  4. 然後我用authorization_code

現在我想送bearer_token到其他微服務,這將驗證bearer_token得到bearer令牌和refresh_token

我的問題是如何驗證bearer_token並在其他微服務中檢索該令牌的所有者?

回答

1

我假設您使用Azure AD OAuth 2.0的默認配置來返回JWT編碼的標記。這種類型的令牌幾乎沒有什麼好處 - 您可以從令牌中自行提取信息,例如授予的範圍,並且您可以通過檢查令牌簽名來避免向驗證服務器發送驗證請求。

配置JWT令牌驗證

您將需要配置資源服務器(你的Web API)使用JWT令牌:

@Configuration 
@EnableResourceServer 
public class OAuth2ResourceServerConfig extends ResourceServerConfigurerAdapter { 
    @Override 
    public void configure(ResourceServerSecurityConfigurer config) { 
     config.tokenServices(tokenServices()); 
    } 

    @Bean 
    public TokenStore tokenStore() { 
     return new JwtTokenStore(accessTokenConverter()); 
    } 

    @Bean 
    public JwtAccessTokenConverter accessTokenConverter() { 
     JwtAccessTokenConverter converter = new JwtAccessTokenConverter(); 
     converter.setVerifierKey(obtainAzureADPublicKey()); 
     return converter; 
    } 

    @Bean 
    @Primary 
    public DefaultTokenServices tokenServices() { 
     DefaultTokenServices defaultTokenServices = new DefaultTokenServices(); 
     defaultTokenServices.setTokenStore(tokenStore()); 
     return defaultTokenServices; 
    } 
} 

此代碼(帶小的修改),從優秀blog post取Eugen Paraschiv(aka Baeldung)。

獲取Azure的簽名密鑰

您將需要得到一個非對稱的公共加密密鑰在Azure AD使用簽署發佈的令牌,並從obtainAzureADPublicKey方法返回。

基礎上documentation你將不得不(通過檢索"jwks_uri"財產從結果值)首先獲得來自https://login.microsoftonline.com/common/.well-known/openid-configuration智威湯遜的簽名密鑰端點的元信息。

然後,您需要從該URL獲取正確的密鑰。

請注意,Azure AD會不時更改此信息,因此您無法在應用程序啓動時只執行一次。但是,將其緩存至少24小時將是一個好主意。

+0

Hi @ Oleg,它是否(從安全的角度來看)可以在Cookie中存儲刷新令牌和不記名令牌? –

1

基本上誰生成的訪問令牌應負責驗證它通常是授權服務器的人,我理解Azure是你的授權服務器所以,你應該驗證令牌

+0

那就是我卡住的地方。我如何從Azure AD驗證它? –

0

對於任何HTTP請求你發送到microservices,您應該添加以下的標題:

Authorization: Bearer bearer_token 

bearer_token是由microservices爲用戶提供的令牌。

注意:我不知道microservice是什麼意思,我假設這是一些Web API服務。

+0

是的,我們可以說微服務是一種Web API。但我的問題是microservice/Web API將如何確定該令牌是否有效?此外,它應該能夠檢索與該令牌關聯的用戶信息以執行某個授權部分。 –

+0

驗證令牌是否有效的責任在於微服務(或Web API服務器),但不是你。如果它發送授權錯誤,這意味着您的'bearer_token'已過期,並且有時間使用'refresh_token'刷新'bearer_token'。通過它可以做到這一點的方法也作爲Web API服務提供。通常他們還提供'bearer_token'有效的秒數,嘗試使用它。 – ViKiG

相關問題