Freigeben über


XUserGetTokenAndSignatureResult

Gets the result of a call to XUserGetTokenAndSignatureAsync.

Syntax

HRESULT XUserGetTokenAndSignatureResult(  
         XAsyncBlock* async,  
         size_t bufferSize,  
         void* buffer,  
         XUserGetTokenAndSignatureData** ptrToBuffer,  
         size_t* bufferUsed  
)  

Parameters

async   _Inout_
Type: XAsyncBlock*

An XAsyncBlock for polling the call's status and retrieving call results.

bufferSize   _In_
Type: size_t

The size of the buffer in the buffer parameter.

buffer   _Out_writes_bytes_to_(bufferSize,bufferUsed)
Type: void

Contains the results of the call to XUserGetTokenAndSignatureAsync.

ptrToBuffer   _Outptr_
Type: XUserGetTokenAndSignatureData**

On return, prtToBuffer points to the buffer you specify in the buffer parameter. The parameter provides a typed pointer to buffer and doesn't need to be freed independently.

bufferUsed   _Out_opt_
Type: size_t*

The number of bytes written in the buffer parameter.

Return value

Type: HRESULT

Returns S_OK if successful; otherwise, returns an error code.

HRESULT Message ID Description
0x80072EE7 WININET_E_NAME_NOT_RESOLVED The server name or address couldn't be resolved.
0x80072EFD WININET_E_CANNOT_CONNECT A connection with the server couldn't be established.
0x80072EFE WININET_E_CONNECTION_ABORTED The connection with the server was terminated abnormally.
0x80072F8F WININET_E_DECODING_FAILED Content decoding failed.
0x8015DC01 XO_E_SYSTEM_UPDATE_REQUIRED System must be updated before being allowed to grant X-tokens.
0x8015DC0B XO_E_ACCOUNT_COUNTRY_NOT_AUTHORIZED Title trying to be used in a country/region it isn't authorized for.
0x8015DBFF XO_E_GAME_USAGE_BY_USER_EXCEEDED User exceeded their allotted time allowed to play the game (parental controls).
0x80860006 ONL_E_FORCESIGNIN To help protect your Online ID account, you must sign in again.
0x87DD0006 AM_E_XSTS_UNEXPECTED Unknown error occurred.
0x87DD0013 AM_E_USER_NOT_FOUND User object is no longer signed in or is unknown.
0x87DD0019 AM_E_XSTS_TIMEOUT Timeout limit hit when trying to retrieve the X-token.
0x87DD0022 AM_E_XTITLE_TIMEOUT
0x87DD0033 AM_E_XSTS_SERVICE_UNAVAILABLE The X token service is unable to be reached.

For a list of other error codes, see Error Codes.

Remarks

To asynchronously retrieve X-tokens and signatures for web requests, call XUserGetTokenAndSignatureAsync.

To retrieve the required buffer size to hold the results of calling XUserGetTokenAndSignatureAsync, call XUserGetTokenAndSignatureResultSize.

The following example demonstrates how to asynchronously retrieve the token and signature of a user.

HRESULT RequestTokenComplete(XAsyncBlock* abResult)
{
    size_t bufferSize;
    RETURN_IF_FAILED(XUserGetTokenAndSignatureResultSize(abResult, &bufferSize));

    std::vector<uint8_t> buffer(bufferSize);
    XUserGetTokenAndSignatureData* data;
    if (SUCCEEDED_LOG(XUserGetTokenAndSignatureResult(abResult, buffer.size(), buffer.data(), &data, nullptr /*bufferUsed*/)))
    {
        appLog.AddLog("Token: %s\n", data->token);
        if (data->signature != nullptr)
        {    
            appLog.AddLog("Signature: %s\n", data->signature);
        }
    }

    return S_OK;
}

HRESULT RequestTokenAsync(
    XTaskQueueHandle queue,
    const char* url,
    bool forceRefresh)
{
    auto asyncBlock = std::make_unique<XAsyncBlock>();
    ZeroMemory(asyncBlock.get(), sizeof(*asyncBlock));
    asyncBlock->queue = queue;
    asyncBlock->context = this;
    asyncBlock->callback = [](XAsyncBlock* ab)
    {
        LOG_IF_FAILED(static_cast<User*>(ab->context)->RequestTokenComplete(ab));
        delete ab;
    };


    XUserGetTokenAndSignatureOptions options = XUserGetTokenAndSignatureOptions::None;

    if (forceRefresh)
    {
        WI_SET_FLAG(options, XUserGetTokenAndSignatureOptions::ForceRefresh);
    }

    static const XUserGetTokenAndSignatureHttpHeader headers[] =
    {
        { "Accept", "application/json"},
        { "Why", "Because"},
    };

    if (SUCCEEDED_LOG(XUserGetTokenAndSignatureAsync(
        _handle.get(),
        options,
        "GET",
        url,
        ARRAYSIZE(headers),
        headers,
        0,
        nullptr,
        asyncBlock.get())))
    {
        // The call succeeded, so release the std::unique_ptr ownership of XAsyncBlock* since the callback will take over ownership.
        // If the call fails, the std::unique_ptr will keep ownership and delete the XAsyncBlock*
        asyncBlock.release();
    }

    return S_OK;
}

Requirements

Header: XUser.h

Library: xgameruntime.lib

Supported platforms: Windows, Steam Deck, Xbox One family consoles, and Xbox Series consoles

See also

XUser

XUserGetTokenAndSignatureAsync

XUserGetTokenAndSignatureResultSize