Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow additional strategies to authenticate if no token is found #104. #105

Merged
merged 2 commits into from
Oct 9, 2015

Conversation

martinj
Copy link
Contributor

@martinj martinj commented Sep 15, 2015

Require Bearer to be present in authorisation header.

…#104.

Require Bearer to be present in authorisation header.
@nelsonic
Copy link
Member

The word "Bearer" is only required in OAuth 2.0 authorisation as per RFC 6750 what is the _advantage_ of requiring it when we are not doing OAuth...?

@martinj
Copy link
Contributor Author

martinj commented Sep 16, 2015

True.
However Authorization header should contain a auth-scheme as I and others have interpreted the RFC 2617. This gives the ability to use Authorization header for different authentication methods.

For JWT I've only seen been Bearer to be used. But if you don't want to be locked in to use the word Bearer then maybe it should be configurable as seen in https://github.com/johnbrett/hapi-auth-bearer-token option.tokenType (Default: 'Bearer') - Allow custom token type, e.g. Authorization: Basic 12345678

@nelsonic
Copy link
Member

I'm 100% on board with having a configurable auth header prefix with Bearer as the default and I suspect most users will agree because it does not break backward compatibility (so nobody has to change their existing projects) ... 👍

The wording in RFC 2617 is "Should" not "Must" which means its a suggestion not a requirement.

If you don't mind updating your PR we'll gladly merge it in. Or if you need any input let us know. thanks!

if (!token) {
return reply(Boom.unauthorized('Missing auth token'));
return reply(Boom.unauthorized(null, 'Token'));
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

First parameter of Boom.unauthorized is the error message
https://github.com/hapijs/boom#boomunauthorizedmessage-scheme-attributes
We could do:

return reply(Boom.unauthorized('Missing JWT Auth token', 'Token'));

Is there a reason you want to return null as the first argument?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is what enables additional strategies to be attempted.
From hapi documentation http://hapijs.com/api#serverauthschemename-scheme:

If the err returned by the reply() method includes a message, no additional strategies will be attempted. If the err does not include a message but does include a scheme name (e.g. Boom.unauthorized(null, 'Custom')), additional strategies will be attempted in order of preference.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right, but have you tried using the strategy with try mode and checking if that prevents other strategies from being attempted?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No, I havn't.
For this plugin to be useful for me it needs to support different strategies with required mode.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok. I haven't seen two auth strategies required for the same request/route but I'm all ears. Can you describe the scenario in a bit more detail so we understand the use-case? we'd love to help you solve this because others will probably have similar needs in the future. 👍

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For our API we use JWT for user authenticated requests, but for services consuming the API we use an apiKey because we want to handle them differently.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can't your API Key be a JWT?
(or do you already have an existing/legacy format for API Keys)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would be possible, but thats not what we want to do and it's outside the point here.
Hapi offers this functionality for authentication plugins and its was supported by the library i want to replace hapi-auth-jwt thats why I submitted this PR.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

understood. I was just wondering if you could simplify your own development by using JTWs everywhere.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hello! I'm also interested in seeing this particular line merged.

I have two auth strategies in place for several routes, although the second strategy does little more than change the value of request.auth.credentials at this point :)

In any case, I did test the difference between try and required and did not see a difference in behavior. If the first argument to Boom.unauthorized is not null, then Hapi doesn't try other authentication strategies, regardless of mode selected.

Thanks!

@martinj
Copy link
Contributor Author

martinj commented Oct 6, 2015

Any chance on a merge ?

@nelsonic
Copy link
Member

nelsonic commented Oct 8, 2015

Hi @martinj yes, as previously discussed, we would welcome this PR, however we noted a few changes above to keep the header prefix optional.

@aulvi
Copy link

aulvi commented Oct 8, 2015

I agree with @nelsonic, 'Bearer' should be the default. If more flexibility is required, one can always use hapi-auth-bearer-token and roll their validation.

Further, this probably should have been two PRs, since the ability to continue validation has nothing to do with the flexibility of accepting content in an auth header. Just my $0.02 gang, thanks! Looking forward to a merge of the former.

@martinj
Copy link
Contributor Author

martinj commented Oct 9, 2015

@nelsonic sorry, I missed that part with your suggestion about updating the PR. Anyway its done now. This update keeps the old behaviour with ignoring tokenType "auth scheme" in the Authorization header if nothing is specified in the options.

@nelsonic
Copy link
Member

nelsonic commented Oct 9, 2015

Agree with @aulvi that this should have been two separate PRs because two things have changed. However, given that @martinj's second commit maintains the backward compatibility by optionally allowing alternative token prefixes none of the existing apps using this should be affected.

As for the error handling change.
Given that all existing tests still pass with this PR we do not expect the change from

return reply(Boom.unauthorized('Missing auth token'));

to

return reply(Boom.unauthorized(null, 'Token'));

To "break" anything... if anyone sees an issue with us merging/publishing this PR please let us know!

CC: @walling @eventhough @alanshaw @walling @duro @diffsky @dherault @ssassi @kenhowardpdx Thanks! 👍

nelsonic added a commit that referenced this pull request Oct 9, 2015
Allow additional strategies to authenticate if no token is found #104.
@nelsonic nelsonic merged commit b387b75 into dwyl:master Oct 9, 2015
@nelsonic
Copy link
Member

nelsonic commented Oct 9, 2015

@martinj @aulvi see: https://github.com/dwyl/hapi-auth-jwt2/releases/tag/v5.1.0
The version you need is 5.1.0 on NPM.
Thanks again!
Welcome to dwyl
Please ⭐ the repo to share it with others. 👍

@martinj martinj deleted the additional-strategies branch October 9, 2015 10:14
@martinj
Copy link
Contributor Author

martinj commented Oct 9, 2015

Thank you.

@aulvi
Copy link

aulvi commented Oct 9, 2015

Thank you @martinj and @nelsonic!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants