GoogleAppEngine_AuthSample

GoogleAppEngine_AuthSample

概要

Googleアカウントで認証を行うサンプル。

erbを使ってテンプレートを作ったり、login/logoutを付け加える。

コメントとテンプレートの日本語化。

全体作業

# 作業ディレクトリに移動
cd gae_work/
# ディレクトリを作成
mkdir googleauth
# ディレクトリに移動
cd googleauth
# 設定ファイルを作成
vi Gemfile
# 設定ファイルを作成
vi config.ru
# プログラムを作成
vi googleauth.rb
# view用のフォルダを作成
mkdir views
# viewの作成(erb形式)
vi views/index.erb
# ローカルで実行
dev_appserver.rb --address=0.0.0.0 .

設定ファイルを作成

vi Gemfile

# Critical default settings:
disable_system_gems
disable_rubygems
bundle_path ".gems/bundler_gems"

# List gems to bundle here:
gem "dm-appengine"
gem "appengine-apis"
gem "sinatra"

vi config.ru

require 'appengine-rack'
AppEngine::Rack.configure_app(
  :application => 'hogehoge',
  :version => 1)
require 'googleauth'
run Sinatra::Application

プログラムを作成

vi googleauth.rb

require 'sinatra'
require 'dm-core'
require 'appengine-apis/users'

# DataMapperの初期設定
DataMapper.setup(:default, "appengine://auto")

# escape_htmlのエイリアスの設定
helpers do
  include Rack::Utils
  alias_method :h, :escape_html
end

# model class のプロパティ定義
class Greeting
  include DataMapper::Resource
  property :id, Serial          # DataMapperに必須
  property :author, User        # User認証に必須
  property :content, Text
  property :date, Time, :default => lambda { |r,p| Time.now } # must be a Proc
end

get '/' do
  # Googleアカウントのユーザー情報の取得
  @user = AppEngine::Users.current_user

  # DBから最新の10件を取得
  @greetings = Greeting.all(:order => [:date.desc], :limit => 10)
  
  # 画面の表示
  erb :index
end

get '/login' do
  # Googleアカウントログイン画面へリダイレクト
  # (ログイン画面の後に、'/'に移動)
  redirect AppEngine::Users.create_login_url('/') 
end

get '/logout' do
  # Googleアカウントをログオフし、'/'に移動
  redirect AppEngine::Users.create_logout_url('/') 
end


post '/sign' do
  # Postされた"content"から新しいレコードを作成
  greeting = Greeting.new(:content => params[:content])

  # Googleアカウントでログインしていれば、ユーザ名をレコードに設定
  if AppEngine::Users.current_user
    greeting.author = AppEngine::Users.current_user
  end

  # レコードを保存する
  greeting.save

  # '/'に移動
  redirect '/'
end

viewの作成(erb形式)

vi views/index.erb

<div>
<% if @user %>
ようこそ! <%= @user.nickname %> / <a href="/logout">ログアウト</a>
<% else %>
<a href="/login">ログイン</a>
<% end %>
</div>

<form method=post action=/sign>
<p><textarea name=content rows=3 cols=20></textarea></p>
<p><input type=submit value="登録"></p>
</form>

<% @greetings.each do |greeting| %>

<p>
名前:
<% if greeting.author %>
<%=h greeting.author.nickname %>
<% else %>
匿名さん
<% end %>
</p>

<p>
日付:<%= greeting.date.strftime("%Y/%m/%d(%a) %H:%M") %>
</p>

<q><%=h greeting.content %></q>

<% end %>