我在本地存储(或 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) 我有一个聊天应用程序,它使用与 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) 我编写了一个方法,将 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) 我在我的角度应用程序中使用 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 中定义
之后,我的主体包含所有声明、标头和令牌:
任何人都可以帮助我该怎么做吗?谢谢
我正在尝试将我的应用程序从 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)
任何提示将不胜感激,谢谢!
我正在尝试使用 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) 我试图通过在终端中运行以下命令来生成密钥:
node require('crypto').randomBytes(64).toString('hex')
我在服务器运行时在另一个选项卡上执行此操作,但将其作为输出:
zsh: unknown file attribute: h
我在这里做错了什么?TIA
我是新来提问的,所以请原谅我的提问方式。我通过如下所示的curl 命令访问安全休息API。
curl -X GET -H '授权:承载 ${Token}' https://localhost/student-sevice/list-of-student
出现如下错误
Curl(60) SSL 证书问题:自签名证书。Curl 未能验证服务器的合法性,因此无法建立安全连接
我将 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_FRAMEWORK,settings.py …
django jwt django-rest-framework django-rest-framework-simplejwt
我的微服务将以两种方式调用: 1. 由公共网站的未经身份验证的用户调用。2. 通过内部 UI 的经过身份验证的用户来执行管理功能。
我计划使用 OIDC 和 JWT 令牌来验证管理员用户从管理 UI 发出的 API 调用。该令牌中将包含声明,微服务将使用该声明来确定用户是否有权访问此 API。
我计划使用面向公众的网站上的 API 密钥来进行未经身份验证的用户进行的 API 调用。微服务将验证 API 请求标头中的 API 密钥,以确定 API 调用是否来自可信来源。
问题