【问题标题】:Request scopes from Slack for messages从 Slack 请求消息范围
【发布时间】:2018-07-20 01:17:58
【问题描述】:

我有一个 Slack 应用程序,直到昨天只有主要所有者才能发送消息。我向 Slack 团队询问了如何解决这个问题,让所有用户都能够在 Slack 上发送消息。答案是首先使用 Sign in with Slack 按钮让他们登录。然后使用另一个按钮,但范围不同。

我的问题是,我可以使用如下按钮以用户身份发送消息:

<input type="button" value="Authenticate again to send Message" class="btn btn-warning" onclick="location.href = 'https://slack.com/oauth/authorize?scope=incoming-webhook,im:write,chat:write:user&client_id=xxyyzz'"/>

现在,我正在尝试通过显示“请稍候”的视图在后台执行相同的额外范围请求

附上以下代码:

<script>
        $.ajax({
            method: "GET",
            dataType: "json",
            url: "@Url.Action(MenuItem, "SetupSlack")",
            //data: { code: 'Model.Code' },
            data: { code: '@Model' },
            success: function(rsp) {
                window.location.replace(rsp.redirect);

            },
            error: function() {
                // Show error.
            }
        });
</script>

而控制器代码如下:

 public ActionResult SetupSlack(string code)
        {
            SlackAuthToken slackToken = slackService.GetAccessToken( clientId, clientSecret, code);

            string redirectUrl;
            if (slackToken.IsAuthenticated && slackToken.HasWrite)
            {
                Alert("Slack setup successfully!!!!", AlertLevel.Success);
                redirectUrl = Url.Action(MenuItem, "Index");
            }
            else if (slackToken.IsAuthenticated)
            {
                redirectUrl = "https://slack.com/oauth/authorize?scope=incoming-webhook,im:write,chat:write:user&client_id=aabbcc";

            }
            else
            {
                Alert("Slack setup failed. Please try again, if the problem persists please contact support.", AlertLevel.Success);
                redirectUrl = Url.Action(MenuItem, "Index");
            }
            return JsonNet(new { redirect = redirectUrl });
        }

它不会导致发布消息身份验证页面。此外,另一个错误是“代码已被使用”作为 OAuth 流中的响应之一。

谁能帮帮我。 我使按钮工作正常,但这也应该工作。

【问题讨论】:

  • 这似乎是您就同一主题提出的第三个问题。以下是其他的,目前仍然开放:stackoverflow.com/questions/51365982/…stackoverflow.com/questions/51332569/…
  • 如果您没有得到好的答案,或者您想添加新信息,我强烈建议您坚持一个问题并更新原始问题。我们的目标是解决关于 SO 的所有问题 - 为了您的利益,也为了其他可能有类似问题的人。
  • 哦,我很抱歉。我不知道。我认为这是一个不同的问题,因为我现在正在做不同的事情。以后我会牢记这一点。
  • 看起来这个用户是被 StackOverflow 踢出的......

标签: slack-api


【解决方案1】:

根据我的理解,让我尝试对您的问题给出更完整的答案。

要求

  1. 您有一个网站,并且您希望 Slack 团队的用户能够通过该网站向 Slack 发送消息。

  2. 消息必须代表用户发送,而不是来自应用程序

解决方案

  1. 要进行身份验证并获取 Slack 用户 ID,用户需要使用“Sign-in with Slack”登录您的网站

  2. 当用户想要发送消息时,您的网站会在其数据库中检查属于当前用户的访问令牌(松弛用户 ID 是密钥),然后使用该令牌通过以下方式发送松弛消息API 与chat.postMessage

  3. 如果网站在其数据库中找不到当前用户的令牌,则需要创建令牌。为此,用户会看到一个启动 Oauth flow with Slack requesting the required permissions 的按钮(例如“授予网站权限”)。创建令牌后,它将存储在网站的数据库中,因此此过程必须仅对每个用户运行一次。然后用户可以发送他的消息。

备注

  • 步骤 3 中的 Oauth 过程与为每个用户安装 Slack 应用程序基本相同。它被称为配置。仅当您的 Slack 团队的管理员已授予所有用户安装此特定 Slack 应用程序的权利时,这才有效
  • 第 3 步中的 Oauth 进程不能像您在问题中建议的那样在后台运行,因为它需要直接的用户交互。它始终要求用户先登录,然后批准您的 Slack 应用所请求的权限。

【讨论】:

  • 你说得对。我想在后台执行 Oauth 的第 1 步,因为第 3 步肯定需要用户批准。在解决方案点 3 中,我们必须正确验证两次,因为第一次用户登录时他没有发布消息的权限,第二次他被重定向到具有不同范围的 oauth 流程的第 1 步,例如 im:write 等。如果他同意,那么他就可以发送消息了。这两个都应该只出现一次。
  • 是的,您必须运行 Oauth 两次。但每个用户只有一次。下次用户使用该网站时,他的令牌已经存在,他只需要登录。
  • 请理解不可能在后台运行两个 Oauth 步骤(1 和 2)中的任何一个。两者都需要用户交互。因此,这是您获得的最佳解决方案,除非您放弃要求 2 并让用户发送来自应用程序而非用户的通用消息
【解决方案2】:

这是行不通的。该按钮触发用户通过 Oauth 2.0 安装您的 Slack 应用程序。根据定义,Oauth 进程不能在后台运行,但需要用户遵循从 Slack 到登录页面的重定向并批准为您的 Slack 应用程序请求的权限。

【讨论】:

  • 我不再使用该按钮来请求额外的范围,但我使用的是使用 Slack 登录的按钮。所以你的意思是说我需要有按钮才能再次进行身份验证以请求其他范围?对吗?
  • 是的。您不能使用 AJAX 在后台运行 Oauth 进程,因为它始终需要用户输入。
猜你喜欢
  • 2017-10-18
  • 2019-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多