OSDN Git Service

I want be able to get token via api. Used for mobile applications
authorDmitriy Zaporozhets <dzaporozhets@sphereconsultinginc.com>
Thu, 20 Sep 2012 14:44:44 +0000 (17:44 +0300)
committerDmitriy Zaporozhets <dzaporozhets@sphereconsultinginc.com>
Thu, 20 Sep 2012 14:45:07 +0000 (17:45 +0300)
doc/api/README.md
doc/api/session.md [new file with mode: 0644]
lib/api.rb
lib/api/entities.rb
lib/api/session.rb [new file with mode: 0644]
spec/requests/api/session_spec.rb [new file with mode: 0644]

index 9741072..443ec7b 100644 (file)
@@ -30,6 +30,7 @@ When listing resources you can pass the following parameters:
 ## Contents
 
 + [Users](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/users.md)
++ [Session](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/session.md)
 + [Projects](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/projects.md)
 + [Snippets](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/snippets.md)
 + [Issues](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/issues.md)
diff --git a/doc/api/session.md b/doc/api/session.md
new file mode 100644 (file)
index 0000000..9fdbeb4
--- /dev/null
@@ -0,0 +1,22 @@
+Login to get private token
+
+```
+POST /session
+```
+
+Parameters:
+
++ `email` (required) - The email of user
++ `password` (required) - Valid password
+
+
+```json
+{
+  "id": 1,
+  "email": "john@example.com",
+  "name": "John Smith",
+  "private_token": "dd34asd13as",
+  "created_at": "2012-05-23T08:00:58Z",
+  "blocked": true
+}
+```
index 37e0384..3b62f31 100644 (file)
@@ -18,5 +18,6 @@ module Gitlab
     mount Issues
     mount Milestones
     mount Keys
+    mount Session
   end
 end
index 6241fc8..5d8cc27 100644 (file)
@@ -9,6 +9,10 @@ module Gitlab
       expose :id, :email, :name, :blocked, :created_at
     end
 
+    class UserLogin < Grape::Entity
+      expose :id, :email, :name, :private_token, :blocked, :created_at
+    end
+
     class Hook < Grape::Entity
       expose :id, :url
     end
@@ -52,8 +56,8 @@ module Gitlab
     end
 
     class Key < Grape::Entity
-      expose  :id, 
-              :title, 
+      expose  :id,
+              :title,
               :key
     end
   end
diff --git a/lib/api/session.rb b/lib/api/session.rb
new file mode 100644 (file)
index 0000000..5bcdf93
--- /dev/null
@@ -0,0 +1,21 @@
+module Gitlab
+  # Users API
+  class Session < Grape::API
+    # Login to get token
+    #
+    # Example Request:
+    #  POST /session
+    post "/session" do
+      resource = User.find_for_database_authentication(email: params[:email])
+
+      return forbidden! unless resource
+
+      if resource.valid_password?(params[:password])
+        present resource, with: Entities::UserLogin
+      else
+        forbidden!
+      end
+    end
+  end
+end
+
diff --git a/spec/requests/api/session_spec.rb b/spec/requests/api/session_spec.rb
new file mode 100644 (file)
index 0000000..0809475
--- /dev/null
@@ -0,0 +1,39 @@
+require 'spec_helper'
+
+describe Gitlab::API do
+  include ApiHelpers
+
+  let(:user) { Factory :user }
+
+  describe "POST /session" do
+    context "when valid password" do
+      it "should return private token" do
+        post api("/session"), email: user.email, password: '123456'
+        response.status.should == 201
+
+        json_response['email'].should == user.email
+        json_response['private_token'].should == user.private_token
+      end
+    end
+
+    context "when invalid password" do
+      it "should return authentication error" do
+        post api("/session"), email: user.email, password: '123'
+        response.status.should == 403
+
+        json_response['email'].should be_nil
+        json_response['private_token'].should be_nil
+      end
+    end
+
+    context "when empty password" do
+      it "should return authentication error" do
+        post api("/session"), email: user.email
+        response.status.should == 403
+
+        json_response['email'].should be_nil
+        json_response['private_token'].should be_nil
+      end
+    end
+  end
+end