SlideShare a Scribd company logo
RESTful services and
OAUTH protocol in IoT
by Yakov Fain, Farata Systems
Farata Systems and SuranceBay
surancebay.com
faratasystems.com
The three parts of this presentation
• One approach to integrating consumer devices in the
business workflow
• Live demo: integrating a blood pressure monitor into a
business workflow
• A brief review of REST, OAUTH, Websockets and their
roles tin our application.
Yesterday’s Sensors (Things)
• 18 years ago. Telephony.
• I’ve been programming IoT!
Today’s Sensors

SCIO: a molecular sensor that scans physical objects and
receives instant information to your smartphone.
http://www.consumerphysics.com/
Tomorrow: Streachable Wearables

epidermal electronics
Source: http://bit.ly/1uu0srr
A thing is an app + an API + a Web site.
Smartphone

app
Device

Manufacturer’s

Server
Device
A Typical Consumer Device Setup
Bluetooth or NFC
MQTT, CoAp, …
MQTT, CoAp, …
Low-Level IoT Approach
Learn and implement IoT protocols: MQTT, XMPP, AMQP, CoAp,…
Write Java programs for Raspberry Pi or Arduino

Learn HomeKit and HealthKit from Apple
High-Level IoT Approach
Create applications using standard
technologies to integrate things into an
existing business workflow.
A Proof of Concept App
• Integrate consumer devices into one of the insurance
business workflows
• Leverage existing software technologies
• Create a standard-based application layer that connects
things
Your Server in the Middle
• Create a software layer as a proxy for all communications
with IoT devices.
• Find the use-cases for data-gathering devices in your
business applications.
• Collect the valuable data from devices for analisys.
Java dominates on the middleware market.
The Use Case: Integrating Scale and Blood Pressure Monitor

into insurance workflow
IHealthLabs Blood

Pressure Monitor
Fitbit Scale

Aria
Medical Examiner’s Report
Removing Manual Entry
DeviceVendor.com
XYZ protocol
XYZ protocol
A Typical IoT Workflow
A Typical IoT Workflow
XYZ protocol
XYZ protocol
We’re not dealing with XYZ



Our server communicates with the vendor’s server 

using HTTPS

DeviceVendor.com
Integrating With Fitbit Scale: Take 1.
fitbit.com
My Front-End App
HTTP/Rest API
Weight:
Integrating With Fitbit Scale: Take 2.
fitbit.com
HTTP/Rest API
Weight:
My Front-End App
My Server
Polling/Pub-SubData push
via
WebSocket
Integrating With Fitbit and iHealthLabs.
fitbit.com
Weight:
iHealthLabs.com
HTTP/

Rest API
Blood Pressure:
HTTP/Rest API
Data push
via
WebSocket
My Front-End App
My Server
Adding OAuth Authentication
fitbit.com
Weight:
iHealthLabs.com
HTTP/

Rest API
Blood Pressure:
HTTP/Rest API
My Front-End App
My Server
Data push
via
WebSocket
Secret, key,
tokens from
each vendor are
here
The Final Architecture
fitbit.com
Weight:
iHealthLabs.com
HTTP/

Rest API
Blood Pressure:
HTTP/Rest API
My Front-End App
My Server
Data push
via
WebSocket
- Vendor’s consumer app
Secret, key,
tokens from
each vendor are
here
Demo
Measuring Blood Pressure
What’s used in our app
• RESTful Web services
• OAuth authentication and authorization
• WebSocket protocol
• Front end: written in Dart, deployed as JavaScript
• Data exchange format: JSON
• Back-end: Java with Spring Boot and embedded Tomcat
• Build automation: Gradle
© 2015 Farata Systems
REST API
REpresentational State of Transfer
© 2015 Farata Systems
HTTP Request and Java EE Rest Endpoint
A sample client’s HTTP request:
“https://iHealthLabs.com:8443/iotdemo/ihealth/bp"
© 2015 Farata Systems
HTTP Request and Java EE Rest Endpoint
A sample client’s HTTP request:
“https://iHealthLabs.com:8443/iotdemo/ihealth/bp"
// Configuring The App
@ApplicationPath(“iotdemo")
public class MyIoTApplication extends Application {

}
© 2015 Farata Systems
HTTP Request and Java EE Rest Endpoint
// Receiving and handling blood pressure on our server
@Path("/ihealth")

public class BloodPressureService {
// …
// The method to handle HTTP Get requests
@GET
@Path("/bp")

@Produces(“application/json")

public String getBloodPressureData() {
// The code to get bp and prepare JSON goes here 

return bloodPressure;

}
}
A sample client’s HTTP request:
“https://iHealthLabs.com:8443/iotdemo/ihealth/bp"
// Configuring The App
@ApplicationPath(“iotdemo")
public class MyIoTApplication extends Application {

}
© 2015 Farata Systems
A Rest Endpoint in Spring Framework
// The endpoint handling blood pressure
@RestController

@RequestMapping("/ihealth")

public class HealthLabsController {
// …
// The method to handle HTTP Get requests
@RequestMapping(value="/bp", method = RequestMethod.GET,

produces = "application/json")

public Measurement getBloodPressureData() {
// The code to get blood pressure goes here 

return bloodPressure;

}
}
OAuth 2
Authorizing an app to act on behalf of the user
Authorization and Authentication
• Authentication: Is the user who he says he is?
• Authorization: Which resources the user can access?
The owner of the Blood Pressure Monitor can see only the
measurments taken from his device.
The OAuth Players
• The User
• The client app that accesses the user’s resources
• The server with the user’s resources (data)
• The authorization server
Delegating Authorization to 3rd Party Servers
Bad
Delegating Authorization
Good
OAuth 2 Access Token
A client app needs to aquire an access token that
can be used on behalf of the user.
Typical OAuth 2 Workflows
• A client app is located on the user’s device
• A client app is located on the server (our use case)
iHealthLabs Authorization
(our 

server)
GUI
Redirect URI
A Sample OAuth 2 Workflow
• My company registers the app with the thing’s vendor providing a redirect
URI for successful and failed logins and gets a client id and a secret.
A Sample OAuth 2 Workflow
• My company registers the app with the thing’s vendor providing a redirect
URI for successful and failed logins and gets a client id and a secret.
• My company builds an app that uses the thing’s API (e.g. with REST ).
A Sample OAuth 2 Workflow
• My company registers the app with the thing’s vendor: providing a redirect
URI for successful and failed logins and gets a client id and a secret.
• My company builds an app that uses the thing’s API (e.g. with REST ).
• The user opens my app and logs into thing’s vendor site via its authentication
server (not the OAuth provider).
A Sample OAuth 2 Workflow
• My company registers the app with the thing’s vendor providing a redirect
URI for successful and failed logins and gets a client id and a secret.
• My company builds an app that uses the thing’s API (e.g. with REST )
• The user opens my app and logs into thing’s vendor site via its authentication
server (not the OAuth provider).
• My app (not the browser) generates the unguessable state value and sends
the request to the thing vendor’s OAuth provider:



https://<auth_server>/path?clientid=123&redirect_uri=https//
myCallbackURL&response_type=code&scope=“email
user_likes”&state=7F32G5
A Sample OAuth 2 Workflow
• My company registers the app with the thing’s vendor providing a redirect URI for successful
and failed logins and gets a client id and a secret.
• My company builds an app that uses the thing’s API (e.g. with REST )
• The user opens my app and logs into thing’s vendor site via its authentication server (not the
OAuth provider).
• My app (not the browser) generates the unguessable state value and sends the request to the
thing vendor’s OAuth provider:



https://<auth_server>/path?clientid=123&redirect_uri=https//
myCallbackURL&response_type=code&scope=“email user_likes”&state=7F32G5
• My app receives a temporary auth code from the thing’s OAuth server and compares the state
with the one received from the server:



https://myCallbackURL?code=54321&state=7F32G5
A Sample OAuth 2 Workflow
• My company registers the app with the thing’s vendor providing a redirect URI for successful and failed logins
and gets a client id and a secret.
• My company builds an app that uses the thing’s API (e.g. with REST )
• The user opens my app and logs into thing’s vendor site via its authentication server (not the OAuth provider).
• My app (not the browser) generates the unguessable state value and sends the request to the thing vendor’s
OAuth provider:



https://<auth_server>/path?clientid=123&redirect_uri=https//
myCallbackURL&response_type=code&scope=“email user_likes”&state=7F32G5
• My app receives temporary auth code from the thing’s OAuth server and compares the state with the one
received from the server:



https://myCallbackURL?code=54321&state=7F32G5
• ,My app makes another request adding the secret and exchanging the code for the authorization token:



https://<auth_server>/path?clientid=123&client_secret=…&code=54321&redirect_uri=

https//myCallbackURL&grant_type=authorization_code
A Sample OAuth 2 Workflow
• My company registers the app with the thing’s vendor: providing a redirect URI for successful and failed logins
and gets a client id and a secret.
• My company builds an app that uses the thing’s API (e.g. with REST )
• The user opens my app and logs into thing’s vendor site via its authentication server (not the OAuth provider).
• My app (not the browser) generates the unguessable state value and sends the request to the thing vendor’s
OAuth provider:



https://<auth_server>/path?clientid=123&redirect_uri=https//
myCallbackURL&response_type=code&scope=“email user_likes”&state=7F32G5
• My app receives temporary auth code from the thing’s OAuth server and compares the state with the one
received from the server:



https://myCallbackURL?code=54321&state=7F32G5
• ,My app makes another request adding the secret and exchanging the code for the authorization token:



https://<auth_server>/path?clientid=123&client_secret=…&code=54321&redirect_uri=

https//myCallbackURL&grant_type=authorization_code
• The thing’s vendor redirects the user to my app and returns the authorization token.
A Sample OAuth 2 Workflow
• My company registers the app with the thing’s vendor providing a redirect URI for successful and failed logins and
gets a client id and a secret.
• My company builds an app that uses the thing’s API (e.g. with REST )
• The user opens my app and logs into thing’s vendor site via its authentication server (not the OAuth provider).
• My app (not the browser) generates the unguessable state value and sends the request to the thing vendor’s OAuth
provider:



https://<auth_server>/path?clientid=123&redirect_uri=https//myCallbackURL&response_type=code&scope=“email
user_likes”&state=7F32G5
• My app receives temporary auth code from the thing’s OAuth server and compares the state with the one received
from the server:

https://myCallbackURL?code=54321&state=7F32G5
• ,My app makes another request adding the secret and exchanging the code for the authorization token:



https://<auth_server>/path?clientid=123&client_secret=…&code=54321&redirect_uri=

https//myCallbackURL&grant_type=authorization_code
• The thing’s vendor redirects the user to my app and provides the authorization token.
• My app starts invoking the vendor’s API using the token.
Access and Refresh Tokens
• The OAuth 2 server returns the authorization token. It
expires after certain time interval. iHealtLabs sends the
token in JSON format that expires in 10 min.
• The OAuth 2 server also can provide a refresh token that
the client app uses to request a new token instead of the
expired one.
© 2015 Farata Systems
WebSocket Protocol
Bi-directional communication for the Web
© 2015 Farata Systems
HTTP - Request/Response, Half Duplex

WebSocket - Full Duplex
© 2015 Farata Systems
Monitoring AJAX requests
© 2015 Farata Systems
WebSocket Workflow
• Establish connection with the service endpoint
upgrading the protocol from HTTP to WebSocket
• Send messages in both directions at the same time
(Full Duplex)
• Close the connection
© 2015 Farata Systems
Apps for Websockets
• Live trading/auctions/sports notifications
• Controlling medical equipment over the web
• Chat applications
• Multiplayer online games
• Any app that requires a data push from a server
© 2015 Farata Systems
WebSocket Client/Server handshake
• Client sends an UPGRADE HTTP-request
• Server confirms UPGRADE
• Client receives UPGRADE response
• Client setsreadyState=1 on the WebSocket object
© 2015 Farata Systems
The JavaScript Client
if (window.WebSocket) {
ws = new WebSocket("ws://www.websocket.org/echo");
ws.onopen = function() {
console.log("onopen");
};
ws.onmessage = function(e) {
console.log("echo from server : " + e.data);
};
ws.onclose = function() {
console.log("onclose");
};
ws.onerror = function() {
console.log("onerror");
};
} else {
console.log("WebSocket object is not supported");
}
ws.send(“Hello Server”);Sending a request:
© 2015 Farata Systems
Java EE WebSocket Server’s APIs
1. Annotated WebSocket endpoint
Annotate a POJO with @ServerEndpoint, and its methods with
@OnOpen,@OnMessage, @OnError,and @OnClose
2. Programmatic endpoint
Extend your class from javax.websocket.Endpoint and
override onOpen(), onMessage(), onError(), and onClose().
© 2015 Farata Systems
HelloWebSocket Server
@ServerEndpoint("/hello")
public class HelloWebSocket {
@OnOpen
public void greetTheClient(Session session){
try {
session.getBasicRemote().sendText("Hello stranger");
} catch (IOException ioe) {
System.out.println(ioe.getMessage());
}
}
}
The server-side push without client’s requests
A detailed description at http://bit.ly/1DHuKwg
© 2015 Farata Systems
Websockets with Spring Framework
public class WebSocketEndPoint extends TextWebSocketHandler {

private final static Logger LOG =
LoggerFactory.getLogger(WebSocketEndPoint.class);



private Gson gson;

private WebSocketSession currentSession;



@Override

public void afterConnectionEstablished(WebSocketSession session) throws
Exception {

super.afterConnectionEstablished(session);



setCurrentSession(session);

}



public boolean sendMeasurement(Measurement m) {

if (getCurrentSession() != null) {

TextMessage message = new TextMessage(getGson().toJson(m));



try {

getCurrentSession().sendMessage(message);

} catch (IOException e) {

e.printStackTrace();

return false;

}



return true;

} else {

LOG.info("Can not send message, session is not established.");

return false;

}

}

Deploying with Spring Boot
• Java EE REST services are deployed in a WAR under the external Java Server.
• Spring Boot allows creating a standalone app (a JAR) with an embedded servlet container.
• Starting our RESTful server: java -jar MyJar.
• We used Tomcat. To use another server, exclude Tomcat in build configuration and specify
another dependency.
• A sample section from Gradle build replacing Tomcat with Jetty:
dependencies {
compile("org.springframework.boot:spring-boot-starter-web") {
exclude module: "spring-boot-starter-tomcat"
}
compile("org.springframework.boot:spring-boot-starter-jetty")
}
Security
• Device vendors should take security very seriously.
• We don’t deal with security between the thing and its vendor.
• The OAuth state attribute helps ensuring that the received redirect_uri is the
same as provided during the app registration.
• IoT integration apps are as as secure as any other Web app (see owasp.org).
Thank you!
• Farata Systems: faratasystems.com
• email: yfain@faratasystems.com
• Twitter: @yfain
• My blog: yakovfain.com
• My podcast: americhka.us






More Related Content

PDF
Integrating consumers IoT devices into Business Workflow
PDF
Angular 4 for Java Developers
PDF
Angular2 Development for Java developers
PDF
Reactive Thinking in Java with RxJava2
PDF
Web sockets in Angular
PPTX
PDF
Overview of the AngularJS framework
PDF
Using JHipster for generating Angular/Spring Boot apps
Integrating consumers IoT devices into Business Workflow
Angular 4 for Java Developers
Angular2 Development for Java developers
Reactive Thinking in Java with RxJava2
Web sockets in Angular
Overview of the AngularJS framework
Using JHipster for generating Angular/Spring Boot apps

What's hot (20)

PPTX
Introduction to angular with a simple but complete project
PPTX
Introduction to Angular JS
PPTX
AngularJs presentation
PPT
Angular App Presentation
PPTX
Angular 4
PPTX
Angular js 2
PPTX
Angular 4 Introduction Tutorial
PDF
Angular 2 Essential Training
PDF
Seven Versions of One Web Application
PDF
Tech Webinar: Angular 2, Introduction to a new framework
PDF
Type script for_java_dev_jul_2020
PDF
Angular 2: core concepts
PDF
Adding User Management to Node.js
PPTX
Angular elements - embed your angular components EVERYWHERE
ODP
Angularjs
PDF
Angular server side rendering - Strategies & Technics
PDF
Angular 2 - The Next Framework
PDF
ForwardJS 2017 - Fullstack end-to-end Test Automation with node.js
PDF
Top 7 Angular Best Practices to Organize Your Angular App
PDF
How to Implement Basic Angular Routing and Nested Routing With Params in Angu...
Introduction to angular with a simple but complete project
Introduction to Angular JS
AngularJs presentation
Angular App Presentation
Angular 4
Angular js 2
Angular 4 Introduction Tutorial
Angular 2 Essential Training
Seven Versions of One Web Application
Tech Webinar: Angular 2, Introduction to a new framework
Type script for_java_dev_jul_2020
Angular 2: core concepts
Adding User Management to Node.js
Angular elements - embed your angular components EVERYWHERE
Angularjs
Angular server side rendering - Strategies & Technics
Angular 2 - The Next Framework
ForwardJS 2017 - Fullstack end-to-end Test Automation with node.js
Top 7 Angular Best Practices to Organize Your Angular App
How to Implement Basic Angular Routing and Nested Routing With Params in Angu...
Ad

Viewers also liked (20)

PPTX
Fitbit presentation
PDF
Dart for Java Developers
PPT
Cours java smi 2007 2008
PDF
Introduction àJava
PDF
Java(ee) mongo db applications in the cloud
PDF
Messaging for IoT
PDF
Bonnes pratiques des applications java prêtes pour la production
PDF
Intro to JavaScript
PDF
Messaging for IoT
PPTX
AngularJS for Java Developers
PDF
Reactive Thinking in Java
PPT
Hacking Web 2.0 - Defending Ajax and Web Services [HITB 2007 Dubai]
PDF
MQTT – protocol for yours IoT
ODP
Connect to the IoT with a lightweight protocol MQTT
PDF
MQTT 101 - Getting started with the lightweight IoT Protocol
PDF
Protocols for IoT
PDF
M2M Protocol Interoperability using IoT Toolkit
PDF
qsqs-141129025329-conversion-gate01.pdf
PDF
Developing Modern Java Web Applications with Java EE 7 and AngularJS
PDF
MQTT with Java - a protocol for IoT and M2M communication
Fitbit presentation
Dart for Java Developers
Cours java smi 2007 2008
Introduction àJava
Java(ee) mongo db applications in the cloud
Messaging for IoT
Bonnes pratiques des applications java prêtes pour la production
Intro to JavaScript
Messaging for IoT
AngularJS for Java Developers
Reactive Thinking in Java
Hacking Web 2.0 - Defending Ajax and Web Services [HITB 2007 Dubai]
MQTT – protocol for yours IoT
Connect to the IoT with a lightweight protocol MQTT
MQTT 101 - Getting started with the lightweight IoT Protocol
Protocols for IoT
M2M Protocol Interoperability using IoT Toolkit
qsqs-141129025329-conversion-gate01.pdf
Developing Modern Java Web Applications with Java EE 7 and AngularJS
MQTT with Java - a protocol for IoT and M2M communication
Ad

Similar to RESTful services and OAUTH protocol in IoT (20)

PDF
PDF
testupload
PDF
testupload
PDF
testupload
PDF
testupload
PDF
testupload
PDF
testuploadafter
PPTX
Best Practices in Building an API Security Ecosystem
PPTX
Intro to OAuth2 and OpenID Connect
PDF
O auth2.0 guide
PDF
Introduction to OAuth
PDF
Stateless Auth using OAUTH2 & JWT
PDF
Keeping Pace with OAuth’s Evolving Security Practices.pdf
PPTX
API Management and Mobile App Enablement
PDF
Draft Ietf Oauth V2 12
testupload
testupload
testupload
testupload
testupload
testuploadafter
Best Practices in Building an API Security Ecosystem
Intro to OAuth2 and OpenID Connect
O auth2.0 guide
Introduction to OAuth
Stateless Auth using OAUTH2 & JWT
Keeping Pace with OAuth’s Evolving Security Practices.pdf
API Management and Mobile App Enablement
Draft Ietf Oauth V2 12

More from Yakov Fain (12)

PDF
Using JHipster for generating Angular/Spring Boot apps
PDF
TypeScript for Java Developers
PDF
Reactive Streams and RxJava2
PDF
Using JHipster 4 for generating Angular/Spring Boot apps
PDF
Reactive programming in Angular 2
PDF
Angular 2 for Java Developers
PDF
Java Intro: Unit1. Hello World
PDF
Running a Virtual Company
PDF
Princeton jug git_github
PDF
Speed up your Web applications with HTML5 WebSockets
PDF
Surviving as a Professional Software Developer
PDF
Becoming a professional software developer
Using JHipster for generating Angular/Spring Boot apps
TypeScript for Java Developers
Reactive Streams and RxJava2
Using JHipster 4 for generating Angular/Spring Boot apps
Reactive programming in Angular 2
Angular 2 for Java Developers
Java Intro: Unit1. Hello World
Running a Virtual Company
Princeton jug git_github
Speed up your Web applications with HTML5 WebSockets
Surviving as a Professional Software Developer
Becoming a professional software developer

Recently uploaded (20)

PPTX
Digital Literacy And Online Safety on internet
PDF
Paper PDF World Game (s) Great Redesign.pdf
PPTX
SAP Ariba Sourcing PPT for learning material
PDF
Exploring VPS Hosting Trends for SMBs in 2025
PDF
An introduction to the IFRS (ISSB) Stndards.pdf
PPTX
newyork.pptxirantrafgshenepalchinachinane
PPT
FIRE PREVENTION AND CONTROL PLAN- LUS.FM.MQ.OM.UTM.PLN.00014.ppt
PDF
Vigrab.top – Online Tool for Downloading and Converting Social Media Videos a...
PPTX
Introduction to cybersecurity and digital nettiquette
DOC
Rose毕业证学历认证,利物浦约翰摩尔斯大学毕业证国外本科毕业证
PPTX
Introduction to Information and Communication Technology
PDF
Tenda Login Guide: Access Your Router in 5 Easy Steps
PDF
Best Practices for Testing and Debugging Shopify Third-Party API Integrations...
PPTX
Internet___Basics___Styled_ presentation
PDF
Sims 4 Historia para lo sims 4 para jugar
PDF
Smart Home Technology for Health Monitoring (www.kiu.ac.ug)
PPTX
innovation process that make everything different.pptx
PPTX
Module 1 - Cyber Law and Ethics 101.pptx
PPTX
artificial intelligence overview of it and more
DOCX
Unit-3 cyber security network security of internet system
Digital Literacy And Online Safety on internet
Paper PDF World Game (s) Great Redesign.pdf
SAP Ariba Sourcing PPT for learning material
Exploring VPS Hosting Trends for SMBs in 2025
An introduction to the IFRS (ISSB) Stndards.pdf
newyork.pptxirantrafgshenepalchinachinane
FIRE PREVENTION AND CONTROL PLAN- LUS.FM.MQ.OM.UTM.PLN.00014.ppt
Vigrab.top – Online Tool for Downloading and Converting Social Media Videos a...
Introduction to cybersecurity and digital nettiquette
Rose毕业证学历认证,利物浦约翰摩尔斯大学毕业证国外本科毕业证
Introduction to Information and Communication Technology
Tenda Login Guide: Access Your Router in 5 Easy Steps
Best Practices for Testing and Debugging Shopify Third-Party API Integrations...
Internet___Basics___Styled_ presentation
Sims 4 Historia para lo sims 4 para jugar
Smart Home Technology for Health Monitoring (www.kiu.ac.ug)
innovation process that make everything different.pptx
Module 1 - Cyber Law and Ethics 101.pptx
artificial intelligence overview of it and more
Unit-3 cyber security network security of internet system

RESTful services and OAUTH protocol in IoT

  • 1. RESTful services and OAUTH protocol in IoT by Yakov Fain, Farata Systems
  • 2. Farata Systems and SuranceBay surancebay.com faratasystems.com
  • 3. The three parts of this presentation • One approach to integrating consumer devices in the business workflow • Live demo: integrating a blood pressure monitor into a business workflow • A brief review of REST, OAUTH, Websockets and their roles tin our application.
  • 4. Yesterday’s Sensors (Things) • 18 years ago. Telephony. • I’ve been programming IoT!
  • 5. Today’s Sensors
 SCIO: a molecular sensor that scans physical objects and receives instant information to your smartphone. http://www.consumerphysics.com/
  • 6. Tomorrow: Streachable Wearables
 epidermal electronics Source: http://bit.ly/1uu0srr
  • 7. A thing is an app + an API + a Web site.
  • 8. Smartphone
 app Device
 Manufacturer’s
 Server Device A Typical Consumer Device Setup Bluetooth or NFC MQTT, CoAp, … MQTT, CoAp, …
  • 9. Low-Level IoT Approach Learn and implement IoT protocols: MQTT, XMPP, AMQP, CoAp,… Write Java programs for Raspberry Pi or Arduino
 Learn HomeKit and HealthKit from Apple
  • 10. High-Level IoT Approach Create applications using standard technologies to integrate things into an existing business workflow.
  • 11. A Proof of Concept App • Integrate consumer devices into one of the insurance business workflows • Leverage existing software technologies • Create a standard-based application layer that connects things
  • 12. Your Server in the Middle • Create a software layer as a proxy for all communications with IoT devices. • Find the use-cases for data-gathering devices in your business applications. • Collect the valuable data from devices for analisys. Java dominates on the middleware market.
  • 13. The Use Case: Integrating Scale and Blood Pressure Monitor
 into insurance workflow IHealthLabs Blood
 Pressure Monitor Fitbit Scale
 Aria
  • 16. A Typical IoT Workflow XYZ protocol XYZ protocol We’re not dealing with XYZ
 
 Our server communicates with the vendor’s server 
 using HTTPS
 DeviceVendor.com
  • 17. Integrating With Fitbit Scale: Take 1. fitbit.com My Front-End App HTTP/Rest API Weight:
  • 18. Integrating With Fitbit Scale: Take 2. fitbit.com HTTP/Rest API Weight: My Front-End App My Server Polling/Pub-SubData push via WebSocket
  • 19. Integrating With Fitbit and iHealthLabs. fitbit.com Weight: iHealthLabs.com HTTP/
 Rest API Blood Pressure: HTTP/Rest API Data push via WebSocket My Front-End App My Server
  • 20. Adding OAuth Authentication fitbit.com Weight: iHealthLabs.com HTTP/
 Rest API Blood Pressure: HTTP/Rest API My Front-End App My Server Data push via WebSocket Secret, key, tokens from each vendor are here
  • 21. The Final Architecture fitbit.com Weight: iHealthLabs.com HTTP/
 Rest API Blood Pressure: HTTP/Rest API My Front-End App My Server Data push via WebSocket - Vendor’s consumer app Secret, key, tokens from each vendor are here
  • 23. What’s used in our app • RESTful Web services • OAuth authentication and authorization • WebSocket protocol • Front end: written in Dart, deployed as JavaScript • Data exchange format: JSON • Back-end: Java with Spring Boot and embedded Tomcat • Build automation: Gradle
  • 24. © 2015 Farata Systems REST API REpresentational State of Transfer
  • 25. © 2015 Farata Systems HTTP Request and Java EE Rest Endpoint A sample client’s HTTP request: “https://iHealthLabs.com:8443/iotdemo/ihealth/bp"
  • 26. © 2015 Farata Systems HTTP Request and Java EE Rest Endpoint A sample client’s HTTP request: “https://iHealthLabs.com:8443/iotdemo/ihealth/bp" // Configuring The App @ApplicationPath(“iotdemo") public class MyIoTApplication extends Application {
 }
  • 27. © 2015 Farata Systems HTTP Request and Java EE Rest Endpoint // Receiving and handling blood pressure on our server @Path("/ihealth")
 public class BloodPressureService { // … // The method to handle HTTP Get requests @GET @Path("/bp")
 @Produces(“application/json")
 public String getBloodPressureData() { // The code to get bp and prepare JSON goes here 
 return bloodPressure;
 } } A sample client’s HTTP request: “https://iHealthLabs.com:8443/iotdemo/ihealth/bp" // Configuring The App @ApplicationPath(“iotdemo") public class MyIoTApplication extends Application {
 }
  • 28. © 2015 Farata Systems A Rest Endpoint in Spring Framework // The endpoint handling blood pressure @RestController
 @RequestMapping("/ihealth")
 public class HealthLabsController { // … // The method to handle HTTP Get requests @RequestMapping(value="/bp", method = RequestMethod.GET,
 produces = "application/json")
 public Measurement getBloodPressureData() { // The code to get blood pressure goes here 
 return bloodPressure;
 } }
  • 29. OAuth 2 Authorizing an app to act on behalf of the user
  • 30. Authorization and Authentication • Authentication: Is the user who he says he is? • Authorization: Which resources the user can access? The owner of the Blood Pressure Monitor can see only the measurments taken from his device.
  • 31. The OAuth Players • The User • The client app that accesses the user’s resources • The server with the user’s resources (data) • The authorization server
  • 32. Delegating Authorization to 3rd Party Servers
  • 34. OAuth 2 Access Token A client app needs to aquire an access token that can be used on behalf of the user.
  • 35. Typical OAuth 2 Workflows • A client app is located on the user’s device • A client app is located on the server (our use case)
  • 37. A Sample OAuth 2 Workflow • My company registers the app with the thing’s vendor providing a redirect URI for successful and failed logins and gets a client id and a secret.
  • 38. A Sample OAuth 2 Workflow • My company registers the app with the thing’s vendor providing a redirect URI for successful and failed logins and gets a client id and a secret. • My company builds an app that uses the thing’s API (e.g. with REST ).
  • 39. A Sample OAuth 2 Workflow • My company registers the app with the thing’s vendor: providing a redirect URI for successful and failed logins and gets a client id and a secret. • My company builds an app that uses the thing’s API (e.g. with REST ). • The user opens my app and logs into thing’s vendor site via its authentication server (not the OAuth provider).
  • 40. A Sample OAuth 2 Workflow • My company registers the app with the thing’s vendor providing a redirect URI for successful and failed logins and gets a client id and a secret. • My company builds an app that uses the thing’s API (e.g. with REST ) • The user opens my app and logs into thing’s vendor site via its authentication server (not the OAuth provider). • My app (not the browser) generates the unguessable state value and sends the request to the thing vendor’s OAuth provider:
 
 https://<auth_server>/path?clientid=123&redirect_uri=https// myCallbackURL&response_type=code&scope=“email user_likes”&state=7F32G5
  • 41. A Sample OAuth 2 Workflow • My company registers the app with the thing’s vendor providing a redirect URI for successful and failed logins and gets a client id and a secret. • My company builds an app that uses the thing’s API (e.g. with REST ) • The user opens my app and logs into thing’s vendor site via its authentication server (not the OAuth provider). • My app (not the browser) generates the unguessable state value and sends the request to the thing vendor’s OAuth provider:
 
 https://<auth_server>/path?clientid=123&redirect_uri=https// myCallbackURL&response_type=code&scope=“email user_likes”&state=7F32G5 • My app receives a temporary auth code from the thing’s OAuth server and compares the state with the one received from the server:
 
 https://myCallbackURL?code=54321&state=7F32G5
  • 42. A Sample OAuth 2 Workflow • My company registers the app with the thing’s vendor providing a redirect URI for successful and failed logins and gets a client id and a secret. • My company builds an app that uses the thing’s API (e.g. with REST ) • The user opens my app and logs into thing’s vendor site via its authentication server (not the OAuth provider). • My app (not the browser) generates the unguessable state value and sends the request to the thing vendor’s OAuth provider:
 
 https://<auth_server>/path?clientid=123&redirect_uri=https// myCallbackURL&response_type=code&scope=“email user_likes”&state=7F32G5 • My app receives temporary auth code from the thing’s OAuth server and compares the state with the one received from the server:
 
 https://myCallbackURL?code=54321&state=7F32G5 • ,My app makes another request adding the secret and exchanging the code for the authorization token:
 
 https://<auth_server>/path?clientid=123&client_secret=…&code=54321&redirect_uri=
 https//myCallbackURL&grant_type=authorization_code
  • 43. A Sample OAuth 2 Workflow • My company registers the app with the thing’s vendor: providing a redirect URI for successful and failed logins and gets a client id and a secret. • My company builds an app that uses the thing’s API (e.g. with REST ) • The user opens my app and logs into thing’s vendor site via its authentication server (not the OAuth provider). • My app (not the browser) generates the unguessable state value and sends the request to the thing vendor’s OAuth provider:
 
 https://<auth_server>/path?clientid=123&redirect_uri=https// myCallbackURL&response_type=code&scope=“email user_likes”&state=7F32G5 • My app receives temporary auth code from the thing’s OAuth server and compares the state with the one received from the server:
 
 https://myCallbackURL?code=54321&state=7F32G5 • ,My app makes another request adding the secret and exchanging the code for the authorization token:
 
 https://<auth_server>/path?clientid=123&client_secret=…&code=54321&redirect_uri=
 https//myCallbackURL&grant_type=authorization_code • The thing’s vendor redirects the user to my app and returns the authorization token.
  • 44. A Sample OAuth 2 Workflow • My company registers the app with the thing’s vendor providing a redirect URI for successful and failed logins and gets a client id and a secret. • My company builds an app that uses the thing’s API (e.g. with REST ) • The user opens my app and logs into thing’s vendor site via its authentication server (not the OAuth provider). • My app (not the browser) generates the unguessable state value and sends the request to the thing vendor’s OAuth provider:
 
 https://<auth_server>/path?clientid=123&redirect_uri=https//myCallbackURL&response_type=code&scope=“email user_likes”&state=7F32G5 • My app receives temporary auth code from the thing’s OAuth server and compares the state with the one received from the server:
 https://myCallbackURL?code=54321&state=7F32G5 • ,My app makes another request adding the secret and exchanging the code for the authorization token:
 
 https://<auth_server>/path?clientid=123&client_secret=…&code=54321&redirect_uri=
 https//myCallbackURL&grant_type=authorization_code • The thing’s vendor redirects the user to my app and provides the authorization token. • My app starts invoking the vendor’s API using the token.
  • 45. Access and Refresh Tokens • The OAuth 2 server returns the authorization token. It expires after certain time interval. iHealtLabs sends the token in JSON format that expires in 10 min. • The OAuth 2 server also can provide a refresh token that the client app uses to request a new token instead of the expired one.
  • 46. © 2015 Farata Systems WebSocket Protocol Bi-directional communication for the Web
  • 47. © 2015 Farata Systems HTTP - Request/Response, Half Duplex
 WebSocket - Full Duplex
  • 48. © 2015 Farata Systems Monitoring AJAX requests
  • 49. © 2015 Farata Systems WebSocket Workflow • Establish connection with the service endpoint upgrading the protocol from HTTP to WebSocket • Send messages in both directions at the same time (Full Duplex) • Close the connection
  • 50. © 2015 Farata Systems Apps for Websockets • Live trading/auctions/sports notifications • Controlling medical equipment over the web • Chat applications • Multiplayer online games • Any app that requires a data push from a server
  • 51. © 2015 Farata Systems WebSocket Client/Server handshake • Client sends an UPGRADE HTTP-request • Server confirms UPGRADE • Client receives UPGRADE response • Client setsreadyState=1 on the WebSocket object
  • 52. © 2015 Farata Systems The JavaScript Client if (window.WebSocket) { ws = new WebSocket("ws://www.websocket.org/echo"); ws.onopen = function() { console.log("onopen"); }; ws.onmessage = function(e) { console.log("echo from server : " + e.data); }; ws.onclose = function() { console.log("onclose"); }; ws.onerror = function() { console.log("onerror"); }; } else { console.log("WebSocket object is not supported"); } ws.send(“Hello Server”);Sending a request:
  • 53. © 2015 Farata Systems Java EE WebSocket Server’s APIs 1. Annotated WebSocket endpoint Annotate a POJO with @ServerEndpoint, and its methods with @OnOpen,@OnMessage, @OnError,and @OnClose 2. Programmatic endpoint Extend your class from javax.websocket.Endpoint and override onOpen(), onMessage(), onError(), and onClose().
  • 54. © 2015 Farata Systems HelloWebSocket Server @ServerEndpoint("/hello") public class HelloWebSocket { @OnOpen public void greetTheClient(Session session){ try { session.getBasicRemote().sendText("Hello stranger"); } catch (IOException ioe) { System.out.println(ioe.getMessage()); } } } The server-side push without client’s requests A detailed description at http://bit.ly/1DHuKwg
  • 55. © 2015 Farata Systems Websockets with Spring Framework public class WebSocketEndPoint extends TextWebSocketHandler {
 private final static Logger LOG = LoggerFactory.getLogger(WebSocketEndPoint.class);
 
 private Gson gson;
 private WebSocketSession currentSession;
 
 @Override
 public void afterConnectionEstablished(WebSocketSession session) throws Exception {
 super.afterConnectionEstablished(session);
 
 setCurrentSession(session);
 }
 
 public boolean sendMeasurement(Measurement m) {
 if (getCurrentSession() != null) {
 TextMessage message = new TextMessage(getGson().toJson(m));
 
 try {
 getCurrentSession().sendMessage(message);
 } catch (IOException e) {
 e.printStackTrace();
 return false;
 }
 
 return true;
 } else {
 LOG.info("Can not send message, session is not established.");
 return false;
 }
 }

  • 56. Deploying with Spring Boot • Java EE REST services are deployed in a WAR under the external Java Server. • Spring Boot allows creating a standalone app (a JAR) with an embedded servlet container. • Starting our RESTful server: java -jar MyJar. • We used Tomcat. To use another server, exclude Tomcat in build configuration and specify another dependency. • A sample section from Gradle build replacing Tomcat with Jetty: dependencies { compile("org.springframework.boot:spring-boot-starter-web") { exclude module: "spring-boot-starter-tomcat" } compile("org.springframework.boot:spring-boot-starter-jetty") }
  • 57. Security • Device vendors should take security very seriously. • We don’t deal with security between the thing and its vendor. • The OAuth state attribute helps ensuring that the received redirect_uri is the same as provided during the app registration. • IoT integration apps are as as secure as any other Web app (see owasp.org).
  • 58. Thank you! • Farata Systems: faratasystems.com • email: [email protected] • Twitter: @yfain • My blog: yakovfain.com • My podcast: americhka.us