Hello!

I'm trying to develop a REST API using node.js, to support an Android app. 
 I've been able to find several resources on the web, however, most of the 
examples I come across fall into two camps:
1) Basic authentication over HTTPS
2) OAuth

I don't want to do basic authentication over HTTPS with a username and 
password, because in the Android app, I have it setup to store a username 
and token via the AccountManager (they seem to have taken down reference to 
the code on Android's site; my implementation is very similar the sample 
code that ships with the SDK: *
android-sdk-linux/samples/android-17/SampleSyncAdapter* except I'm not 
using any of the Sync features).

I don't want to use OAuth because I am not sure we can count on users to 
have accounts with Google or some other third-party OAuth provider.

This is my first round at implementing web authentication; from what I'm 
reading, the steps go something like this:
- [Service] Administrator creates an account with a username and a 
generated strong code is stored temporarily in the user record; emailed to 
user
- [App] User selects account and enters username and code, plus password of 
their choice, into the form
- [App] Basic authentication over HTTPS sends over username, code, and 
password (just this once)
- [Service] Stores random salt and password hash in the user record, and 
the generated token (a)
- [Service] Replies back to App with the token
- [App] Username and token is stored via AccountManager

Then,
- [App] User sends username and token to service (b)
- [Service] *authenticates* the user if the token matches and is not 
expired (c)
- [App] User can access the various REST API calls (d)

In this way, the password is never stored on the Android device or in the 
database.  When the token expires, then User re-enters password.  The User 
can request a password reset, which generates a strong code again and the 
process starts from the top.

My questions (referenced above) are:
(a) Should the generated token be stored on the user record, or in a 
separate table?  My thinking for a separate table/collection would be to 
have a background process that could remove expired tokens; keeping this 
information separate from the user record; or perhaps a user could have a 
valid reason to have multiple different tokens (one on the phone, another 
on the tablet).
(b) Is this simply done through basic authentication over HTTPS, sending 
the username and token (in place of password)?
(c) I've seen examples of node.js code setting values on request.session; 
effectively, marking the session as authenticated.  Is this specific to 
browsers/cookies and/or does it work when communicating to Android?
(d) Kind of an extension of (c), does the username/token have to be sent 
every time, or can I reference something like the 
request.session.authorized value?

Also:
- Does anyone know of a good working example of a node.js REST API 
implementation for an Android app?  Sometimes it's easier to just learn 
from code.
- Is there working example code of the node dependencies I see referenced 
everywhere (everyauth, connect-auth, passport) being used with an Android 
app?  Most seem to implement OAuth solutions.
- Any security/implementation pitfalls with this approach?

References:
* [The Definitive Guide to Forms-based Website Authentication](
http://stackoverflow.com/a/477578/172217)
* [Designing a Secure REST (Web) API without OAuth](
http://www.thebuzzmedia.com/designing-a-secure-rest-api-without-oauth-authentication/
)
* [How to Implement a Secure REST API with node.js](
http://stackoverflow.com/a/15500784/172217)
* [RESTful Authentication](http://stackoverflow.com/a/7158864/172217)
* [Securing my node.js App REST API](
http://stackoverflow.com/a/9126126/172217)
* [Connect Session Middleware](
http://www.senchalabs.org/connect/session.html)
* [Secure Salted Password Hashing](
http://crackstation.net/hashing-security.htm)

-- 
-- 
Job Board: http://jobs.nodejs.org/
Posting guidelines: 
https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
You received this message because you are subscribed to the Google
Groups "nodejs" group.
To post to this group, send email to nodejs@googlegroups.com
To unsubscribe from this group, send email to
nodejs+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/nodejs?hl=en?hl=en

--- 
You received this message because you are subscribed to the Google Groups 
"nodejs" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to nodejs+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to