Oauth 2.0 Slack Oauth:如果用户已经授权应用程序,则自动授权用户

Oauth 2.0 Slack Oauth:如果用户已经授权应用程序,则自动授权用户,oauth-2.0,slack,slack-api,Oauth 2.0,Slack,Slack Api,我正在开发一个Slack应用程序,用户可以使用Slack的Oauth流将其安装到工作区。安装和配置应用程序后,我使用Oauth允许用户登录并更改应用程序配置 新用户的流程使用“添加到Slack”按钮,该按钮要求用户同意允许bot和identity.*作用域,然后我的应用程序检索和存储bot和用户令牌 现在,我想允许同一个用户使用“signwithslack”Oauth流登录。根据,“使用Slack登录”流仅允许使用相同的/oauth/authorize端点执行此操作,但只请求一个标识。*作用域(

我正在开发一个Slack应用程序,用户可以使用Slack的Oauth流将其安装到工作区。安装和配置应用程序后,我使用Oauth允许用户登录并更改应用程序配置

新用户的流程使用“添加到Slack”按钮,该按钮要求用户同意允许
bot
identity.*
作用域,然后我的应用程序检索和存储bot和用户令牌

现在,我想允许同一个用户使用“signwithslack”Oauth流登录。根据,“使用Slack登录”流仅允许使用相同的
/oauth/authorize
端点执行此操作,但只请求一个
标识。*
作用域(我使用的是
标识.basic
):


用户已经为我的应用程序授权了
bot
identity.*
在初始应用程序安装时的作用域,但令人惊讶的是,他/她再次被提示确认允许我的应用程序
identity.*
在每个“使用Slack登录”操作中的作用域

slack文档表明,后续登录尝试将导致自动重定向:

用户单击“使用Slack登录”按钮后,其web浏览器应到达Slack的服务器

当用户处理一些业务时,应用程序将耐心等待,或者,Slack只是在返回重定向URL的过程中发送它们。

(强调矿山)

但是,Slack总是请求用户(重新)授权我的应用程序使用
标识。*
作用域。如何通过单击流使用Slack登录用户

更新:Slack的回应 我联系了Slack团队,得到了如下回应:

不幸的是,看起来我们需要更新文档,因为目前文档中描述的内容并不准确。特别是:

返回的用户不会因不必要的批准而分心,我们会尽快将他们发送回您的网站、服务或应用程序

由于我们对身份验证流程进行了更改,现在允许用户选择他们正在使用的工作区,因此我们再次向他们显示“范围”或“权限”页面。 这绝对是我们应该考虑做的事情,但目前是我们期望的行为,我们将修改文档来解释它。

为这个坏消息感到抱歉


截至19年11月17日,尚未更新。

如果您需要使用经过身份验证的Slack用户实现链接到Slack应用程序的网页,您有两种选择:

用Slack登录 一种方法是使用Slack登录来验证您网页的用户。这允许您清楚地对用户进行身份验证。但是,缺点是用户每次再次打开此网页时都必须重复登录过程。这可以通过使用cookie在浏览器重新启动之间保持用户登录,直到用户手动注销web应用程序来有所缓解

请注意,此身份验证过程独立于登录到其Slack工作区的用户

自身认证 或者,您可以让用户直接从Slack打开您的web应用程序,例如单击您提供的链接按钮。此URL需要包含允许您的web应用程序获取用户当前上下文的信息,例如他的Slack和用户ID


请注意,此URL可能会被用户获取并可能被误用,因此您需要添加保护措施,例如加密ID或添加安全哈希或一次性令牌…

我的应用程序绝对会在用户登录时使用cookies来识别用户。他们注销后呢?我的应用程序尽职尽责地清除cookie,直到他们重新登录。我知道你已经回答了几个相同的问题:你似乎缺少的是,应用程序通常需要在用户注销后查明用户是谁,但不需要新的权限。我想我完全理解你的要求。如果你的应用程序想要记住一个用户(例如,在他第二天重新启动浏览器后),你不想清除cookies。然而,在用户手动注销后,你不应该记住他。这可以非常全面地描述这个过程:我们绝对不应该在用户注销后记住他。这就是为什么我们需要一个流来让他重新登录。最好不要问他是否想让我的应用程序访问他的身份,因为他已经授权我的应用程序访问他的身份。这是其他Oauth提供程序的工作方式,允许单击一次登录。确定。但正如我在回答中所说:这取决于您的实施,例如,通过使用cookies。Slack不为您提供该功能。
<a href="https://slack.com/oauth/authorize?scope=identity.basic&client_id=REDACTED">Sign in with Slack</a>