在Oauth2.0授权流中,您将access_token和refresh_token存储在何处以及如何存储

yrefmtwq  于 2022-12-11  发布在  其他
关注(0)|答案(1)|浏览(413)

如何以安全的方式存储和使用从Twitter API v2获得的访问和刷新令牌?
我不能只存储access_token和refresh_token,对吧?我需要某种标识符,并且可能将该标识符保存在客户机中。
在这方面是否有任何建议的办法或最佳做法?如有任何指导,我将不胜感激。

6bc51xsx

6bc51xsx1#

这里有一些来自OWASP JWT for Java备忘录的信息(他们的示例代码是Javascript)。
1.使用浏览器sessionStorage容器存储令牌,或者使用JavaScript闭包和私有变量
1.在调用服务时,使用JavaScript将其添加为承载HTTP身份验证标头。
1.将指纹信息添加到令牌。

(4).在浏览器sessionStorage中存储令牌的另一种方法是使用JavaScript私有变量或闭包。在这种方法中,对所有Web请求的访问都是通过一个JavaScript模块来路由的,该模块将令牌封装在一个私有变量中,只有从模块内部才能访问该变量。下面是实现示例。

/* Handle request for JWT token and local storage*/
function authenticate() {
    const login = $("#login").val();
    const postData = "login=" + encodeURIComponent(login) + "&password=test";

    $.post("/services/authenticate", postData, function (data) {
        if (data.status == "Authentication successful!") {
            ...
            sessionStorage.setItem("token", data.token);
        }
        else {
            ...
            sessionStorage.removeItem("token");
        }
    })
    .fail(function (jqXHR, textStatus, error) {
        ...
        sessionStorage.removeItem("token");
    });
}


/* Handle request for JWT token validation */
function validateToken() {
    var token = sessionStorage.getItem("token");

    if (token == undefined || token == "") {
        $("#infoZone").removeClass();
        $("#infoZone").addClass("alert alert-warning");
        $("#infoZone").text("Obtain a JWT token first :)");
        return;
    }

    $.ajax({
        url: "/services/validate",
        type: "POST",
        beforeSend: function (xhr) {
            xhr.setRequestHeader("Authorization", "bearer " + token);
        },
        success: function (data) {
            ...
        },
        error: function (jqXHR, textStatus, error) {
            ...
        },
    });
}


function myFetchModule() {
    // Protect the original 'fetch' from getting overwritten via XSS
    const fetch = window.fetch;

    const authOrigins = ["https://yourorigin", "http://localhost"];
    let token = '';

    this.setToken = (value) => {
        token = value
    }

    this.fetch = (resource, options) => {
        let req = new Request(resource, options);
        destOrigin = new URL(req.url).origin;
        if (token && authOrigins.includes(destOrigin)) {
            req.headers.set('Authorization', token);
        }
        return fetch(req)
    }
}

...

// usage:
const myFetch = new myFetchModule()

function login() {
  fetch("/api/login")
      .then((res) => {
          if (res.status == 200) {
              return res.json()
          } else {
              throw Error(res.statusText)
          }
      })
      .then(data => {
          myFetch.setToken(data.token)
          console.log("Token received and stored.")
      })
      .catch(console.error)
}

...

// after login, subsequent api calls:
function makeRequest() {
    myFetch.fetch("/api/hello", {headers: {"MyHeader": "foobar"}})
        .then((res) => {
            if (res.status == 200) {
                return res.text()
            } else {
                throw Error(res.statusText)
            }
        }).then(responseText => console.log("helloResponse", responseText))
        .catch(console.error)
}

希望这对你有帮助!

相关问题