我正在开发一个Slack应用程序,该应用程序也链接到一个Web应用程序,用户可以使用Slack登录.这是很常见的一个新用户既需要登录到Web应用程序,并添加该应用懈怠.
我想通过OAuth一次性让他们这样做.由于Web应用程序需要每个用户的姓名,电子邮件地址和个人资料图片,因此我将"identity.basic","identity.email"等范围添加到"Add to Slack"按钮请求的范围内.但事实证明,Slack不允许这样做.Slack OAuth页面显示" 请求的权限无效:无法同时请求身份范围和其他范围".
一种替代方案可能是请求用户:read和users:read.email范围而不是标识范围.但是,这为我们的应用提供了超出其需求的访问权 它只需要当前用户的信息,而不是团队中的所有用户.(它可能稍后需要所有用户的信息,所以无论如何我都在考虑这样做,但我不确定用户是否会喜欢它.)
另一种选择似乎是让用户通过两个不同的OAuth权限屏幕.但这似乎很麻烦,而且用户体验也不好.
所以问题是(1)是否有更好的方法,以及(2)为什么Slack不允许将身份范围与其他范围相结合?
更新以澄清,以回应@ erik-kalkoken的回答:
我知道"Add to Slack"和"Sign with with Slack"之间的区别.我当然不打算取消大多数用户做一个简单的"用Slack登录"的选项.但是,对于这个特定的应用程序,没有登录到Web应用程序就做"添加到Slack"是没有意义的.这需要由每个Slack团队的一个人完成,然后该团队的其他用户才能使用它.我们对新团队的入职流程有点麻烦,我正在寻找方法让它变得更简单,更顺畅.由于登录和添加步骤理论上可以合并为一个步骤,我宁愿这样做.
部分原因可能是因为我们没有开发"Slack app"; 我们正在为Web应用程序开发Slack集成.Web应用程序可以在不使用Slack的情况下使用,并且具有自己的用户和社区概念.
使用restangular处理嵌套资源时的最佳做法是什么?即
Restangular.one("accounts", 1).one("projects", 1).get().then(function (project) {
project.getList("proofs").then(function(proofs){
project.proofs = proofs;
_.each(proofs, function(proof){
proof.comments = proof.getList("comments");
});
});
$scope.project = project;
Run Code Online (Sandbox Code Playgroud)
});
这将允许我很好地访问视图内的每个.
<li ng-repeat="proof in project.proofs">Total: {{proof.comments.length}}</li>
Run Code Online (Sandbox Code Playgroud)
如果我想要对项目进行更新,那么它会将所有内容发送到项目REST端点(包括所有校样和所有proofs.comments).
project.name = 'New Name!';
project.put();
Run Code Online (Sandbox Code Playgroud)
这让我觉得我必须实施一些错误的东西,并且冥想是一种更好的处理方法吗?
没有用这样的东西直接定义所有的$ scope(未经测试)?即
Restangular.one("accounts", 1).one("projects", 1).get().then(function (project) {
project.getList("proofs").then(function(proofs){
$scope.projectProofs = proofs;
_.each(proofs, function(proof){
$scope.proofComments[proof.id].push(proof.getList("comments"));
});
});
$scope.project = project;
Run Code Online (Sandbox Code Playgroud)
});
建议的最佳做法是什么?
假设一个应用程序使用暴露分页集合的REST api中的数据,并且集合中的项目数量可能无限大(即,一次获取所有项目并存储在浏览器会话中的项目太多).
什么是获取,缓存和使这些数据的缓存无效的好策略?
说,API就像,
GET /users?page=1&per_page=50
Run Code Online (Sandbox Code Playgroud)
使用如下响应(即包括收集数据+分页元数据)
{
"paging": {
"per_page": 20,
"page": 1,
"previous": null,
"self": "/api/v1/users?per_page=20&page=1",
"next": "/api/v1/users?per_page=20&page=2"
},
"data": [
// first 20 users
]
}
Run Code Online (Sandbox Code Playgroud)
客户端可能会也可能不会在连续页面中加载集合,一次一页.任何客户端都可以更改集合中的用户.最终的一致性就足够了,我现在并不关心写冲突.
问题是在angularjs应用程序的上下文中,但是是一般的场景.
我将我的模板预先加载到一个javascript字符串数组中,就像var t = JST['firstTemplate']
在哪里t
一样,
<div>This scope has a value of {{value}}</div>
Run Code Online (Sandbox Code Playgroud)
如何在ng-include
指令中使用此预加载的模板?
请注意,此场景中的模板可能更复杂,可能具有嵌套视图和模板以及它们自己的嵌套作用域和控制器.所以我不确定任何ng-bind指令是否有帮助?
更新:
查看ng-include
它的来源似乎是一种很好的方法,可以将模板加载逻辑解耦为可自定义的提供程序.
当前的默认加载机制只是做了$http.get
与$templateCache
作为缓存提供者.看起来我可以将模板内容注入JST['firstTemplate']
到模板缓存中,但是我必须在启动时为每个模板执行此操作.
$templateCache.put('firstTemplate', JST['firstTemplate']);
Run Code Online (Sandbox Code Playgroud)
然后有,
<div ng-include="firstTemplate"></div>
Run Code Online (Sandbox Code Playgroud)
我还可以编写一个与每个ng-include并排的自定义指令,它以某种方式预先缓存模板.这再次显得笨重.
更新#2
我将尝试重写templateCache,以便它使用我已经预先加载的JST哈希.如果有效,将发布结果.
我正在使用 devise 并创建了一个服务对象 - 一切都按预期完美运行。但是我想知道如何包含 current_user?因为我必须始终传递 current_user 或 user_signed_in 的那一刻?当我在不同的类和视图中使用相同的方法时,变量会很烦人,我该如何去做呢?
目前我有这个用于测试:
class User
class GetStart
attr_reader :current_user
def initialize(user)
@current_user = user
p current_user
end
end
end
Run Code Online (Sandbox Code Playgroud)