在我的node.js应用程序中,我做了一个,npm install btoa-atob以便我可以使用btoa()和atob()函数,这些函数在客户端javascript中是原生的,但由于某种原因未包含在节点中.新目录显示在我的node_modules文件夹中,该文件夹本身与app.js一起位于root目录中.然后我确保在我的package.json文件中添加btoa-atob作为依赖项,该文件位于root中.
但是,由于某种原因,它仍然无法正常工作.
console.log(btoa("Hello World!"));
Run Code Online (Sandbox Code Playgroud)
^应该输出"SGVsbG8gV29ybGQh"到控制台,但我得到错误"btoa不是defiend".
我没有正确安装吗?我忽略了什么?
我正在使用Javascript window.atob()函数来解码base64编码的字符串(特别是GitHub API中的base64编码内容).问题是我得到了ASCII编码的字符(â¢而不是™).如何正确处理传入的base64编码流,以便将其解码为utf-8?
如何获取 keycloak 中 userinfo 端点的回复中包含的角色。我在 keycloak 中为用户定义了一个“角色映射”。当我调用 userinfo 端点时,我得到了电子邮件名称等字段,但回复中不包含角色。当我调用 auth 端点时,我得到了 access_token 并且在字段范围中包含了角色。这是来自 auth 端点的回复:
access_token" QJsonValue(string, "eyJhb...")
"expires_in" QJsonValue(double, 300)
"not-before-policy" QJsonValue(double, 0)
"refresh_expires_in" QJsonValue(double, 1800)
"refresh_token" QJsonValue(string, "eyJhb...")
"scope" QJsonValue(string, "profile email roles")
"session_state" QJsonValue(string, "20b48536-4b38-4aa6-9072-e8309833402e")
"token_type" QJsonValue(string, "bearer")
Run Code Online (Sandbox Code Playgroud)
我还尝试使用属性“scope=roles”调用 userinfo 端点,但这不起作用。
我正在构建一个浏览器应用程序,需要使用链接中概述的 OAuth 2.0/JWT 工作流程向 Google 进行身份验证。
在使用 Google OAuth 2.0 成功进行用户身份验证的情况下,Google API 会向应用程序 OAuth 发送如下响应:
{
"clientId": "xxx...apps.googleusercontent.com",
"credential": "yyy...123...zzz",
"select_by": "user"
}
Run Code Online (Sandbox Code Playgroud)
我有一个 client_id 并使用 NodeJS + JS。
用户通过身份验证后,如何向应用程序提供真实的用户数据?
我想解码使用 Postman 收到的 jwt 令牌并在 REST API 中实现它。我怎样才能做到这一点?我看到人们发布了解码 jwt 令牌的代码(参考:如何在不使用库的情况下在 javascript 中解码 jwt 令牌?),但我不明白如何在邮递员中执行此操作?解码 jwt 需要什么 url?需要什么标头、授权?
在服务器端,我有这些代码登录:
return jsonify({'email': email, 'token': create_token(email, isAdmin, password)})
Run Code Online (Sandbox Code Playgroud)
在客户端,我需要代码来检查登录和isAdmin.
isLogged() {
if (localStorage.getItem('currentUser') &&
JSON.parse(localStorage.getItem('currentUser')).email) {
return true;
}
return false;
}
isAdmin(){
//???
}
Run Code Online (Sandbox Code Playgroud)
如何从令牌获取用户角色?
我有一个在 Vue 路由器中运行“beforeEnter”的函数来验证用户是否已通过身份验证,否则会触发一条消息。
它检查 (jwt) 是否token保存在localStorage- 如果用户手动注销,这会起作用,因为它会从localStorage. 但是,当令牌过期时,它仍然保留在中,localStorage因此该函数认为 ( (localStorage.token)) 用户已登录。
由于令牌无效,服务器仍然会阻止发出的任何请求 - 因此是安全的。
在页面加载之前,如何在“beforeEnter”中间件中检查服务器端令牌的有效性?
我是否需要创建一个端点来检查令牌有效性并返回结果?(我正在使用 fetch(),但是我见过人们使用 axios 拦截器......)
我没有使用VUEX,这没什么价值,而且似乎有更多细节?
function protectedPage(to, from, next) {
if (localStorage.token) {
next();
} else {
Vue.toasted.show("The session has ended. Please login.", {
theme: "toasted-primary",
position: "top-center",
duration: null,
action: {
text: "Login",
onClick: (e, toastObject) => {
next("/");
toastObject.goAway(0);
}
}
});
next("/");
}
}
Run Code Online (Sandbox Code Playgroud) 我正在使用signInWithCustomToken,经过身份验证后,找不到在服务器端设置的自定义声明数据存储在哪里(createCustomToken)。
我可以通过auth.token在firebase规则中看到它们,但是如何在我的javascript代码中通过firebase对象访问它们。
我正在开发一个将 JWT 令牌存储在 cookie 中的网站。我想要做的是,创建 Javascript 来解码令牌并提取我需要的值并将其传递给我的同事编写的另一个 Javascript。我的问题是,是否有用于 JWT 令牌解码的客户端 javascript 库可以从我的脚本中导入?
我一直在阅读有关JWT的内容,我知道它由三个部分组成,即header、payload和signature。
我将哈希算法保留在标头中,将基本信息保留在有效负载中,例如。有效负载中的名称、年龄、角色、到期日等,然后将这两者都进行 Base64 编码,然后使用标头中指定的算法进行哈希处理以获得 JWT
username和登录的前端password。secret key生成 JWT 的方法。问题:
secret key我如何在前端得到这个?我们的证书是 Comodo Positive SSL。
我们正在尝试使用 Php 和https://github.com/firebase/php-jwt这个库解码从“使用 Apple Id API 签名”给出的 JWT 。当我们运行 decode 它会给我们
A PHP Error was encountered
Severity: Warning
Message: openssl_verify(): supplied key param cannot be coerced into a public key
Filename: php-jwt/JWT.php
Line Number: 231
Array ( [status] => [message] => OpenSSL error: error:0906D06C:PEM routines:PEM_read_bio:no start line )
Run Code Online (Sandbox Code Playgroud)
我们不知道该怎么办.. 如果我们将 RS256 更改为 HS256,它会给我们
Array ( [status] => [message] => Algorithm not allowed )
Run Code Online (Sandbox Code Playgroud) 因此,当您在https://jwt.io/中解码以下内容时, 它说它具有一个名为“ token”的标头,在重新解码它时它具有令牌,您可以访问有效负载。
通常在RN中,我可以使用this.props.user.token访问包含令牌的有效负载,但是在React中,“ token”属性不存在,因为它不是JavaScript对象,而是字符串,但是我在后端使用相同的API。
eyJ0b2tlbiI6ImV5SmhiR2NpT2lKSVV6STFOaUlzSW5SNWNDSTZJa3BYVkNKOS5leUpwWkhCaGMzTWlPaUl6WkRFME1ERmlNQzFtTkdWakxURXhaVGN0WVdReE15MHpaRGRsTUdZME9EUmlaR0k2TVRsaU4yTmpNREUyWVRVeU1ERTRNemt3TmpsbU56aGxNV0pqTXpBMk4yUTBZalJqTVRrNE1HTTBPV05tWkRsak9XWTRNV1F4Tm1VMllUbGhaR1JrTVNJc0ltbGhkQ0k2TVRVeE5UY3lNalF6TkgwLlg0dGUxRmhzbGJlcW5Id3RCQ2NOMHF5Zk9vb2tvdVN2TXRlLVBUTUtrMHcifQ==
Run Code Online (Sandbox Code Playgroud)
我尝试使用解码
var decoded = jwt.decode(response.data);
Run Code Online (Sandbox Code Playgroud)
但是解码为null,该怎么办?
我有以下代码来解码 Javascript 中的 Jwt 令牌(参考:如何解码 javascript 中的 jwt 令牌)
const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c';
function parseJwt(token) {
var base64Url = token.split('.')[1];
var base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
console.log(JSON.parse((atob(base64))))
};
parseJwt(token);Run Code Online (Sandbox Code Playgroud)
我从上面的代码中获取了我需要的有效负载,但是我在节点中实现它,我们没有“atob”函数来解码base64编码的字符串
看来我们需要在节点中使用Buffer。我进行了研究并提出了以下不起作用的解决方案。
const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c';
function parseJwt(token) {
const base64Url = token.split('.')[1];
const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
const buff = new Buffer(base64, 'base64');
const payloadinit = buff.toString('ascii');
const payload = JSON.parse(payloadinit);
console.log(payload)
};
parseJwt(token);Run Code Online (Sandbox Code Playgroud)
如果有更好的方法,请告诉我 - 无库(Jwt 或解码 Jwt)