首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >X令牌验证在SAPUI5中失败

X令牌验证在SAPUI5中失败
EN

Stack Overflow用户
提问于 2014-02-18 08:02:17
回答 1查看 16.1K关注 0票数 0

我正在从调用SAPUI5网关的服务。我已经为获得CSRF编写了如下代码,但我无法得到它。它要求我输入用户名和密码,如图像所示。

代码:

代码语言:javascript
运行
复制
function onSave()
{
    useroDataModel = newsap.ui.model.odata.ODataModel("proxy/sap/opu/odata/sap/ZUI_GROUP1_CREATE");

    empid = oTF2.getValue();
    empname = oTF1.getValue();
    empaddr = oTF.getValue();
    empdoj = oDP.getValue();

    uilogon();

    useroDataModel.read("/zui_group1_createCollection(im_emp_id='"+empid+"')", null, null, true, fnSuccess, fnError);

    useroDataModel.setHeaders({
         "X-CSRF-Token": "Fetch"  // auth 
    });

    function fnSuccess(data,response)
    {
        //alert(response.headers['x-csrf-token']);
        var header_xcsrf_token = response.headers['x-csrf-token'];
        //alert(header_xcsrf_token);
        var createrequestdata = {
            im_emp_id : empid,
            im_emp_name : empname(),
            im_emp_addr : empaddr(),
            im_emp_doj : empdoj()
        };

        useroDataModel.setHeaders({
             "X-Requested-With": "XMLHttpRequest",                         
             "Content-Type": "application/atom+xml",  
             "DataServiceVersion": "2.0",   
            "Accept": "application/atom+xml,application/atomsvc+xml,application/xml",  
             "X-CSRF-Token": header_xcsrf_token   
        });

        useroDataModel.create("/zui_g2_createCollection", createrequestdata, null, fnS, fnE);

        function fnS(response){
             if(response.ex_status == "Entry Created.")
                 {
                 alert("Created.");
                 }
             else
                {
                 alert("Failed.");
                }
         }
         function fnE(Error){
             alert("error in create"+Error.message);
         }

    }

    function fnError(oError)
    {
        alert("Error in read"+oError.message);
    }
}

function uilogon()
{
    var tok  = "username" + ':' + "password";  
    var hash = btoa(tok);  
    auth = "Basic" + hash; 
//  alert(auth);
    // Save to Local Storage  
//  $.sap.require("jquery.sap.storage");  
//  var UI5Storage = $.sap.storage(jQuery.sap.storage.Type.session);  
//  UI5Storage.remove("Auth");  
//  UI5Storage.put("Auth",auth);  
    useroDataModel.setHeaders({
        //'Accept-Encoding': "gzip",
        "Authorization" : auth});
//  alert("dne");
}

我能够在auth变量中获取CSRF令牌。但是它要求我输入SAP网关的用户名和密码,但是如果我输入登录所通过的用户名和密码,它就不接受。

EN

回答 1

Stack Overflow用户

发布于 2014-02-18 11:35:56

如果您想要使用您的身份验证方法,您将需要在ODataModel实例化之前进行身份验证,您不能读取元数据,更不用说获取CSRF令牌了,除非经过身份验证,还需要在发布之前获取该令牌。

为什么不将用户名和密码传递给ODataModel的构造函数

代码语言:javascript
运行
复制
var oModel = new sap.ui.model.odata.ODataModel(sServiceUrl, bJSON, sUser, sPwd);

一旦通过身份验证,如果使用绑定功能,CSRF安全令牌将为您读取,如果您想使用oModel.read,可以手动读取。

代码语言:javascript
运行
复制
oModel.refreshSecurityToken()
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21847510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档