Ajax 使用API身份验证和非';我没有登录

Ajax 使用API身份验证和非';我没有登录,ajax,api,rest,authentication,Ajax,Api,Rest,Authentication,我已经建立了。该站点的功能之一是RESTAPI。当前,当有人提交一个查询时,整个页面将被重新加载,API将被命中服务器端。我想重建这个网站,这样当人们调整搜索参数时,结果会在客户端使用点击RESTAPI的AJAX进行分页 API需要登录(以便在需要时可以对其进行限制),但使用站点通常不需要 如何使人们不用登录就可以使用该网站,但他们对该网站的使用会影响API客户端? 我目前的最佳想法是: 只需在站点的JavaScript中输入用户名和密码,并在进行查询时使用它们登录API即可。为这些凭据提供对A

我已经建立了。该站点的功能之一是RESTAPI。当前,当有人提交一个查询时,整个页面将被重新加载,API将被命中服务器端。我想重建这个网站,这样当人们调整搜索参数时,结果会在客户端使用点击RESTAPI的AJAX进行分页

API需要登录(以便在需要时可以对其进行限制),但使用站点通常不需要

如何使人们不用登录就可以使用该网站,但他们对该网站的使用会影响API客户端?

我目前的最佳想法是:

  • 只需在站点的JavaScript中输入用户名和密码,并在进行查询时使用它们登录API即可。为这些凭据提供对API的无限制访问。除了将凭证放入我的JavaScript之外,这可能会起作用

  • 继续在服务器端执行所有API工作,放弃动态页面重新加载带来的速度和UX改进

  • 做1号很糟糕,做2号基本上就是放弃我想要的那种网站


    想法

    也许这是一个复制品?我不想标记它,以防我不理解这张海报和那张海报的区别


    根据您站点的API信息页面,您使用的是tastypie,
    BasicAuthentication
    用于API用户

    您是否尝试过通过
    多重身份验证
    基本身份验证
    与另一个身份验证选项相结合?也许您可以使用
    SessionAuthenticaion
    并使用允许匿名的身份验证后端。这样,API用户将继续传递他们的用户名/密码(如果你这样做的话,API密钥),站点用户将返回到一个匿名会话,通过
    sessionauthentication
    进行身份验证

    或者,如图所示,创建自定义身份验证,并使用一些逻辑来确定使用者是否与API驻留在同一主机上,而不是
    SessionAuthentication


    可以将Tastypie的方法配置为使用自定义标头


    从注释中迁移和合并: 基于(我更喜欢Franci Penov的答案,而不是公认的答案)如果我要实现这一点,我将使用两步过程
    ApiKeyAuthentication
    来确认有效的API密钥,然后进行“引用检查”,以确保密钥来自预期的源。如果按照上面链接的答案中的建议,基于源计算密钥,则这会变得更简单

    实际上,在tastype的
    SessionAuthentication
    方法()中有一些代码,它们做了类似的事情

    ...
    
    referer = request.META.get('HTTP_REFERER')
    
    if referer is None:
        return False
    
    good_referer = 'https://%s/' % request.get_host()
    
    if not same_origin(referer, good_referer):
        return False
    
    ...
    
    对你来说最好的事情是。它将以一种方便的方式解决您的问题

    您想要的是为您的网站授予一些特权,以便自由访问您的REST API,其他用户必须使用某种用户名和密码登录(对于Oath2,它将是一个令牌),这可以通过使用Oauth2轻松实现

    这里有一些好的阅读材料

  • (如果使用Spring和angularjs)


  • 除了这里已经提供的答案之外,在这种情况下可以做的一个建议是,您可以拥有一个自定义的授权头。其中一个例子就是道路

    拥有自定义授权标头要求您自己创建标头

    您可以做的是让客户端(进行调用的客户端,不一定是用户)在每个会话中进行一次身份验证。将该身份验证令牌存储在某个位置,并使用它对RESTAPI的每个请求进行签名。该身份验证令牌仅在特定时间段内有效,因此不会有人误用它


    下面是我在授权上找到的另一篇文章,感谢您的回复,但我认为我问题的重点是如何使用API而不让它像您建议的那样完全开放。看起来确实需要某种自定义身份验证,但我不知道会是什么。@mlissner因此为django中的每个API调用创建了一个新会话,这意味着SessionAuthentication,即使后端允许匿名,也会成功,因此API使用者无法受到限制。我理解对了吗?那个么,若您试图区分来自本地主机(假设站点和API位于同一主机上)和远程主机的API调用,会怎么样使用自定义身份验证。当我有时间的时候,我会做更多的研究。@mlissner我想尝试区分您的站点进行API调用和其他人进行API调用是没有意义的,因为请求实际上来自客户端。显然,您需要某种方法将您的站点标识为提升用户。当您的站点收到初始请求时,您可以为该会话生成一个临时的、唯一的API密钥,授予它对API的无限制访问权,并将其提供给客户端使用。然后,您可以让该API密钥在会话中过期。@mlissner因此,即使您为API的“第三方”用户保留基本身份验证,您也可以只给自己一个API密钥,然后按照许多约定之一在应用程序中保护它。这些链接可能是一个有用的起点:;我在第二个链接中找到了一个答案,听起来与我在上面的评论中提到的方法相似。我认为这个关于谷歌地图的链接是我见过的最好的东西。这是一个轻量级的解决方案,但如果它对谷歌地图来说足够好,那么对我来说也应该足够好。我有点担心推荐人的标题会慢慢被弃用,但我会做更多的研究,看看这是否真的是个问题。谢谢你的研究。但是如果用户必须进行身份验证,那就达不到目的了。这就像说你必须登录才能使用谷歌。目标是用户不需要