背景
我正在查看 OAuth 2.0 隐式授权流程,其中用户被重定向到身份验证服务,并且 JWT 令牌被发送回单页应用程序 (SPA)。令牌存储在 cookie 或本地存储中,在我看到的示例中,应用程序将根据是否可以在存储中找到令牌来隐藏/显示某些页面。
问题
问题是,在所有示例(来自服务提供商的官方示例)中,我能够手动将任何随机但格式正确的令牌添加到浏览器的本地存储中,并访问“安全”页面。
有人向我解释说,您无法在 SPA 中验证令牌,因为这需要暴露客户端机密,并且您应该在 API 服务器上验证令牌。这意味着您可以“隐藏”页面,但如果有人愿意,也很容易看到它们。话虽如此,您不太可能造成任何真正的损害,因为任何数据检索或操作都需要通过 API 服务器,并且应该在那里验证令牌。
这并不是真正的漏洞,但我看到的文档和示例并没有明确涵盖这种细微差别,我认为它可能会导致天真的程序员(比如我自己)认为某些页面是完全安全的,但实际上情况并非如此。
问题
如果有比我更了解情况的人确认这确实是 SPA 身份验证的工作原理,我将不胜感激。
Auth0如果我想在注册表中添加名字和姓氏字段,是否必须使用“锁定” ,或者我也可以通过通用登录在注册中添加这些附加字段吗?
我知道这些信用信息永远不应该出现在互联网上,但我在这里感到绝望+无论如何我都会在之后删除客户/租户。
\n我设置了一条路线:
\nrouter.get(\'/login\', cors, async (req, res) => {\n try {\n console.log(\'Entered\')\n await auth0.handleLogin(req, res)\n } catch (err) {\n return res.status(500).end()\n})\nRun Code Online (Sandbox Code Playgroud)\n线路Entered被打印出来,但是我不断发现 cors 错误,
Access to XMLHttpRequest at \'https://dev-..\' (redirected from \'http://localhost:3000/login\')\n from origin \'http://localhost:3000\' has been blocked by CORS policy: No \'Access-Control-Allow-Origin\' header is present on the requested resource.\nRun Code Online (Sandbox Code Playgroud)\n我已经把头发拉了好几个 h\xcc\xb6o\xcc\xb6u\xcc\xb6r\xcc\xb6s\xcc\xb6 天了。
\n我不确定为什么No \'Access-Control-Allow-Origin\' header is present on the requested resource会出现错误,因为我已经添加了cors包添加到我的自定义 Express …
我刚刚部署了新的 NextJs 博客应用程序https://blog.devdeveloper.ca/部署到 Vercal,但在使 auth0 正常工作时遇到问题。单击屏幕右上角的登录按钮时,用户将被重定向到 auth0 以完成身份验证流程。
在身份验证后重定向回我的应用程序时,我收到一个错误(checks.state 参数丢失),并且我似乎无法找到它发生的位置。
我发现这篇文章描述了 google chrome 在 2020 年对 SameSite 属性进行的更新。看来这可能与此有关,因为在我的控制台中我收到以下警告。
我想知道我的登录处理程序中是否缺少一些配置选项。
import { handleAuth, handleLogin } from '@auth0/nextjs-auth0';
export default handleAuth({
async login(req, res) {
try {
await handleLogin(req, res, {
authorizationParams: {
audience: `http://localhost:5000/`, // or AUTH0_AUDIENCE
// Add the `offline_access` scope to also get a Refresh Token
scope: 'openid profile email create:category delete:category update:category create:post update:post delete:post create:comment delete:comment', // or AUTH0_SCOPE
response_type: …Run Code Online (Sandbox Code Playgroud) 我使用 Auth0 来验证用户身份。
我受保护的 api 路由如下:
// pages/api/secret.js
import { withApiAuthRequired, getSession } from '@auth0/nextjs-auth0';
export default withApiAuthRequired(function ProtectedRoute(req, res) {
const session = getSession(req, res);
const data = { test: 'test' };
res.json({ data });
});
Run Code Online (Sandbox Code Playgroud)
我的问题是,当我尝试从 getServerSideProps 获取数据时,我收到 401 错误代码。
如果我使用 useEffect 我可以从 api 路由获取数据。
我试图像这样获取数据:
export const getServerSideProps = withPageAuthRequired({
async getServerSideProps(ctx) {
const res = await fetch('http://localhost:3000/api/secret');
const data = await res.json();
return { props: { data } };
},
});
Run Code Online (Sandbox Code Playgroud)
我收到以下响应:错误:“not_authenticated”,描述:“用户没有活动会话或未经过身份验证”
大家有什么想法吗?谢谢!!
当有人通过 Auth0 登录我的网站时,我会从 Auth0 获取 JWT 令牌。该令牌告诉我此人的 UID,并允许我从前端向后端进行 API 调用,在后端我可以验证 JWT 令牌以确保请求来自已登录的用户。
在https://jwt.io上,您可以粘贴任何 JWT 令牌,它会解析它并验证签名。
有谁知道我如何在 python 中做到这一点?
Auth0 没有给我 JWT 令牌的私钥,所以我无法使用jwt.decode().
相反,我需要以某种方式用它的公钥解析 JWT 令牌,但我不确定如何在 python 中检索它。
这是 JWT 令牌:
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImZneF9xWEJVNWt0ZzZXSlNLdTJIdiJ9.eyJuaWNrbmFtZSI6ImpvaG5fbWFyayIsIm5hbWUiOiJqb2huX21hcmtAb3V0bG9vay5jb20iLCJwaWN0dXJlIjoiaHR0cHM6Ly9zLmdyYXZhdGFyLmNvbS9hdmF0YXIvNTMxZmJlZjcxN2I1NzVmYjU3MGJlYzcxNTBlOWQ4MTA_cz00ODAmcj1wZyZkPWh0dHBzJTNBJTJGJTJGY2RuLmF1dGgwLmNvbSUyRmF2YXRhcnMlMkZqby5wbmciLCJ1cGRhdGVkX2F0IjoiMjAyMi0wNC0wNVQxNDoyMzozNy42NTFaIiwiZW1haWwiOiJqb2huX21hcmtAb3V0bG9vay5jb20iLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsImlzcyI6Imh0dHBzOi8vZGV2LW44Z2h5a3lvLnVzLmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHw2MTdiZTllMzJhMmYyNjAwNmEzZDlhM2EiLCJhdWQiOiIwUGwwR1F5cFhjNkZEakxhb0JuSjhzOEtNZjVKZ3J4bSIsImlhdCI6MTY0OTE2ODYyMiwiZXhwIjoxNjQ5MjA0NjIyLCJub25jZSI6IlJuTjBmbFoyU0Vkck4wSkhRV1EyY21FMk1rNUpXVlUzTW1jM2RtaHlXVkJWYm5oalowMUNUR1paU3c9PSJ9.NQBQPoEj6wzYzclrQzXAWh124gyg_Nf1UYZR4lAuqHZ-fdFycrBMA0Y0dBSvQ-WI7YZOMAPjCRK0nuxKzj9kMQ0c-3finCgsl411tX5tvaX_Khe116le_eyBV28aQQLjqT0zvLaSgIYaJqcgshQ1bYvJp8UXPf8GkMWCD89pnqYPwexx9nsWjrnikInLY9oSbWYN1zA7DxwhygI_JeQc6Cvu6pl1xq8m_WZaCMSOJS2umyl_7vfA84cDX1Zz8aVWEOMinnbmR48sY79cEiIMplcYJA3QH4yFEawSWbzWnVUcv9VCgCJ7fCbqikF86fz2TrWYrI6eATJoVHOXDNDKwA
Run Code Online (Sandbox Code Playgroud) 我正在构建一个Angular2应用程序,使用Auth0进行身份验证,使用AngularFire进行数据库.在我的构造函数中,我传递了我的AngularFire af实例,但我无法在回调事件中访问它.有没有其他方法可以访问我的AngularFire实例?
// app/auth.service.ts
import { Injectable } from '@angular/core';
import { tokenNotExpired } from 'angular2-jwt';
import { AngularFire, AuthMethods, AuthProviders } from 'angularfire2';
// Avoid name not found warnings
declare var Auth0Lock: any;
declare var Auth0: any;
@Injectable()
export class Auth {
// Configure Auth0
lock = new Auth0Lock('AUTH0_CLIENT_ID', 'AUTH0_DOMAIN', {});
constructor(private af: AngularFire) {
// Add callback for lock `authenticated` event
this.lock.on("authenticated", (authResult) => {
this.lock.getProfile(authResult.idToken, function(error:any, profile:any){
if(error){
throw new Error(error);
}
localStorage.setItem('id_token', authResult.idToken);
localStorage.setItem('profile', JSON.stringify(profile));
var …Run Code Online (Sandbox Code Playgroud) 我目前正在编写Auth0教程,位于此处:
https://auth0.com/docs/quickstart/spa/react/04-authorization
并且我正努力在管理员用户的上下文中理解范围的概念.
具体来说,以下文字......
由于此范围表示用户具有对数据的只读访问权限,因此可能认为用户具有某种"常规用户"访问级别.
如果您希望某些用户具有对同一资源的写访问权限,从而具有某种"管理员"访问级别,您可以考虑引入write:messages范围.
通过将write:messages作为范围添加到我的控制面板中的api,可以为每个用户请求并设置它.
这根本感觉不对.所以我试图通过规则解决这个问题.
function (user, context, callback) {
if(user.app_metadata.roles.indexOf('admin') > -1) {
console.log(context);
context.accessToken.scope = 'write:messages';
}
callback(null, user, context);
}
Run Code Online (Sandbox Code Playgroud)
在我的app_metadata对象中,我给了我的管理员用户,admin的角色.此规则有效,现在登录时,开发工具中显示的范围是"write:messages".
但是,现在已删除了初始范围,例如"openid read:messages"等
我哪里错了?如果用户是管理员,我想分配添加到现有范围.
这是范围/索赔的正确过程吗?
我想将用户重定向到登录工作流程之前他所在的当前页面。
是否有可能将其他信息传递给auth0-js(例如{from: '/profile'})?
这是我在React应用程序中对Auth0-js的初始化:
auth0 = new auth0.WebAuth({
domain: 'xxx.auth0.com',
clientID: 'xxx',
redirectUri: 'http://localhost:3000/callback',
audience: 'https://xxx.auth0.com/userinfo',
responseType: 'token id_token',
scope: 'openid profile offline_access'
});
Run Code Online (Sandbox Code Playgroud)
要记录用户:
auth0.authorize();
Run Code Online (Sandbox Code Playgroud)
如果不将信息存储在localStorage中,我找不到方法。