【问题标题】:Rails - Slack API OAuth Access - invalid_client_idRails - Slack API OAuth 访问 - invalid_client_id
【发布时间】:2017-01-25 14:21:30
【问题描述】:

我正在为我的 Ruby on Rails 应用程序构建 Slack 集成,当用户单击“添加到 Slack”按钮时,我正在尝试从 Slack API 为我的 Slack 应用程序获取 access_token。

通过 Postman,我可以成功发布以下内容:

https://slack.com/api/oauth.access?client_id=idgoes.here&client_secret=secretgoeshere&code=12345&pretty=1

但是,在 Rails 中,无论我调用 API 的方式如何,我总是会收到带有 invalid_client_id 的响应。我已经检查了我的 ID 是否正确(很多)并尝试重新生成它,但由于邮递员的成功,我认为这不是问题。

在我的 get_oauth_access_token 方法中,我尝试了以下实现:

1.

rc = JSON.parse(HTTP.post('https://slack.com/api/oauth.access',
                           params: {
                           client_id: 'idgoes.here',
                           client_secret: 'secretgoeshere',
                           code: '12345'
                }))

2.

response = Excon.post('https://slack.com/api/oauth.access',
                         headers: { 'Content-Type' => 'application/json; charset=utf-8' },
                         user: client_id, password: client_secret,
                         body: oauth_request_body.to_json)

我尝试的任何实现最终都会得到一个 invalid_client_id 响应。

我知道这可能与环境配置有关,但我不确定什么对调试有帮助,所以请让我知道我可以分享哪些其他信息。我在本地主机上运行。

更新:

我刚刚发现许多(可能是全部)Slack API 不接受 JSON 格式的主体(当它们以 JSON 格式发送响应时,这看起来很疯狂。

请确保在您的请求中使用 x-www-form-urlencoded 格式正文,否则它将无法正常工作。

"Content-Type" => "application/x-www-form-urlencoded"

【问题讨论】:

    标签: ruby-on-rails ruby oauth-2.0 ruby-on-rails-5 slack-api


    【解决方案1】:

    我使用oauth2 gem 进行授权。所以我可以通过阅读slack documentation 并在我的控制器中使用 oauth2 来实现它:

    class OauthController < ApplicationController
      def authorize                                                                   
        options = {                                                                   
          site: 'https://slack.com/oauth/authorize'                                  
        }                                                                             
        client ||= OAuth2::Client.new(                                                
          'client-id',                                                 
          'client-secret',                                         
          options                                                                     
        )                                                                             
        params = {                                                                    
          scope: 'incoming-webhook, commands',                                        
          redirect_uri: 'https://localhost:3000/oauth/callback'                       
        }                                                                             
        redirect_to client.auth_code.authorize_url(params)                            
      end                                                                             
    
      def authorize_callback                                                          
        puts params["code"] 
        redirect_to root_url                                                              
      end 
    end    
    

    路线文件:

    get    '/authorize', to: 'oauth#authorize'                                       
    get    '/oauth/callback', to: 'oauth#authorize_callback'  
    

    不要忘记在 api.slack.com 上的 Oauth 设置中设置回调 url,如您所见,我使用 localhost 进行测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-08
      • 2015-11-26
      • 2012-09-13
      • 1970-01-01
      相关资源
      最近更新 更多