1. 程式人生 > >解決Spring Security OAuth在訪問/oauth/token時候報401 authentication is required

解決Spring Security OAuth在訪問/oauth/token時候報401 authentication is required

出現這個問題的具體原因一般有以下兩點:

1.在授權的部分我們一般是通過使用自己的login action進行http basic的方式進行授權,而我們在使用Spring Security的時候只對外暴露了登陸的這個介面,就是說其它的介面都在Spring Security的保護範圍內了,包括/oauth的介面。

2.在通過1的post方式授權通過之後使用/oauth/authorize?grant_type=password&username=user&password=pwd&client_id=app&response_type=code&redirect_uri=http://localhost的方式進行授權,這樣是可以的,但是在接下來通過post方式向/oauth/token這個介面獲取access_token的時候,會發現這個時候authentication用的並不是前面授權通過的那個authentication,而是使用的匿名登陸的那個authentication,這樣前面的authentication就無法正常使用,也會因此而得到401 authentication is required。

我們可以通過如下的方式解決這個問題 ,在AuthenticationServerConfig這個配置中,啟用AuthenticationServerSecurityConfiguration的allowFormAuthenticationForClients允許client使用form的方式進行authentication的授權,具體可以參考如下程式碼:

@Override
public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception {
    //enable client to get the authenticated when using the /oauth/token to get a access token
    //there is a 401 authentication is required if it doesn't allow form authentication for clients when access /oauth/token
    oauthServer.allowFormAuthenticationForClients();
}