You are on page 1of 17

Sistema centralizado de autenticacin/autorizacin a travs de terceros!

OAuth"
Ingeniera de Sistemas de Informacin! Grado en Ingeniera en Tecnologas de Telecomunicacin" GSyC"

# 2012 Departamento GSyC, URJC"


#Algunos derechos reservados. Este trabajo se distribuye bajo la licencia Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License" #2012 Armando Armando Fox & David Patterson"
# Licensed under Creative Commons AttributionNonCommercial-ShareAlike 3.0 Unported License"

GSyC"

2"

Sistema centralizado de autenticacin/autorizacin! a travs de terceros! OAuth! (ELLS 7.2)"

Autenticacin / Autorizacin "


# Autenticacin: prueba que eres quien dices ser"
# Usuarios: Nombre de usuario + password secreta" # Servidores: con certicado criptogrco rmado por una tercera parte de conanza"

# Autorizacin: prueba que tienes permiso para hacer lo que ests pidiendo"
# te tiene registrado el sistema como usuario con ciertos privilegios?" # posees un token o una capability que te habilita para hacer algo?"

GSyC"

4"

Web 1.0 "


# Cada sitio mantiene sus propias passwords" # Muchos sitios no tienen APIs RESTful, por lo que tenas que identicarte (log in)" # No funciona con SOA"
# No puedes introducir interactivamente tu nombre de usuario y password en cada servicio, cada vez que lo usas"

# Solucin deseable: single-sign-on (SSO)"


# Me autentico en un sitio en el que obtengo unas credenciales que utilizo para identicarme ante los dems" # Pero no quieres revelar al servicio B toda la info que tiene de ti el sitio A, en particular la password!
GSyC" 5"

Autenticacin mediante terceras partes "


# El servicio A conoce algo acerca de tu identidad" # Te autenticas ante el servicio A, donde obtienes unas credenciales" # Quieres aprovechar que ya te has autenticado ante el servicio A para acceder al servicio B, pero sin revelar las credenciales obtenidas en el Servicio A"
# Ejemplo de servicio B: aplicaciones Web como The New York Times o myrottenpotatoes"

# Servicio A: proveedor de autenticacin (aunque puede adems proporcionar otros servicios)"


# Auth only: OpenID, Kerberos"

# Auth + otros servicios: OAuth2 "


# Se puede utilizar con proveedores de autenticacin como Twitter, Facebook, Google Apps, Microsoft Live, FourSquare, Paypal, Instagram, Netix, GitHub, Soundcloud, "
GSyC" 6"

Token seguro e inviolable en OAuth2 "


# La seguridad se basa en un Token seguro inviolable que genera el proveedor (servicio A) para cada pareja usuario / aplicacin (servicio B)! # Usando tcnicas criptogrcas el proveedor puede generar un string que:"
# Slo el proveedor puede descrifrar" # Puede detectar si ha sido alterado (tamper evident)" # Nadie que no conozca la clave privada que guarda el proveedor para cada usuario puede haber creado ese string"

# Habitualmente el string slo contiene un handle a la info interesante que almaceno en el servidor"
# Si el proveedor recibe el string s que puedo conar en el handle"

# El token tiene caducidad y se puede renovar"


GSyC" 7"

OAuth2 con Twitter y MyRottenPotatoes "

1. Login con Twitter de Sancho Panza

2. Redireccin a la pgina de login de Twitter

3. Te fas de RottenPotatoes?

MyRottenPotatoes

GSyC"

8"

Autenticacin mediante terceras partes con Twitter y RottenPotatoes "

7. Bienvenido, Sancho Panza


5. Redireccin a pgina callback de MyRottenPotatoespage pasndole el token de acceso

4. S, puedes darle mi info personal

MyRottenPotatoes

6. Aqu te paso un token que prueba que tengo permiso para acceder a la info personal de este usuario, dmela (nombre y apellidos p.ej.)
GSyC" 9"

Implementacin con RoR "


# Creamos un nuevo modelo, moviegoer, y una tabla, moviegoers, para representar a un usuario de nuestra app"
# Almacena las credenciales obtenidas por el usuario en twitter (u otros proveedores) cuando se ha autenticado. Credenciales == provider(twitter), id en twitter, nombre en twitter"

# Creamos un nuevo controlador de sesiones"


# El controlador gestiona la creacin y eliminacin de la sesin de los usuarios, e interacta con el proveedor de autenticacin"

# Una vez se haya autenticado un usuario, el usuario mantiene una sesin activa"
# Activa == mientras que en session[:user_id] est su clava primaria en la tabla moviegoers no le hacemos autenticarse en cada interaccin con nuestro servidor"

# Cuando hace logout eliminamos su sesin"


# delete session.delete(:user_id)"

# Usaremos la gema OmniAuth para interactuar con proveedores de autenticacin (twitter)"


# ayuda proporcionando una API comn para diferentes strategies (proveedores de autenticacin como Twitter, Facebook,)"
GSyC" 10"

Ejemplo de uso de proveedor de autenticacin twitter con la aplicacin myrottenpotatoes! (ELLS 7.2)"

Creamos aplicacin en twitter "


# Da de alta tu aplicacin myrottenpotatoes en twitter:
https://dev.twitter.com/apps/new" # Si no tienes cuenta en twitter crala antes desde esa misma pgina "

# Puedes seleccionar lo que la app podr saber de la identidad de un usuario de twitter" # Tienes que decir la url de tu aplicacin a la que twitter tiene que redirigir al navegador en el paso 5 de la interaccin entre twitter y tu aplicacin: "
# http://zeta07.aulas.gsyc.es:3000/auth/twitter/callback ! # http://XXX.herokuapp.com/auth/twitter/callback

# Fjate en el consumer key y comsumer secret que te genera, los necesitas para congurar la gema omniauth
GSyC" 12"

Conguramos la gema OmniAuth "


# Aadimos gema a Gemle y corremos bundle install:"
'gem omniauth-twitter # las hay para facebook,

# Conguramos gema con consumer_key y consumer_secret obtenidos en twitter, en el chero


config/initializers/omniauth.rb
Rails.application.config.middleware.use OmniAuth::Builder do provider :twitter, "consumer_key", "consumer_secret end

# Creamos en config/routes.rb rutas de acciones para SessionsController"


match 'auth/:provider/callback' => 'sessions#create' match '/logout' => 'sessions#destroy' match '/login' => 'sessions#login'

GSyC"

13"

Aadimos modelo para moviegoer


Creamos el modelo y la migracin: Corremos rake db:migrate:
rake db:migrate
rails generate model Moviegoer name:string provider:string uid:string

Editamos el modelo:
# Edit app/models/moviegoer.rb to look like this: class Moviegoer < ActiveRecord::Base include ActiveModel::MassAssignmentSecurity attr_accessible :uid, :provider, :name def self.create_with_omniauth(auth) Moviegoer.create!( :provider => auth["provider"], :uid => auth["uid"], :name => auth["info"]["name"]) end end
GSyC"

http://pastebin.com/emF90DDN
14"

Filtro para forzar a que se autentique el usuario que no tenga una sesin activa "
Filtro aplicable a toda accin de la aplicacin:
class ApplicationController < ActionController::Base protect_from_forgery before_filter :set_current_user, :except => 'login' protected # prevents method from being invoked by a route def set_current_user # we exploit the fact that find_by_id(nil) returns nil @current_user ||= Moviegoer.find_by_id(session[:user_id]) redirect_to '/login' and return unless @current_user end end

http://pastebin.com/jQxxUzps

Si no tiene una sesin activa ( == no est su :user_id en session[]) tiene que autenticarse en twitter, para lo cul le redirigimos a la pgina de login
GSyC" 15"

Controlador SessionController
Create es la accin a la que twitter Redirige al browser en el paso 5, en la que recibimos el token class SessionsController < ApplicationController # user shouldn't have to be logged in before logging in! skip_before_filter :set_current_user def create auth = request.env["omniauth.auth"] user = Moviegoer.find_by_provider_and_uid(auth["provider"], auth["uid"]) || Moviegoer.create_with_omniauth(auth) session[:user_id] = user.id redirect_to movies_path end def destroy session.delete(:user_id) flash[:notice] = 'Logged out successfully.' redirect_to movies_path end def login end end GSyC"

http://pastebin.com/jQxxUzps

16"

En app/views/layouts/application.html.haml
!!! 5 %html %head %title Rotten Potatoes! = stylesheet_link_tag 'application' = javascript_include_tag 'application' = csrf_meta_tags %body - if flash[:notice] #notice.message= flash[:notice] - elsif flash[:warning] #warning.message= flash[:warning]

Vista(s) de login "

= render :partial => 'sessions/login


= yield

http://pastebin.com/zJ6gP2GD

sessions/_login.html.haml
#login http://pastebin.com/jQxxUzps - if @current_user %p.welcome Welcome, #{@current_user.name}! = link_to 'Log Out', logout_path - else %p.login= link_to 'Log in with your Twitter account', '/auth/twitter? force_login=true'

touch sessions/login.html.haml
GSyC" 17"

You might also like