<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>neilalaer (neilalaer)</title>
    <link>https://ruby-china.org/neilalaer</link>
    <description/>
    <language>en-us</language>
    <item>
      <title>[已解决] 使用 omniauth-weibo-oauth2 的问题</title>
      <description>&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt;
从日志中可以看到&lt;code&gt;(weibo) Callback phase initiated&lt;/code&gt;出现了两次;另外，终端中打印输出 omniauth 代码 strategy.rb 中的 auth_hash，其实已经能看到明文的 access token，说明第二次 callback 是多余的并且很可能是产生错误的原因，在“如何去掉第二次 callback”上花了不少时间，无果。&lt;/p&gt;

&lt;p&gt;最后发现，因为参考了不同的网上教程，分别在 config/initializers/devise.rb 和 config/initializer/omniauth.rb 中两次填写了同一个 provider.&lt;/p&gt;

&lt;p&gt;为什么 omniauth gem 的机制不是覆盖同名 provider，而是创建两个实例呢？&lt;/p&gt;

&lt;p&gt;Hinted by: &lt;a href="http://goo.gl/bcKMO" rel="nofollow" target="_blank"&gt;http://goo.gl/bcKMO&lt;/a&gt;&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt;
针对 (error:redirect_uri_mismatch) 的问题，新浪论坛&lt;a href="http://forum.open.weibo.com/thread.php?fid=5" rel="nofollow" target="_blank"&gt;http://forum.open.weibo.com/thread.php?fid=5&lt;/a&gt; 里的大多碰到同样问题，其实新浪服务器端需要&lt;strong&gt;完全匹配&lt;/strong&gt;完整的 URI，比如：少了“www”不行；本地环境必须以"127.0.0.1 访问"(新浪应用控制台中的“应用信息”－&amp;gt;"高级信息"中的"授权回调页"框不接受“localhost”)。&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;&lt;strong&gt;碰到的情况&lt;/strong&gt;
参考了 devise 的文档&lt;a href="http://goo.gl/5HgXj" rel="nofollow" target="_blank"&gt;http://goo.gl/5HgXj&lt;/a&gt; 所述步骤 (auth 相关)，使用 omniauth-weibo-oauth2 gem，总是碰到以下错误，无法进入授权页面。
&lt;code&gt;‘你所访问的站点在新浪微博的认证失败，...(error:redirect_uri_mismatch)’&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;地址栏信息为
&lt;code&gt;https://api.weibo.com/oauth2/authorize?response_type=code&amp;amp;client_id=342xxxxxx &amp;amp;redirect_uri=http%3A%2F%2Flocalhost%3A3000%2Fusers%2Fauth%2Fweibo%2Fcallback&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;网站应用，“应用信息-&amp;gt;高级信息”-&amp;gt;"OAuth2.0 授权设置"中的信息
&lt;code&gt;授权回调页：http://127.0.0.1:3000/users/auth/weibo/callback&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;参考了 devise 的文档&lt;a href="http://goo.gl/5HgXj" rel="nofollow" target="_blank"&gt;http://goo.gl/5HgXj&lt;/a&gt;
&lt;code&gt;user_omniauth_callback_path(:weibo) 确实为 http://localhost:3000/users/auth/weibo/calback&lt;/code&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;我的问题&lt;/strong&gt;
请问，哪里的信息不对？应该如何配置？   &lt;/p&gt;</description>
      <author>neilalaer</author>
      <pubDate>Fri, 25 May 2012 10:54:24 +0800</pubDate>
      <link>https://ruby-china.org/topics/3487</link>
      <guid>https://ruby-china.org/topics/3487</guid>
    </item>
    <item>
      <title>[不再处理] 关于 ‘weibo 登陆的相关 gems 和使用方法’ 的问题</title>
      <description>&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;
使用 omniauth-weibo-oauth2 gem，仍在尝试中。&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt; ( aborted!)
根据新形势下的认证服务 omniauth 的安排，对于 weibo 登陆需求（oauth 版本，不是 oauth2）的功能，可以使用 omniauth-weibo.不再打算使用旧版本。&lt;/p&gt;

&lt;p&gt;参考步骤：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gemfile 中指定"gem 'omniauth-weibo', :git =&amp;gt; '&lt;a href="https://github.com/ballantyne/omniauth-weibo.git" rel="nofollow" target="_blank"&gt;https://github.com/ballantyne/omniauth-weibo.git&lt;/a&gt;'"&lt;/li&gt;
&lt;li&gt;按照文档&lt;a href="https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview" rel="nofollow" target="_blank"&gt;https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview&lt;/a&gt; 进行配置。&lt;/li&gt;
&lt;/ul&gt;

&lt;hr&gt;

&lt;p&gt;在下想通过 omniauth gems 来访问新浪微博的数据接口。有个问题没有解决，希望能得到一些提示。先谢谢了。两个问题如下，&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;问题一：是否配置正确，或者使用正确的 rubygems, 下面 ArgumentError 是什么原因呢？&lt;/strong&gt;
&lt;strong&gt;Gemfile 中相关的 gems&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;'omniauth'&lt;/span&gt;
&lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;'oa-oauth'&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&amp;gt;＝ 0.3.2'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;config\initializers\omniauth.rb&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'oa-oauth'&lt;/span&gt;
&lt;span class="no"&gt;Rails&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;application&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;middleware&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt; &lt;span class="no"&gt;OmniAuth&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Builder&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;span class="n"&gt;provider&lt;/span&gt; &lt;span class="ss"&gt;:tsina&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;APPKEY&amp;gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;APP_SECRET&amp;gt;'&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;报错信息&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ArgumentError &lt;span class="o"&gt;(&lt;/span&gt;Received wrong number of arguments. &lt;span class="o"&gt;[&lt;/span&gt;:tsina, &lt;span class="s2"&gt;"&amp;lt;APP_KEY&amp;gt;"&lt;/span&gt;, &lt;span class="s2"&gt;"&amp;lt;APP_SECRET&amp;gt;"&lt;/span&gt;, &lt;span class="o"&gt;{&lt;/span&gt;:site&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"http://api.t.sina.com.cn"&lt;/span&gt;, :request_token_path&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"/oauth/request_token"&lt;/span&gt;, :access_token_path&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"/oauth/access_token"&lt;/span&gt;, :authorize_path&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"/oauth/authorize"&lt;/span&gt;, :realm&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"OmniAuth"&lt;/span&gt;&lt;span class="o"&gt;}])&lt;/span&gt;:
  omniauth &lt;span class="o"&gt;(&lt;/span&gt;1.1.0&lt;span class="o"&gt;)&lt;/span&gt; lib/omniauth/strategy.rb:145:in &lt;span class="sb"&gt;`&lt;/span&gt;initialize&lt;span class="s1"&gt;'
  oa-oauth (0.2.6) lib/omniauth/strategies/oauth.rb:14:in `initialize'&lt;/span&gt;
  omniauth_china &lt;span class="o"&gt;(&lt;/span&gt;0.1.1&lt;span class="o"&gt;)&lt;/span&gt; lib/omniauth_china/strategies/tsina.rb:27:in &lt;span class="sb"&gt;`&lt;/span&gt;initialize&lt;span class="s1"&gt;'
  rack (1.4.1) lib/rack/builder.rb:82:in `new'&lt;/span&gt;
  rack &lt;span class="o"&gt;(&lt;/span&gt;1.4.1&lt;span class="o"&gt;)&lt;/span&gt; lib/rack/builder.rb:82:in &lt;span class="sb"&gt;`&lt;/span&gt;block &lt;span class="k"&gt;in &lt;/span&gt;use&lt;span class="s1"&gt;'
  rack (1.4.1) lib/rack/builder.rb:130:in `[]'&lt;/span&gt;
  rack &lt;span class="o"&gt;(&lt;/span&gt;1.4.1&lt;span class="o"&gt;)&lt;/span&gt; lib/rack/builder.rb:130:in &lt;span class="sb"&gt;`&lt;/span&gt;block &lt;span class="k"&gt;in &lt;/span&gt;to_app&lt;span class="s1"&gt;'
  rack (1.4.1) lib/rack/builder.rb:130:in `each'&lt;/span&gt;
  rack &lt;span class="o"&gt;(&lt;/span&gt;1.4.1&lt;span class="o"&gt;)&lt;/span&gt; lib/rack/builder.rb:130:in &lt;span class="sb"&gt;`&lt;/span&gt;inject&lt;span class="s1"&gt;'
  rack (1.4.1) lib/rack/builder.rb:130:in `to_app'&lt;/span&gt;
  omniauth &lt;span class="o"&gt;(&lt;/span&gt;1.1.0&lt;span class="o"&gt;)&lt;/span&gt; lib/omniauth/builder.rb:48:in &lt;span class="sb"&gt;`&lt;/span&gt;call&lt;span class="s1"&gt;'
  mongoid (2.4.10) lib/rack/mongoid/middleware/identity_map.rb:33:in `block in call'&lt;/span&gt;
...... &amp;lt;omitted&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;问题二：报错信息显示 omniauth 抛出异常错误，但是没看懂相关代码，求解释。问题键代码注释标识 Q:&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# https://github.com/intridea/omniauth/blob/master/lib/omniauth/strategy.rb line 124 to line 139&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="vi"&gt;@app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;
      &lt;span class="vi"&gt;@options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;class&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;default_options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dup&lt;/span&gt;

      &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;deep_merge!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;last&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;is_a?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;Hash&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;#Q: args有6个参数，此处处理入参数组末尾的一个元素。&lt;/span&gt;
      &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;name&lt;/span&gt; &lt;span class="o"&gt;||=&lt;/span&gt; &lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;class&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'::'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;last&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;downcase&lt;/span&gt;

      &lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;class&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;arg&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;     &lt;span class="c1"&gt;# Q: self.class.args 调用类方法，约line 81，但最后返回的是空数组；为什么不是这样`self.class.args(args).each do |arg|; ...;end`调用?&lt;/span&gt;
        &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;shift&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;

      &lt;span class="c1"&gt;# Make sure that all of the args have been dealt with, otherwise error out.&lt;/span&gt;
      &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="no"&gt;ArgumentError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Received wrong number of arguments. &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;inspect&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="k"&gt;unless&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;empty?&lt;/span&gt;  &lt;span class="c1"&gt;#其他还有5个入参是怎么处理的？&lt;/span&gt;

      &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;block_given?&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="c1"&gt;# 详细代码见：https://github.com/intridea/omniauth/blob/master/lib/omniauth/strategy.rb&lt;/span&gt;
&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;ClassMethods&lt;/span&gt;
      &lt;span class="c1"&gt;# Returns an inherited set of default options set at the class-level&lt;/span&gt;
      &lt;span class="c1"&gt;# for each strategy.&lt;/span&gt;
      &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;default_options&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="vi"&gt;@default_options&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vi"&gt;@default_options&lt;/span&gt;
        &lt;span class="n"&gt;existing&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;superclass&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;respond_to?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:default_options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;superclass&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;default_options&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
        &lt;span class="vi"&gt;@default_options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;OmniAuth&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Strategy&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;existing&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;

     &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;args&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="vi"&gt;@args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;
        &lt;span class="n"&gt;existing&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;superclass&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;respond_to?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;superclass&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;args&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="vi"&gt;@args&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;existing&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>neilalaer</author>
      <pubDate>Tue, 22 May 2012 15:36:44 +0800</pubDate>
      <link>https://ruby-china.org/topics/3428</link>
      <guid>https://ruby-china.org/topics/3428</guid>
    </item>
  </channel>
</rss>
