简体   繁体   中英

Securing JAX-RS with Apache CXF and OAuth 2.0

I would like to implement OAuth 2.0 authorization on my JAX-RS RESTful services.

After some researches, I've found Apache CXF to do that. However, I haven't found any examples about it and it's unclear for me. Where can I find some examples of JAX-RS with OAuth 2.0?

Disclaimer: This answer doesn't really provide a solution for securing a JAX-RS with OAuth 2.0. But it aims to give some insights to Mohasin Ali, who started a bounty on my question. Maybe, the solution I used can be useful for him.


Regarding the bounty:

The question is widely applicable to a large audience. A detailed canonical answer is required to address all the concerns.

After asking this question a while ago, I realized that OAuth 2.0 would be too complex for my requirements . Even Basic Authentication would be enough for my requirements. But I ended up using an authentication scheme based on JWT tokens signed on server side. I described my solution in this answer .

Apache CXF provides an implementation of OAuth 2.0 . It may worth looking at it if you want to use OAuth for securing you API. Apache CXF also supports OAuth 1.0 .

It doesn't matter the authentication method you decide to use, do it on the top of a HTTPS connection. You'll need a certificate for that. As a suggestion, have a look at Let's Encrypt . They claim to be a free, automated, and open Certificate Authority, currently sponsored by Mozilla, Akamai, Cisco, Chrome, Facebook and others.


Regarding the following situation, mentioned in the comments :

[...] a malicious user visits someone's computer, open the browser, see the access token and copies the access token to his own browser [...]

If a malicious user have physical access to a computer, HTTPS won't prevent this malicious user from stealing an authentication token from someone's computer. Actually, if it happens, I think you should have bigger concerns...

For an additional layer of security, you could consider storing the token along with the IP address of the user you issued the token for. For each request that hits your API, compare the IP of the incoming request with the IP of the user you issued the token for. If the IPs don't match, refuse the request.

If you go for JWT tokens, instead of storing the whole token, store only the JWT ID claim ( jti ). Just ensure this value is unique ( java.util.UUID should be enough for generating the jti value).

For a completely stateless authentication (not storing the whole token neither storing token ID), you could store the IP address in a JWT token claim, but mind the token will be a few bytes longer.

有关一个示例,请参阅https://github.com/Talend/tesb-rt-se/tree/master/examples/cxf/jaxrs-oauth2 ,它有一个并置的示例(所有端点在同一个容器中),而且更复杂一个分发端点,SAML SSO Web配置文件支持SSO。

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM