什么是生成csrf令牌并验证的最佳方法.从我能够收集到的内容来看,即使你在"帖子"形式中有一个隐藏的表单字段,黑客也可以使用ajax简单地获取该表单,获取csrf令牌并向站点发送另一个请求以提交表单.
如果我们要检查发送给我们的标头...那么黑客可以简单地将csrf标记发送到服务器端脚本,然后模拟http标头.
那么如何实际生成和验证csrf令牌呢?
我有一个rails应用程序,我想开始启用一些iOS集成.我有一个基本的身份验证系统,主要是从头开始构建,有一点来自Sorcery的帮助.
我的理解是移动集成基本上有两种选择:HTTP Basic Auth或Token Auth.从我迄今为止所能找到的内容来看,令牌认证是首选方法.
我不熟悉令牌认证是什么或它应该如何工作,除了一些关于如何在Devise库中使用相关模块的教程之外,我还没有真正找到任何合适的指南.
所以,我的问题是,Token身份验证的基本理论是什么,以及rails中的from-scratch令牌身份验证系统会是什么样子?我理解为整个系统共享代码对于SO答案可能有点过分,但如果有人能帮助我理解这样一个系统应该如何工作的基本原理图,我将非常感激.我也很乐意接受任何关于如何从头开始做这些好材料的链接,因为主要问题是我找不到那样的东西.
谢谢!
我们有一个模板网址,如:
http://api.example.com/sale?auth_user=xxxxx&auth_pass=xxxxx&networkid={networkid}&category=b2c&country=IT&pageid={pageid}&programid=133&saleid=1&m={master}&optinfo={optinfo}&publisher={publisher}&msisdn={userId}
Run Code Online (Sandbox Code Playgroud)
我有这些常数令牌的价值.如何在C#中替换所有这些令牌?
我尝试使用jjwt库在Java中创建Json Web Token
但是当我尝试延长到期时间时,我遇到了问题.
我通过下面的代码尝试.
public class Main {
public static void main(String args[]) {
byte[] key = new byte[64];
new SecureRandom().nextBytes(key);
Date date = new Date();
long t = date.getTime();
Date expirationTime = new Date(t + 5000l); // set 5 seconds
String compact = Jwts.builder().setSubject("Joe").setExpiration(expirationTime).signWith(SignatureAlgorithm.HS256, key).compact();
System.out.println("compact : " + compact);
try {
String unpack = Jwts.parser().setSigningKey(key).parseClaimsJws(compact).getBody().getSubject();
System.out.println("unpackage 0 : " + unpack);
// check if the expiration work.
Thread.sleep(3000);
System.out.println("unpackage 1 : " + Jwts.parser().setSigningKey(key).parseClaimsJws(compact).getBody().getSubject());
//extend …Run Code Online (Sandbox Code Playgroud) 我需要帮助处理我的角度应用程序中的过期令牌.我的api有过期的时间但我的问题是当我忘记退出我的角度应用程序,一段时间后,我仍然可以访问主页但没有数据.我能做些什么吗?是否有可以处理此问题的库?或者有什么我可以安装?更好,如果我没有安装任何东西.这是我的身份验证码?我可以添加任何可以处理过期的内容吗?如果过期,我将无法访问该主页.
auth.service.ts
export class AuthService {
private loggedIn = false;
constructor(private httpClient: HttpClient) {
}
signinUser(email: string, password: string) {
const headers = new HttpHeaders()
.set('Content-Type', 'application/json');
return this.httpClient
.post(
'http://sample.com/login',
JSON.stringify({ email, password }),
{ headers: headers }
)
.map(
(response: any) => {
localStorage.setItem('auth_token', response.token);
this.loggedIn = true;
return response;
});
}
isLoggedIn() {
if (localStorage.getItem('auth_token')) {
return this.loggedIn = true;
}
}
logout() {
localStorage.removeItem('auth_token');
this.loggedIn = false;
}
}
Run Code Online (Sandbox Code Playgroud)
authguard.ts
@Injectable()
export class AuthGuard implements CanActivate …Run Code Online (Sandbox Code Playgroud) 我正在开发一个 Java 应用程序(使用 Spring Boot),我需要一些帮助:该应用程序接收JWT 令牌作为输入,我在方法中处理该令牌。目前的方法如下:
private UsernamePasswordAuthenticationToken myMethod(HttpServletRequest request) {
// Code that gets the 'token' String
try{
Map<String, String> registry = ((Map<String, String>) (token.getBody().get("registry")));
String sub = ((String) (parsedToken.getBody().get("sub")));
UsernamePasswordAuthenticationToken finalToken = new UsernamePasswordAuthenticationToken(sub, null, null);
return finalToken;
} catch (ExpiredJwtException exception) { // Only here I have the certainty that the token has expired!
// Code that handles the exception
}
Run Code Online (Sandbox Code Playgroud)
}
但是,我需要实现一个逻辑,必须在多个地方检查获取的令牌是否已过期,而不是每次都运行这个方法。我必须知道是否已过期的唯一方法token是 引发的异常ExpiredJwtException。
有没有办法知道令牌是否已过期而不通过捕获的异常?.isExpired例如,如果有一个具有属性或类似属性的“令牌”类,那将非常有用。 …
我目前正在为具有 Web 和移动应用程序通用后端的新项目规划基础设施。移动应用程序通常由令牌授权,而不是 cookie,但我想知道为什么?我的想法很少,比如在设置和预加基于 cookie 的身份验证方面缺乏灵活性,但我想知道令牌背后的真正论点。
我正在构建一个 Angular WEB应用程序,它具有 Firebase 的云推送通知功能。我使用 AngularFireMessaging 服务(来自 Angular Fire 库)。首先,当应用程序启动时,我会检查用户是否已经授予权限并请求令牌,这可以使用 getToken() 方法轻松完成。这是我正在做的一个非常简短的例子:
import { AngularFireMessaging } from '@angular/fire/messaging';
@Injectable()
export class PushNotificationsService {
constructor(private afMessaging: AngularFireMessaging) {}
detectPermissionStatus(): Observable<string> {
return this.afMessaging.getToken().pipe(
map(token => { /*.... some code here....*/ })
);
}
}
Run Code Online (Sandbox Code Playgroud)
如果我已经授予权限并且令牌可用,则可观察对象会立即返回它,然后我会做任何我想做的事情。但是,如果我没有任何权限状态(例如,当我第一次访问该页面时),则会调用默认浏览器提示以允许/拒绝通知。这对我来说似乎很奇怪,因为我没有明确调用 requestPermission() 函数。似乎 getToken() 函数也以某种方式使浏览器调用提示。这是我并不真正想要的行为,因为它会阻止我的应用程序继续运行,因为我依赖于要返回的某些东西(无论它是现有令牌还是什么都没有)才能继续处理我需要的其余请求去做。
所以......简短的问题 - 有没有办法检查用户是否已经请求令牌而不调用提示?
编辑: 如果您想知道为什么我需要以这种方式执行这些操作 - 这是因为我想在发送登录请求之前检查用户是否有令牌以及是否存在令牌 - 我将令牌与登录一起发送要求。然后在后端,我只是检查该用户是否已经与此令牌相关联(使用同一浏览器的多个用户共享一个令牌可能会发生这种情况),如果是 - 他们对此订阅的最新决定是什么(他们是否选择了不在通知中)。我希望你已经明白了 - 如果出现提示窗口,应用程序只是挂起并等待做出某些决定,然后我们继续登录。
编辑: 我发现的另一个解决方案是使用内置于 Notification api 的浏览器。使用 Notification.permission 我可以看到权限的状态(默认、拒绝或授予)。如果它返回状态“已授予”,我知道我有一个令牌,我可以继续从 firebase 消息传递调用 getToken()。否则,我会直接跳到登录,稍后当用户决定订阅通知时,我将调用提示。
permissions token angularfire firebase-cloud-messaging angular
我使用 dgrijalva/jwt-go 和 lestrrat-go/jwx。我试图实现的是使用 jwks 验证 wso2 jwt。
令牌(过期令牌):
const tokenStr = `eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6ImI2TnozUDJwMHg1QWpfWENsUmhrVDFzNlNIQSJ9.eyJodHRwOlwvXC93c28yLm9yZ1wvY2xhaW1zXC9hcHBsaWNhdGlvbnRpZXIiOiJVbmxpbWl0ZWQiLCJodHRwOlwvXC93c28yLm9yZ1wvY2xhaW1zXC9rZXl0eXBlIjoiUFJPRFVDVElPTiIsImh0dHA6XC9cL3dzbzIub3JnXC9jbGFpbXNcL3ZlcnNpb24iOiIxLjAiLCJpc3MiOiJ3c28yLm9yZ1wvcHJvZHVjdHNcL2FtIiwiaHR0cDpcL1wvd3NvMi5vcmdcL2NsYWltc1wvYXBwbGljYXRpb25uYW1lIjoiVGFseW9uIiwiaHR0cDpcL1wvd3NvMi5vcmdcL2NsYWltc1wvZW5kdXNlciI6IkZEQkBjYXJib24uc3VwZXIiLCJodHRwOlwvXC93c28yLm9yZ1wvY2xhaW1zXC9lbmR1c2VyVGVuYW50SWQiOiItMTIzNCIsImh0dHA6XC9cL3dzbzIub3JnXC9jbGFpbXNcL3N1YnNjcmliZXIiOiJGREIiLCJodHRwOlwvXC93c28yLm9yZ1wvY2xhaW1zXC90aWVyIjoiR29sZCIsImh0dHA6XC9cL3dzbzIub3JnXC9jbGFpbXNcL2FwcGxpY2F0aW9uaWQiOiIxNDU2IiwiaHR0cDpcL1wvd3NvMi5vcmdcL2NsYWltc1wvdXNlcnR5cGUiOiJBUFBMSUNBVElPTiIsImV4cCI6MTU4OTQ2NjI0MSwiaHR0cDpcL1wvd3NvMi5vcmdcL2NsYWltc1wvYXBpY29udGV4dCI6IlwvY3VycmVudC1hY2NvdW50XC9jaGVxdWVzXC9hdXRvbWF0aWMtZGVwb3NpdHNcL2F0bVwvMS4wIn0=.K1iPtdXiuicuDPaLC6Exw/7UpJVW6Uy1tPpJlfZ29Vqs9M1zR00JpKxvymQMAzbD0GHlXPPsZmhDxOn0WMAPfr1Xi8tiruTLXNbwUPJ/SOovt+zK4JGtrydhc4iv2EROhMUk2uwJUb4DFjqKZRhBvtCW7fRtdtI9yJL4W4OK8Ld90yOb97usPjEPz8S4E4uNrb5lE2rLzIp+EaPwA232lDkhS8gGPIKdlLG1IdEfQ4cFU1VIplvWoHzprF9mGR0ahT2QGgmGE3AcBfkURk8VzIKDG/UcBA9eHu3XGg28j3OvIXWwJhd7Hi+jTqvggi0hplao8ElvjNBw/wNy2UO9WA==`
Run Code Online (Sandbox Code Playgroud)
jwks:
{"keys":[{"kty":"RSA","e":"AQAB","use":"sig","kid":"MjhhMDk2N2M2NGEwMzgzYjk2OTI3YzdmMGVhOGYxNjI2OTc5Y2Y2MQ","alg":"RS256","n":"zZU9xSgK77PbtkjJgD2Vmmv6_QNe8B54eyOV0k5K2UwuSnhv9RyRA3aL7gDN-qkANemHw3H_4Tc5SKIMltVIYdWlOMW_2m3gDBOODjc1bE-WXEWX6nQkLAOkoFrGW3bgW8TFxfuwgZVTlb6cYkSyiwc5ueFV2xNqo96Qf7nm5E7KZ2QDTkSlNMdW-jIVHMKjuEsy_gtYMaEYrwk5N7VoiYwePaF3I0_g4G2tIrKTLb8DvHApsN1h-s7jMCQFBrY4vCf3RBlYULr4Nz7u8G2NL_L9vURSCU2V2A8rYRkoZoZwk3a3AyJiqeC4T_1rmb8XdrgeFHB5bzXZ7EI0TObhlw"}]}
Run Code Online (Sandbox Code Playgroud)
那里看到的大多数示例都使用“kid”并且不相关,因为我的令牌标头没有它,它有“x5t”字段。
我还必须注意一件事,我的签名似乎是 base64 编码的,而不是 base64 url 编码的(它几乎扰乱了 Parse 方法的使用)。我尝试过使用 jwt.Parse() 我尝试过手动加密标头和有效负载 sha256 以及 RS256 和 base64 但没有显示成功。
我尝试过的事情:
const tokenString = `..`
func main() {
t, err := jwt.Parse(tokenStr, func(t *jwt.Token) (interface{}, error) {
return []byte("b6Nz3P2p0x5Aj_XClRhkT1s6SHA"), nil
})
}
Run Code Online (Sandbox Code Playgroud) 我是 OAuth 世界的新手,我试图了解使用 PKCE 相对于传统授权代码授予的好处。(我的许多假设可能是错误的,所以感谢您的指正。)
我是一名移动应用程序开发人员,根据 OAuth 文档,客户端机密不能在公共客户端的应用程序代码中进行硬编码。避免对客户端密钥进行硬编码的原因是,黑客可以反编译我的应用程序并获取我的客户端密钥。
黑客利用我的客户端密码和我的redirect_url,可以开发一个虚假的应用程序。如果最终用户 (User1) 下载真实应用程序和黑客的应用程序(两者),则虚假应用程序可以侦听真实应用程序回调并从中获取授权代码。通过授权代码(来自回调)和客户端密钥(通过反编译我的应用程序窃取),黑客可以获取授权令牌和刷新令牌,并能够获取 User1 的数据等。
如果其他用户下载真假应用程序,他们的数据也将面临危险。我对吗?黑客是否需要两者,或者他/她是否可以仅使用授权代码进行攻击?镜像的第五步需要客户端密钥和授权码吗?
这种攻击称为拦截攻击。
为了解决公共客户端应用程序中硬编码客户端密钥的问题,使黑客无法获取客户端密钥并窃取令牌,发明了 PKCE。使用 PKCE,客户端应用程序代码不需要对客户端密钥进行硬编码,因为 PKCE 不需要该信息来获取最终用户的令牌。
PKCE 流程创建一个随机字符串,将其转换为SHA-256哈希值和 Base64。在图像的第二点中,该编码字符串与客户端 id一起发送到身份验证服务器。然后,授权代码在回调中发送,如果任何恶意应用程序拦截该代码,它将无法获取令牌,因为图像的第五点需要由合法应用程序创建的原始随机字符串。
这很好,但如果不再需要客户端密钥来获取令牌来访问 User1 数据,我如何避免黑客开发一个假应用程序,该应用程序使用 PKCE 流和我的客户端 ID 并获取用户的令牌认为该应用程序是合法的?
由于图像的第五步不再需要客户端密钥来获取令牌,任何人都可以使用我的公共客户端 ID 开发虚假应用程序,如果任何用户下载虚假应用程序并执行 OAuth 流程,黑客就可以获取它的令牌并访问该用户的数据!
我对吗?
token ×10
jwt ×3
angular ×2
java ×2
access-token ×1
angular-http ×1
angularfire ×1
architecture ×1
asp.net ×1
c# ×1
cookies ×1
csrf ×1
go ×1
jwt-go ×1
oauth ×1
oauth-2.0 ×1
permissions ×1
pkce ×1
security ×1
spring ×1
string ×1
validation ×1