在 RESTful API 中存储身份验证令牌的位置?

Posted

技术标签:

【中文标题】在 RESTful API 中存储身份验证令牌的位置?【英文标题】:Where to store authentication token in RESTful API? 【发布时间】:2014-04-05 13:46:37 【问题描述】:

我想保护 REST URL。为此,我决定使用基于令牌的身份验证。在那,我如何创建具有过期时间的令牌以及我可以将它存储在哪里以供以后验证令牌检查?

提前致谢。

This is my security.xml
<beans:beans xmlns="http://www.springframework.org/schema/security"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns:beans="http://www.springframework.org/schema/beans"
             xmlns:sec="http://www.springframework.org/schema/security"
             xmlns:context="http://www.springframework.org/schema/context"
             xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
                                 http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">
    <beans:import resource="applicationContext.xml"/>
    <http pattern="/jaxrs/employess/**" create-session="stateless"  entry-point-ref="myAuthenticationEntryPoint">
        <intercept-url pattern='/jaxrs/employess/**' /> 
            <custom-filter position="PRE_AUTH_FILTER" ref="myAuthenticationFilter" />
    </http>
    <beans:bean id="myAuthenticationEntryPoint" class="restservice.security.MyAuthenticationEntryPoint"/>
    <global-method-security secured-annotations="enabled" />
    <beans:bean id="myAuthenticationFilter" class="restservice.security.MyAuthenticationFilter">
        <beans:property name="authenticationManager" ref="authenticationManager"/>
    </beans:bean>
    <authentication-manager alias="authenticationManager">
        <authentication-provider ref="myAuthenticationProvider"/>
    </authentication-manager>
    <!--<beans:bean id="restTemplate" class="org.springframework.web.client.RestTemplate"/>-->
    <beans:bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
        <!--  <beans:property name="errorHandler" ref="customErrorHandler" /> -->
    </beans:bean>
    <beans:bean id="myAuthenticationProvider" class="restservice.security.MyAuthenticationProvider" >
        <beans:property name="restTemplate" ref="restTemplate"/>
    </beans:bean>
  <!--   <beans:bean id="customErrorHandler" class="com.AuthenticationResponseErrorHandler"/> -->
</beans:beans>*

【问题讨论】:

你没有。 Spring security 为您处理这个问题。 你能把它在春天如何处理的例子贴出来吗??? 【参考方案1】:

您不应该将它存储在任何地方,因为这意味着在服务器上存储一些会话状态。

相反,令牌本身应该是一个签名的编码字符串,其中包含识别用户所需的信息。您通过检查签名来验证其真实性。如果您需要使其过期,只需在签名之前为其附加时间戳并根据当前时间计算令牌年龄。

【讨论】:

oauth是否适合这个要求? 如果我们不应该在 REST API 数据库中保留令牌(例如 JSON Web 令牌),我们如何在 SPA -> REST API 架构中实现“记住我”功能?我能想到的唯一方法是使用 SPA -> 应用程序服务器 -> REST api 架构,这样我们就可以使用会话(保留在应用程序服务器的数据库中)能够在单页应用程序中添加“记住我”功能. API 可能会提供一个令牌,可以检查其真实性、完整性和过期时间,而无需存储在服务器端。

以上是关于在 RESTful API 中存储身份验证令牌的位置?的主要内容,如果未能解决你的问题,请参考以下文章

使用令牌实现 RESTful API 身份验证 (Yii/Yii2)

外部身份验证提供程序和对 RESTful API 的请求的身份验证

在 RESTful Web API 中验证后续请求的令牌签名

是否根据身份验证凭据 RESTful 返回不同的输出?

RESTful API 的令牌认证:是不是应该定期更改令牌?

Openid 和 RestFul API