Some server client keys design issue - android

I need some advise.
I have a mobile application (Android) and a WebService for it.
When application starts first time - user does some registration process. Then he has a username(Unique). The server give the user a unique userId for internal purposes.
In some features of the application - the user sends requests to the webservice that needs the UserId.
I thought to sends for these request the username and not the userId - meaning that the application will never have the internal userIds, always send the username and the webservice will find the userId itself..... Guess it is better for security issues, disadvantage is that it takes more time in the server side.
Any ideas?
Comments?

For me it makes more since to store both in the android application and use the userid to make requests. I'm not aware of any unsecure aspects of sending the userid. If anything it seems less secure to accept a username because anyone has access to the list of usernames and if they found the service endpoint could possible figure out how to send it someone else's username and retrive info. The userid on the other hand is hidden from the users.

Related

Safely passing email and password to REST API

How can I safely pass a user's email and password from an Android app over to my web server's REST API for authentication?
Would it be safe to create a POST request to a route, like:
http://www.website.com/user/login
Are there other ways to do it? Safer ways? What safety concerns should I know about?
Sending the password should only be a "login action". Obviously, this login call must be done via https in order to be safer.
The problem is that a mechanism based on a password attached to every request is not safe enough.
The two main methods
Via cookies: You interchange a cookie between client and server. You obviously have to handle the authentiacion in server to validate the request. Classic way.
Via tokens (OAuth2 way): You interchange a refresh token (long duration, maybe days, months... it's customizable) and an authentication token (temporary and refreshed with the refresh token). You have also to handle this on server (to set scopes and times,validation etc.).
I'm always thinking in a password for an user/session. Don't store "masters passwords" for services in your APK!! Never!! APK has no secrets, they can be easily decompiled.
I hope this would help you ;)

Android bypassing CouchDB authentication

I am using CouchDB to authenticate users for my app, which is essentially just a front end for a CouchDB database, so I am using the API to authenticate users, logically, this code
httpget(http://wrongusername:wrongpassword#mycouch.com:5984) //not my actual code
should come back with the response
{"error":"unauthorized","reason":"Name or password is incorrect."}
as it does when I cURL the same URL. But instead, no matter what I put in as the username and password it returns
{"couchdb":"Welcome","version":"1.2.0"}
And I know I'm not somehow storing a valid URI or that response in the code because I've changed the parameters of HttpGET to return _all_docs, and it has returned all the documents, which a normal user shouldn't be able to to do. I have not modified any of the configuration files and the login is not stored anywhere in the database
Are you sure you are hitting the same CouchDB instance that you have set up the users with? Clients, not even Android, have a way of bypassing authentication.
Couchdb uses session cookies for authentication, maybe your http client authorized to couchdb before and keeps the cookie around?
Another thing I can think of: unless you set require_valid_user to true, couchdb only restricts access to individual databases, which would explain the "welcome" message on /.

Do I need to use PHP sessions in my Android app?

I have created an Android app that communicates with a PHP web server. They both send JSON to each other. My app is almost finished, however there is one thing left to do: authentication.
Since the user's username and password will be stored in Android SharedPreferences, is there any need to use PHP sessions, given that the user won't need to enter the username/password at every request?
Since I can just send the username and password in the HTTP POST header for every request, and that I will be using SSL, is this sufficient? I guess I could add an extra field in the header called 'random' that just adds a random value, just to use as a salt so that the encrypted SSL payload will be different every time.
The reason why I don't want to use sessions is that my Android App would either have to handle cookies, or managed the storage of the session ID.
If there are some serious cons to using my method above, then I'm more than happy to use sessions.
Personally, I'm against sending the username and password in the request each time. One thing you could do is generate a unique ID when they log in, and store that in a database on your server, then just pass that instead of the username and password.
I think Google have given this a lot of thought, so doing something similar to what they do wouldn't be a bad idea. If you look at the way they do their
login process, i.e. https://accounts.google.com/o/oauth2/auth
and especially their
token freshining, i.e. https://accounts.google.com/o/oauth2/token
it might feel like overkill, but you might come away with some ideas that could be valuable to your own implementation.
EDIT: oops, almost forgot the documentation link: https://developers.google.com/accounts/docs/OAuth2
I believe that you will be fine with what you have now. As long as you make sure that the user info is securely transfered. The salt is a good idea. It really just depends on how secure you want it.
It is very bad practice to send account credentials in every request.
I think the better way to use Google OAuth2 API - it is VERY simple and safer than local accounts database. Have you considered that option?

Secure android communication with a server

I am very new to writing apps so please bear with me!
I am writing an app that needs to communicate securely with a java server (under my control).
Firstly to login to the server, and then send data back and forth. What is the best way of doing this?
My first thoughts was to communicate to a webpage via ssl with the username and password. e.g. login.php with user=xxx and pass=zzz as posted variable. The site returns a random string and saves it in the database.
If the user then stays logged in, this string is saved on the app. This is then sent with every communication. e.g. set_temp.php with string=123456 and temp=20
This seemed easiest to complete, and I have done most of this.
Alternatively, my other thoughts was to go through a sockets approach and commumicate with the Java server directly. Would this be more secure? Is this even possible?
Or are there any other suggestions? How do the big apps like facebook and gmail secure data?
Thanks
Matt
Use SSL protocol. You can create API services on the server and communicate with them. To keep the user logged in use SessionID. Take a look at DefaultHttpClient() class.
I hope this is useful :)
I would use a webservice on your java machine to communicate with. All requests are via HTTPS and you can login the user via the webservice. Also I would add a time limit to the users loggedin session to ensure that he is logged out properly after some time limit.

How to implement cookie in android application

I want to make a login application in Android.
Requirement of the project is to store user name and password for two days using cookie.
Is it possible to use cookies? If yes, then how? Can you give me the code?
Note: I can't use web view.
As a commenter already said, you aren't supposed to store password (even in encrypted form) in a cookie. What you can store is a session id. When user logs in the application, the application generates a session id for him/her, which will stay valid for two days. In every request that you make to the application, you add the session id as an HTTP header.
You can store the session id and the datetime it was issued in the preferences. When the user needs to make a new request to the application and the session hasn't expired, you can read the stored value.
If you are not looking to integrate this into the browser, then have a go at this.
If you look at the HTTP protocol, you can see that cookies are sent by the client in plain text in the request. This means you should have your application deliver them every time your request a page. This is not valid for local-only cookies, but I don't think that you're interested in these. If you want to set cookies from the server side, you will have to adapt your application to parse the response and look for cookies. (also HTTP protocol)
For a better view of the raw data you need to send or receive, you can monitor your traffic using Wireshark or a similar tool and see how the request/response look like.
I am currently working on a web-service that I need to implement on iPhone and this is my first idea of doing it. I haven't got to implement this yet (my web service is still not done) so there's not much more I can tell you at the moment.
Edit:
A useful page about this might be the Wikipedia HTTP Cookie page located here.
As Reno said, try to avoid storing the password in the cookie. Instead you should let the server generate a sessionID when logged in and let this ID expire on the Server after two days. SO you can login with the username and the sessionID you generated with logging in once.
I you want, you can store that sessionID in the cookie.

Categories

Resources