29 March 2016

Introduction to Json Web Token




JSON web tokens are specifically for pass data between two parties securly.It is a industry standard protocol format.[https://tools.ietf.org/html/rfc7519]. In this tutorial i am mainly going to talk about how JWT is useful for client to server communication.Let’s assume you have http client and you need to communicate to rest server.So basically there are different ways to secure your connection.


  1. HTTPS
  2. User name password based authentication
  3. Pass custom secure   element using http header.

We all know that HTTPS is the secure way to communicate via HTTP protocol. But it is costly.So token based authentication gives the best security for your API design.


Usage Of JWT


JWT use for token based authentication.Token based authentication helps to authenticate server and client stateless. So No need to store client data in server side(Like sessions).

So Let’s see how JWT work in API.First when client login using username and password Then server validate the credentials and generate sign token and sent to client.Then client store token and every request send token with header.Then server verify the token and validate request.

Structure of JWT


Jason web token is this type.
aaaaa.bbbbbb.cccc So It have three parts.

Header
Payload
Signature

Header contains algorithm and type of token.

Payload is simply data you want to exchange two parties. These data type called as clams. There are two type of clams (Public and Private).
Ex:-
iss (issuer)
exp (expiration time)
sub (subject)
aud (audience)

Signature is the most advance part in web token. signature made using using this structure. Algorithem(base64urlencode(header) +"."base64urlencode(payload)+ secret)

Implementation Of JWT

There are lot of libraries available for creating and validate JSON web tokens.In this tutorial I have used this library.


1
2
3
4
5
<dependency>
    <groupid>org.bitbucket.b_c</groupid>
    <artifactid>jose4j</artifactid>
    <version>0.4.4</version>
</dependency>

Create JASON web token.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public String generateToken(String userName) {
        String jwt = null;
        try {
            JwtClaims claims = new JwtClaims();
            claims.setIssuer(userName);
            claims.setExpirationTimeMinutesInTheFuture(expiryTimeInMinutes);
            claims.setGeneratedJwtId();
            claims.setIssuedAtToNow();
            claims.setNotBeforeMinutesInThePast(beforeTimeTest);
            claims.setSubject(subject);


            JsonWebSignature jws = new JsonWebSignature();
            jws.setPayload(claims.toJson());
            jws.setKey(rsaJsonWebKey.getPrivateKey());
            jws.setKeyIdHeaderValue(rsaJsonWebKey.getKeyId());
            jws.setAlgorithmHeaderValue(AlgorithmIdentifiers.RSA_USING_SHA256);

            jwt = jws.getCompactSerialization();
            logger.info("Token Created {}", jwt);

        } catch (JoseException e) {
            logger.error("Creating Token Failed {}", e);
        } catch (Exception ex) {
            logger.error("Error occurred while Creating Token {}", ex);
        }
        return jwt;
    }
Most important thing is creating token we can set expiration time so when authentication token from server side if token is expired then it helps to easily authenticate token.As example when user first login to system we create token send and then sequentially request by request client append that token to header and send to server.

Validating Web Token


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public boolean validateToken(String token) {
        boolean state;
        JwtConsumer jwtConsumer = new JwtConsumerBuilder()
                .setRequireExpirationTime()
                .setAllowedClockSkewInSeconds(30)
                .setRequireSubject()
                .setRequireExpirationTime()
                .setVerificationKey(rsaJsonWebKey.getKey())
                .build();

        try {
            JwtClaims jwtClaims = jwtConsumer.processToClaims(token);
            long expiredDateTime = jwtClaims.getExpirationTime().getValueInMillis();
            Date date = new Date(expiredDateTime);
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            logger.info("Token Expired Date : " + simpleDateFormat.format(date));
            state = true;
        } catch (InvalidJwtException e) {
            state = false;
            logger.debug("Error Occurred while validating JWT {}", e);
        } catch (MalformedClaimException e) {
            state = false;
        }
        return state;
    }

Above method validate Web Token if token expired it will throw exception. Hope you got some understand what is JSON web token and usage of web tokens.If you have any question feel free to comment in here.Thanks.

12 December 2015

RESTful web service In 5 Minutes using DropWizard

These days I am Learning new framework called "Dropwizard".So I thought I want to share what I learn from Dropwizard. Before going to what is Dropwizard I want to tell some difficulties when building rest server application.When I was in university I don't know how to implement Restful webservice and i thought it was difficult task even for  Testing purpose.Then I learn apache CXF web server and the problem was there are lot of dependencies need to create rest server. Ex:-Apache Cxf,Jackson serialization library,log4j for logging ,Junit for Testing And other libraries.So Even for me to hard to remember all the dependency libraries. So the Solution is Dropwizard. Dropwizard is Lightweight framework which have all the dependencies in one place. Dropwizard also support to expand to your project in layered structure such as api/db/client.

What is Drop-wizard

Drop wizard is simply All the listed libraries in one package.



  • metrics
  • jetty
  • jersey
  • jackson
  • jdbi
  • hibernate
  • logback
  • mustache
  • freemarker



Start Using Maven archetype

1
2
mvn archetype:generate -DgroupId=dec.mchoice.tech.talk -DartifactId=Sample-dw-app -Dname=SampleApplication -Dpackage=dev.mchoice.tech.talk
dev.innova.drp -DarchetypeGroupId=io.dropwizard.archetypes -DarchetypeArtifactId=java-simple -DinteractiveMode=false

After creating project it will create this kind of project structure.


Biggest advantage of use maven archetype no need to configure any dependencies or plugin in POM.xml file and it will generate executable jar file .  Next step is create Rest API end point.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@Path("/student")

public class StudentManagement {
    @POST

    @Timed

    @Path("/save")

    @Produces(MediaType.APPLICATION_JSON)

    @Consumes({MediaType.APPLICATION_JSON})

    public Response addPerson(Student student) {

        Map<String, Object> response = new HashMap<>();

        response.put("statusCode", "S1000");

        response.put("description", "Successfully added Student");

        return Response.ok(response).build();

    }

}
And then you have to register your rest API in drop wizard configuration.


1
2
3
4
5
6
7
8
@Override
    public void run(final SampleApplicationConfiguration configuration,

                    final Environment environment) {

        environment.jersey().register(new StudentManagement());

    }
And now All the API related stuff are finished.So you need to run your Application.First go to target folder in project and run


1
java -jar Sample-dw-app-1.0-SNAPSHOT.jar server

After running it will start in 8080 port(application port) and there is another port 8081 (Admin port ).
Next tutorial we will discuss how to change the default configurations and what are the usages of admin port.



Then you can use curl request or postmen to send request and check the Rest API.

21 November 2015

Android Bluetooth tutorial 1

As a first step in here i have discuss how to check android enable or not and make Discoverable  in android.Before You have to add permissions in your manifest file.

    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-permission android:name="android.permission.BLUETOOTH" />

In your Android app make sure check the android enable or not in onStart method.Before that you have to add following codes in your onCreate method.

  private BluetoothAdapter mBluetoothAdapter = null;
 mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

If Your android phone doesn't support Bluetooth it will close.

 if (mBluetoothAdapter == null) {
            Toast.makeText(this, "Bluetooth is not available", Toast.LENGTH_LONG).show();
            finish();
            return;
        }

when calling to onStart app add the following code.

@Override
    public void onStart() {
        super.onStart();
         if (!mBluetoothAdapter.isEnabled()) {

            Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(enableIntent, REQUEST_ENABLE_BT);
       
           }
           }

How to make discoverable. It also start an intent.The time duration you can increase.This will need for scan devices.


 public  void ensureDiscoverable() {
      
        if (mBluetoothAdapter.getScanMode() !=
            BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) {
            Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
            discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
            startActivity(discoverableIntent);
        }

    }



18 October 2015

API Documentation with Swagger

In this post I will discuss How to document REST API.There are several API documentation tools available.

So In here I will use Swagger as API documentation tool.

Why API Documentation

The Main purpose is Test the API work properly.For Test API normally what we do is using curl or postman send request and Test.So Let's think About Who don't have programming knowledge how to test API.API documentation is to help them to read our API.

Swagger Support user friendly UI to Test the API.For demonstrate behavior of swagger UI I have created sample rest API.

How to use Swagger

First Add these service beans and providers to your server.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
<jaxrs:serviceBeans>
     <ref bean="studentManagementListener"/>
     <ref bean="swaggerResourceJSON"/>
</jaxrs:serviceBeans>
<jaxrs:providers>
     <ref bean="jacksonProvider"/>
     <ref bean="resourceWriter"/>
     <ref bean="apiWriter"/>
     <ref bean="corsFilter"/>
</jaxrs:providers>


<bean id="corsFilter" class="org.apache.cxf.rs.security.cors.CrossOriginResourceSharingFilter"/>

    <bean id="swaggerResourceJSON" class="com.wordnik.swagger.jaxrs.listing.ApiListingResourceJSON"/>

    <!-- Swagger writers -->

    <bean id="resourceWriter" class="com.wordnik.swagger.jaxrs.listing.ResourceListingProvider"/>

    <bean id="apiWriter" class="com.wordnik.swagger.jaxrs.listing.ApiDeclarationProvider"/>


And Then Need to Add Swagger Config Bean.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
<bean id="swaggerConfig" class="com.wordnik.swagger.jaxrs.config.BeanConfig">

        <property name="resourcePackage" value="dev.innova.rest.server.api"/>

        <property name="version" value="1.0.0"/>

        <property name="basePath" value="${student.management.api.url}"/>

        <property name="title" value="Student Management API"/>

        <property name="description" value="Student Management API Support to Manage Students in library"/>

        <property name="contact" value="sajith.vijesekara@gmail.com"/>

        <property name="license" value="Apache 2.0 License"/>

        <property name="licenseUrl" value="http://www.apache.org/licenses/LICENSE-2.0.html"/>

        <property name="scan" value="true"/>

    </bean>

And The Final Step is define Your API model.It is simple.Using swagger Annotations you can easily  make API visible in swagger UI.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
@Path("/")
@ApiModel(value = "Student Management")
@Api(value = "Student Management Server", description = "Student Management")
@CrossOriginResourceSharing(allowAllOrigins = true, allowCredentials = true)
public interface StudentManagement {

    @POST
    @Path("/student/add")
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    @ApiOperation(value = "Add Student", response = Response.class, notes = "Add Student")
    @ApiResponses(value = {@ApiResponse(code = 200, message = "Add Student Successful"),
    @ApiResponse(code = 404, message = "Failed to Add Student"),
    @ApiResponse(code = 500, message = "Failed to connect to Server")})
    Response addStudent(Student student);



    @GET
    @Path("/student/search")
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    @ApiOperation(value = "Search Student", response = Response.class, notes = "Search Student")
    @ApiResponses(value = {@ApiResponse(code = 200, message = "Search Student Successful"),
    @ApiResponse(code = 404, message = "Failed to Search Student"),
    @ApiResponse(code = 500, message = "Failed to connect to Server")})
    Response searchUser(GetStudent name);



    @DELETE
    @Path("/student/remove")
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    @ApiOperation(value = "Delete Student", response = Response.class, notes = "Delete Student")
    @ApiResponses(value = {@ApiResponse(code = 200, message = "Delete Student Successful"),
    @ApiResponse(code = 404, message = "Failed to Delete Student"),
    @ApiResponse(code = 500, message = "Failed to connect to Server")})
    Response removeStudent(GetStudent name);

}

And One Thing I forgot to add what are the dependencies for swagger.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
<dependency>
     <groupId>com.wordnik</groupId>
     <artifactId>swagger-jersey2-jaxrs_2.10</artifactId>
     <version>1.3.8</version>
      <exclusions>
         <exclusion>
             <groupId>javax.ws.rs</groupId>
             <artifactId>jsr311-api</artifactId>
         </exclusion>
      </exclusions>
  </dependency>

  <dependency>
       <groupId>org.apache.cxf</groupId>
       <artifactId>cxf-rt-rs-security-cors</artifactId>
       <version>2.6.1</version>
  </dependency>


How to use Swagger UI
Download Swagger UI and deploy in tomcat server.Then open swagger UI and enter API url with api-docs tag at end of URL.

Ex:- http://127.0.0.1:4738/api-docs



04 October 2015

Android Google cloud messaging Test server

Java GCM Testing Server

Today I will share how to create java Testing Application for send android GCM notifications to android client.There are lot of examples how to create android GCM client application but for testing the notification flow you need server.But I couldn't found any good example how to create java server.So I found Library for send notifications so i used that library and create simple swing application to send notification.



Sample Code

This is the code-sample which I have already pushed in to github location(https://github.com/sajith4u/android-gsm-sample).


  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
package dev.innova.sajith;

import com.google.android.gcm.server.Message;
import com.google.android.gcm.server.Result;
import com.google.android.gcm.server.Sender;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;


public class MainClass {

    public static void main(String[] args) {
        System.out.println("starting gcm-server Application");
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                init();
            }
        });

    }

    /**
     *  Send Notification to server
     * @param apiKey
     * @param registrationId
     * @param title
     * @param messagetext
     * @return
     */
    public static String send(String apiKey, String registrationId,String title,String messagetext) {
        Sender sender = new Sender(apiKey);
        Result result = null;
        Message message = new Message.Builder()
                .addData("message",messagetext)
                .addData("title", title)
                .build();
        try {
            result = sender.send(message, registrationId, 2);
            System.out.println("Result : " + result.getMessageId());
            System.out.println("Result ErrorCode : " + result.getErrorCodeName());
            System.out.println("Result : " + result.getCanonicalRegistrationId());
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result.toString();
    }

    /**
     * Initialize the Swing form
     */
    public static void init() {
        JFrame frame = new JFrame("Notification Sender");
        frame.setSize(600, 400);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel();
        frame.add(panel);
        placeComponents(panel);

        frame.setVisible(true);
    }

    /**
     *  Add Items to Swing form
     * @param panel
     */
    private static void placeComponents(JPanel panel) {

        panel.setLayout(null);

        JLabel apiKeyLabel = new JLabel("ApiKey");
        apiKeyLabel.setBounds(50, 20, 100, 40);
        panel.add(apiKeyLabel);

       final JTextField apiKeyText = new JTextField(20);
        apiKeyText.setBounds(160, 20, 400, 40);
        panel.add(apiKeyText);

        JLabel registrationLabel = new JLabel("Registraion ID");
        registrationLabel.setBounds(50, 70, 100, 40);
        panel.add(registrationLabel);

        final JTextField registrationText = new JTextField(20);
        registrationText.setBounds(160, 70, 400, 40);
        panel.add(registrationText);

        JLabel titleLabel = new JLabel("Title :");
        titleLabel.setBounds(50, 120, 100, 40);
        panel.add(titleLabel);

        final JTextField titleText = new JTextField(20);
        titleText.setBounds(160, 120, 400, 40);
        panel.add(titleText);

        JLabel messageLabel = new JLabel("Message :");
        messageLabel.setBounds(50, 170, 100, 40);
        panel.add(messageLabel);

        final JTextField messageText = new JTextField(20);
        messageText.setBounds(160, 170, 400, 40);
        panel.add(messageText);

        JButton resetButton = new JButton("Reset");
        resetButton.setBounds(50, 220, 120, 40);
        panel.add(resetButton);

        JButton sendNotification = new JButton("Send");
        sendNotification.setBounds(250, 220, 120, 40);
        panel.add(sendNotification);

        final JLabel statusLabel = new JLabel("status :");
        statusLabel.setBounds(50, 270, 400, 100);
        panel.add(statusLabel);

        sendNotification.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                statusLabel.setText("");
                String message = messageText.getText();
                String apiKey = apiKeyText.getText();
                String registrationKey = registrationText.getText();
                String titleMessage = titleText.getText();
                if((registrationKey.equals("")||registrationKey.equals(null))||(apiKey.equals("")||apiKey.equals(null))||(message.equals("")||message.equals(null))){
                    statusLabel.setText("Please Fill the above three Fields");
                }else {
                    statusLabel.setText("sending message ...........");
                    String response = send(apiKey,registrationKey,titleMessage,message);
                    statusLabel.setText(response);
                }

            }
        });

        resetButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                statusLabel.setText("");
                messageText.setText("");
                apiKeyText.setText("");
                registrationText.setText("");
                titleText.setText("");
            }
        });

    }


}

For use this application you need API key which provided when creating application in Google could platform and registration Id.In the next post I will share simple android client application and how to test using this server.

05 September 2015

Linux Bash Generate Random Files

In this Post I will discuss how to create random files using Linux bash script and how to remove files. For Example If you need to remove logs created for project you can write bashscripts to remove log files.First script create log files and second script remove the log files.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash

DIRECTORY_NAME="/home/sajithv/scripts"

cd $DIRECTORY_NAME

while :

do

CURRENT_TIME=`date +%Y-%m-%d:%H:%M:%S`

echo "Create Files at $CURRENT_TIME."

 touch "SampleFile$CURRENT_TIME.txt"

 sleep 5

done

Happy Coding...