菜鸟教程小白 发表于 2022-12-13 00:39:44

ios - 使用 Devise 通过 iOS 应用注册、登录和退出


                                            <p><p>我有一个非常基本的 Rails 应用程序,它使用 Devise 进行用户注册、登录等。我想向 iOS 应用程序公开 Devise。有很多线程是高级解释,但我对 Rails 很陌生。我基本上是向 users/sign_up 发布请求,如下所示:</p>

<pre><code>AFHTTPClient *client = ];
//;
;
NSDictionary *params = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:
                                                            @&#34;[email protected]&#34;,
                                                            @&#34;testtest&#34;,
                                                            @&#34;testtest&#34;,
                                                            nil]
                                                   forKeys:[NSArray arrayWithObjects:
                                                            @&#34;email&#34;,
                                                            @&#34;password&#34;,
                                                            @&#34;password_confirmation&#34;,
                                                            nil]];

];
NSURLRequest *request = ;
AFHTTPRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
    NSLog(@&#34;%@&#34;, JSON);
    NSLog(@&#34;%@&#34;, );
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
}];

];
;
</code></pre>

<p>当我收到 200 OK 时,这似乎在 iOS 端进行:</p>

<pre><code>   2013-01-21 13:38:00.412 Starfish I
restkit.network:RKHTTPRequestOperation.m:152 GET &#39;http://localhost:5000/signup?password=testtest&amp;password_confirmation=testtest&amp;email=first.last%40gmail.com&#39;
2013-01-21 13:38:01.073 Starfish (null)
2013-01-21 13:38:01.073 Starfish I restkit.network:RKHTTPRequestOperation.m:179 GET &#39;http://localhost:5000/signup?password=testtest&amp;password_confirmation=testtest&amp;email=first.last%40gmail.com&#39; (200 OK)
2013-01-21 13:38:01.074 Starfish {
    &#34;Cache-Control&#34; = &#34;max-age=0, private, must-revalidate&#34;;
    Connection = close;
    &#34;Content-Type&#34; = &#34;text/html; charset=utf-8&#34;;
    Etag = &#34;\&#34;5dfe88700e41a015a8f524850446e327\&#34;&#34;;
    Server = &#34;thin 1.5.0 codename Knife&#34;;
    &#34;Set-Cookie&#34; = &#34;_geo-photo_session=BAh7B0kiD3Nlc3Npb25faWQGOgZFRkkiJTEyZTJjMjFkZjAwZGZlMWIzMTJmNTg5ODNkNjM5OGI0BjsAVEkiEF9jc3JmX3Rva2VuBjsARkkiMTN4eUZGUzVhb1pIdXc1QlJJUnBxSFVrZmYvUDdpeGtaeklxNGhOejFOeEk9BjsARg%3D%3D--5130edc939facbe7004570141c069d40f5f7feca; path=/; HttpOnly&#34;;
    &#34;X-Request-Id&#34; = a2480798afed4e7aca17f3f1e2d3d44d;
    &#34;X-Runtime&#34; = &#34;0.219984&#34;;
    &#34;X-UA-Compatible&#34; = &#34;IE=Edge&#34;;
}
</code></pre>

<p>在 Rails 方面:</p>

<pre><code>Started GET &#34;/signup?password=&amp;password_confirmation=&amp;email=first.last%40gmail.com&#34; for 127.0.0.1 at 2013-01-21 13:38:00 -0800
13:43:15 web.1| Processing by Devise::RegistrationsController#new as */*
13:43:15 web.1|   Parameters: {&#34;password&#34;=&gt;&#34;&#34;, &#34;password_confirmation&#34;=&gt;&#34;&#34;, &#34;email&#34;=&gt;&#34;[email protected]&#34;}
13:43:15 web.1|   Rendered devise/shared/_links.erb (2.1ms)
13:43:15 web.1|   Rendered devise/registrations/new.html.erb within layouts/application (23.7ms)
13:43:15 web.1| Completed 200 OK in 142ms (Views: 64.9ms | ActiveRecord: 6.9ms)
</code></pre>

<p>开箱即用注册:</p>

<pre><code>&lt;h2&gt;Sign up&lt;/h2&gt;

&lt;%= form_for(resource, :as =&gt; resource_name, :url =&gt; registration_path(resource_name)) do |f| %&gt;
&lt;%= devise_error_messages! %&gt;

&lt;div&gt;&lt;%= f.label :email %&gt;&lt;br /&gt;
&lt;%= f.email_field :email, :autofocus =&gt; true %&gt;&lt;/div&gt;

&lt;div&gt;&lt;%= f.label :password %&gt;&lt;br /&gt;
&lt;%= f.password_field :password %&gt;&lt;/div&gt;

&lt;div&gt;&lt;%= f.label :password_confirmation %&gt;&lt;br /&gt;
&lt;%= f.password_field :password_confirmation %&gt;&lt;/div&gt;

&lt;div&gt;&lt;%= f.submit &#34;Sign up&#34; %&gt;&lt;/div&gt;
&lt;% end %&gt;

&lt;%= render &#34;devise/shared/links&#34; %&gt;
</code></pre>

<p>我不知道 Rails 足以解决的问题是我不希望呈现任何 View 。我只是想将注册或登录凭据作为 JSON 对象传递并接收用户已创建或登录的验证。我上面的内容不是创建用户,因为它正在尝试呈现 View 。任何帮助将不胜感激。谢谢。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>我正在做类似的事情,到目前为止,它的注册部分通过 CURL 使用 JSON(应该很容易转换为 iOS)以及通过浏览器工作。使用 <a href="https://stackoverflow.com/questions/14792746/create-a-user-account-with-devise-via-a-native-ios-app" title="this answer" rel="noreferrer noopener nofollow">this answer</a> 的修改来自 <a href="https://stackoverflow.com/users/1025520/neverbe" rel="noreferrer noopener nofollow">NeverBe</a> :</p>

<p>我修改了 <strong>config/initializers/devise.rb</strong> 并添加了这一行:</p>

<pre><code>config.navigational_formats = [&#34;*/*&#34;, &#34;/&#34;, :html, :json]
</code></pre>

<hr/>

<p>我修改了 <strong>config/routes.rb</strong> 并替换了这一行:</p>

<pre><code>devise_for :users
</code></pre>

<p>用这一行:</p>

<pre><code>devise_for :users, :controllers =&gt; {:registrations =&gt; &#34;registrations&#34;}
</code></pre>

<hr/>

<p>我创建了一个新文件 <strong>app/controllers/registrations_controller.rb</strong></p>

<pre><code>class RegistrationsController &lt; Devise::RegistrationsController

def create
    respond_to do |format|
      format.html {
      super
      }
      format.json {
      if params[:user][:email].nil?
          render :status =&gt; 400,
               :json =&gt; {:message =&gt; &#39;User request must contain the user email.&#39;}
          return
      elsif params[:user][:password].nil?
          render :status =&gt; 400,
               :json =&gt; {:message =&gt; &#39;User request must contain the user password.&#39;}
          return
      end

      if params[:user][:email]
          duplicate_user = User.find_by_email(params[:user][:email])
          unless duplicate_user.nil?
            render :status =&gt; 409,
                   :json =&gt; {:message =&gt; &#39;Duplicate email. A user already exists with that email address.&#39;}
            return
          end
      end

      @user = User.create(params[:user])

      if @user.save
          render :json =&gt; {:user =&gt; @user}
      else
          render :status =&gt; 400,
               :json =&gt; {:message =&gt; @user.errors.full_messages}
      end
      }
    end
end
end
</code></pre>

<p>附加说明:即使没有所有自定义错误处理代码,您仍然可以获得错误处理,但我想返回状态代码错误(400 和 409)而不是带有自定义错误消息的 200,这是我从默认设计中得到的行为。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 使用 Devise 通过 iOS 应用注册、登录和退出,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/14447835/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/14447835/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 使用 Devise 通过 iOS 应用注册、登录和退出