标签: jwt

如何使用 vue.js、vuex 和 django Rest 框架将简单 JWT 令牌保存在本地存储中?

我在本地存储(或 cookie)中保存 JWT 令牌时遇到问题。现在,当我刷新页面时,我需要再次登录。当我使用用户名和密码发布到 /api-token 作为响应时,我获得了访问令牌和刷新令牌,但现在不知道如何存储它们以及在哪里存储它们。

我的loginForm.vue:

(<form...)

<script>
import axios from 'axios';

export default {
  name: 'LoginForm',
  data(){
      return{
          username: '',
          password: '',
      }
  },
  methods: {
      login(){
          this.$store.dispatch('userLogin', {
              username: this.username,
              password: this.password
          })
          .then(() => {
              this.$router.push({ name: 'home'})
          })
          .catch(err => {
              console.log(err)
        })
  }
}
}
</script>
Run Code Online (Sandbox Code Playgroud)

和我的 store.js:

import Vue from 'vue'
import Vuex from 'vuex'
import { getAPI } from './api'

Vue.use(Vuex)

export default new Vuex.Store({
    state: {
        accessToken: null,
        refreshToken: null,
    }, …
Run Code Online (Sandbox Code Playgroud)

jwt django-rest-framework vue.js vuex

1
推荐指数
1
解决办法
1万
查看次数

DRF 简单 jwt 从用户实例获取身份验证令牌或更改用户名和密码组合

我有一个聊天应用程序,它使用与 WhatsApp 相同的身份验证方法。

通常我会通过以下方式获取 jwt 身份验证令牌:

from rest_framework_simplejwt.views import TokenObtainView
path('api/token/', TokenObtainView.as_view(), name='token_obtain_pair'),
Run Code Online (Sandbox Code Playgroud)

但是,当我的用户模型使用电话号码和验证码时,这需要用户名和密码。有什么办法可以改变这个吗?

用户名 ======> 电话号码 密码 ======> 电话号码(验证码)

第二种方法是传递用户实例并以某种方式从中获取身份验证令牌

我的登录视图

@api_view(['POST',])
def loginuser(request):
    if request.method == 'POST':
        phone_number = request.data.get('phone_number')
        try:
            user = User.objects.get(phone_number=phone_number)
            if int(request.data.get('phone_code')) == user.phone_code and user.phone_code:
                # user.phone_code = None
                # user.save()
                return Response({'phone_number': phone_number}, status.HTTP_200_OK)

            else:
                return Response({'error': "Invalid code"}, status.HTTP_400_BAD_REQUEST)
        except Exception as error:
                return Response({'error': error}, status.HTTP_500_INTERNAL_SERVER_ERROR)
Run Code Online (Sandbox Code Playgroud)

我的用户模型:

class User(AbstractUser):
    phone_number = PhoneNumberField(unique=True)
    username = models.CharField(max_length=30)
    password = models.CharField(null=True, blank=True, max_length=20) …
Run Code Online (Sandbox Code Playgroud)

django jwt django-rest-framework django-rest-framework-jwt

1
推荐指数
1
解决办法
7642
查看次数

我的 HMACSHA256 签名验证几乎有效,但不完全有效

我编写了一个方法,将 JWT 作为请求并检查签名是否有效。

这是单元测试:

@Test
public void isValid() {
    final JwtValidator jwtValidator = JwtValidator.getInstance();
    final boolean valid = jwtValidator.isValid("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c");
    Assert.isTrue(valid);
}
Run Code Online (Sandbox Code Playgroud)

这是代码:

@SneakyThrows
public boolean isValid(String extractedToken) {
    final String[] tokenParts = extractedToken.split(Pattern.quote("."));
    String header = tokenParts[0];
    String payload = tokenParts[1];
    String signature = tokenParts[2];

    final byte[] calcHmacSha256 = HMAC.calcHmacSha256("your-256-bit-secret".getBytes(), (header+"."+payload).getBytes());

    final String s = Base64.getEncoder().encodeToString(calcHmacSha256);

    System.out.println("'" + signature + "'.equals('"+s+"')");
    return signature.equals(s);
}
Run Code Online (Sandbox Code Playgroud)

日志打印两个字符串,仅相差 2 个字符,所以我觉得我已经接近“但不完全”使其工作:

'SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c'.equals('SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV/adQssw5c=')
Run Code Online (Sandbox Code Playgroud)

当然存在硬编码值,因为实现尚未完成,但我现在使用https://jwt.io/中的示例值以便于使用。

谢谢!

编辑1:

public class JwtValidatorTest {

    @Test
    public void …
Run Code Online (Sandbox Code Playgroud)

java sha256 hmac jwt

1
推荐指数
1
解决办法
889
查看次数

Spring Security - JWT 的自定义主体

我在我的角度应用程序中使用 oauth2 和 sso。我的其余后端验证每个请求发送的身份验证令牌。现在我想使用 oid 声明从我的数据库加载用户并将其保存在主体中。另外我想在“GrantedAuthorities”中添加用户权限。

食品服务

[...]
public Foo getFooByOid(String oid) throws FooNotFoundException {
    return fooRepository.findByOid(oid)
            .orElseThrow(() -> new FooNotFoundException("Foo with oid: " + oid + " not found"));
}
Run Code Online (Sandbox Code Playgroud)

安全配置

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests(auth -> auth
            .anyRequest().authenticated())
            .oauth2ResourceServer(oauth2 -> {
            oauth2.jwt();
        });
    }   
}
Run Code Online (Sandbox Code Playgroud)

spring.security.oauth2.resourceserver.jwt.jwk-set-uri 和 spring.security.oauth2.resourceserver.jwt.issuer-uri 在 application.properties 中定义

之后,我的主体包含所有声明、标头和令牌:

主要的

任何人都可以帮助我该怎么做吗?谢谢

spring spring-security principal oauth-2.0 jwt

1
推荐指数
1
解决办法
3439
查看次数

Microsoft Graph API:访问令牌验证失败。无效观众

我正在尝试将我的应用程序从 Office 365 REST v2.0 迁移到 Microsoft Graph (v1.0)。令牌交换似乎正常工作,但当我尝试调用 API 时,我收到以下错误:

    (
    [errorNumber] => 401
    [error] => Request returned HTTP error 401
    [message] => {
  "error": {
    "code": "InvalidAuthenticationToken",
    "message": "Access token validation failure. Invalid audience.",
    "innerError": {
      "date": "2021-03-16T15:36:21",
      "request-id": "dda1e33a-2774-4986-8c45-1487404fbb72",
      "client-request-id": "e842d9a8-d71b-0563-f1ce-e58052e5bdb9"
    }
  }
}
)
Run Code Online (Sandbox Code Playgroud)

access_token 具有以下受众:

"aud": "https://outlook.office.com"
Run Code Online (Sandbox Code Playgroud)

这是我正在使用的端点:

https://login.microsoftonline.com/common/oauth2/v2.0/token
Run Code Online (Sandbox Code Playgroud)

有效负载:

grant_type=authorization_code
&code=0.AR8A3XwQy0FAmkSxxxx
&redirect_uri=https%3A%2F%2Fxxx.com%2Fproxy%2Foffice365authorize
&client_id=e2147faf-87f0-4e7f-xxxx-xxxxxxxxxxx
&client_secret=xxxxxxxxxxxx
Run Code Online (Sandbox Code Playgroud)

任何提示将不胜感激,谢谢!

oauth-2.0 jwt azure-active-directory microsoft-graph-api

1
推荐指数
1
解决办法
1万
查看次数

Flask 无法验证受保护路由的 JWT 签名

我正在尝试使用 JWT 令牌“保护”我的应用程序登录,但似乎我编码或解码错误。尽管 JWT.io 说签名有效,但为什么它说我的签名无效?

我在应用程序初始化中设置密钥,并使用它来编码和解码 JWT 令牌:

#skey = os.urandom(16)
#app.secret_key = f"{skey}"
app.config['SECRET_KEY'] = 'abe535ed6a554fe48e09e111dad2dcbc' #temporary for testing
app.debug = True
print(app.secret_key)
Run Code Online (Sandbox Code Playgroud)

dash用这个函数保护路由:

def token_required(f):
    @wraps(f)
    def decorated(*args, **kwargs):
        token = request.args.get('token') #http://localhost:5000/route?token={jwttoken}
        if not token:
            return jsonify({'message': 'Token is missing'}), 403
        try:
            data = jwt.decode(token, app.secret_key)
        except jwt.ExpiredSignatureError:
            return jsonify({'message': 'Token expired, log in again'}), 403
        except jwt.InvalidTokenError:
            return jsonify({'message': 'Invalid token. Please log in again.'}), 403
        
        return f(*args, **kwargs)
    return decorated
Run Code Online (Sandbox Code Playgroud)

这是破折号路线:

@app.route('/dash', methods=["GET", …
Run Code Online (Sandbox Code Playgroud)

python flask jwt

1
推荐指数
1
解决办法
2641
查看次数

使用加密库生成令牌

我试图通过在终端中运行以下命令来生成密钥: node require('crypto').randomBytes(64).toString('hex')

我在服务器运行时在另一个选项卡上执行此操作,但将其作为输出: zsh: unknown file attribute: h

我在这里做错了什么?TIA

node.js secret-key jwt cryptojs

1
推荐指数
1
解决办法
2012
查看次数

卷曲(60)ssl证书问题自签名证书本地主机在Windows

我是新来提问的,所以请原谅我的提问方式。我通过如下所示的curl 命令访问安全休息API。

curl -X GET -H '授权:承载 ${Token}' https://localhost/student-sevice/list-of-student

出现如下错误

Curl(60) SSL 证书问题:自签名证书。Curl 未能验证服务器的合法性,因此无法建立安全连接

java rest curl jwt

1
推荐指数
1
解决办法
9332
查看次数

对于未经身份验证的用户,AllowAny CreateAPIView 返回 401

我将 DRF 与djangorestframework-simplejwt包一起使用。在我的settings.py中:

INSTALLED_APPS = [
    ...
    'rest_framework',
    ...
]

...

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.AllowAny',
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_simplejwt.authentication.JWTTokenUserAuthentication',
    ),
}

SWAGGER_SETTINGS = {
   'SECURITY_DEFINITIONS': {
      'Bearer': {
            'type': 'apiKey',
            'name': 'Authorization',
            'in': 'header',
            'description': 'E.g. \'Bearer jwt.token.here\''
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

在我的应用程序的views.py中:


...

class PublicCreateView(generics.CreateAPIView):
    """
    Should be available for unauthenticated users
    """
    serializer_class = PublicThingSerializer

    def post(self, request, *args, **kwargs):
        return Response("It works!", 200)
...
Run Code Online (Sandbox Code Playgroud)

然而由于某种原因,此视图返回401未经身份验证的用户的响应。我尝试了很多事情,我得到的最好的结果是注意到当我完全删除配置时REST_FRAMEWORKsettings.py …

django jwt django-rest-framework django-rest-framework-simplejwt

1
推荐指数
1
解决办法
742
查看次数

验证 API 密钥和 JWT 令牌是微服务的责任吗?

我的微服务将以两种方式调用: 1. 由公共网站的未经身份验证的用户调用。2. 通过内部 UI 的经过身份验证的用户来执行管理功能。

我计划使用 OIDC 和 JWT 令牌来验证管理员用户从管理 UI 发出的 API 调用。该令牌中将包含声明,微服务将使用该声明来确定用户是否有权访问此 API。

我计划使用面向公众的网站上的 API 密钥来进行未经身份验证的用户进行的 API 调用。微服务将验证 API 请求标头中的 API 密钥,以确定 API 调用是否来自可信来源。

问题

  • 这是处理身份验证和授权的正常/可接受的方式吗?
  • 微服务有责任评估 JWT 令牌和 API 密钥吗?每个微服务都必须在我的设计中做到这一点。

authentication authorization api-key jwt microservices

1
推荐指数
1
解决办法
1013
查看次数