Safely passing email and password to REST API - android

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 ;)

Related

Web service only Access by My Android Application

I am using asp.net web service with Android application for select and insert the data from MS-SQL Server.
I just want to web service only access by my Android application.
Because, web service is hosted on my private server and data is very secure. I am not want anyone can call my web service.
Any solution?
Make request in the POST request and use extra field to check for sender's. In this field you could use any secret key !
In your request, just put a SHA-1 key (e.g SHA1(Hard_coded_password_in_app_and_WS, unique_ID_stored_in_preference_and_in_data__base))
In your WS, just check if this parameter is ok, and then answer. It's not the best security ever, but it's quite easy to set up, and it will do the trick.
there are a few ways to do this (in my opinion):
if your app has user account involved, you can simply use user session to authenticate or the social logins eg. facebook
post request, with a header of a hashed key,
good read: https://weblogs.java.net/blog/gmurray71/archive/2006/08/restricting_acc.html

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?

Android web server authentication with JsonRPC

I've been doing some research and it seems my best option to go with an Android-Client/PHP-Server application is by using JsonRPC. My question is, How would an authentication mechanism work?
I'd use Zend for json server and Android-json-rpc as client. Or is there a better way to do a remote authentication?
If you want to do a simple API key then in every JSON call, the client would pass the auth key and in each method on the php side would get the key and authenticate it.
If you wanted to do session type authentication, you would have to first call an authenticate method that would return the session_id to the client. The client would then send the session key in every subsequent method. Within the methods, the server could then check the session key.
I have looked for a way to cleanly abstract authentication out of the actual json RPC methods, but if you use Zend_Json_Server directly, there is no way to do it. You may be able to extend it, but to me, it wasn't worth the hassle.
just like browser works . Browser also sends session id in every request using cookies . You can build the similar functionality with your java REST client by appending that id to every request .Then in php code you can do
session_id($_GET('session_id'));
session_start();
your rest client will send this session_id in every request to be identified. This way you can use php sessions just like with browsers.

Some server client keys design issue

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.

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