AnsweredAssumed Answered

Getting 498: Invalid Token from AGS Server after performing Token Exchange

Question asked by johnmdye on Feb 4, 2016

I'm trying to submit a very simply geocodeAddresses request to an ArcGIS for Server instance that is federated with Portal for ArcGIS. Getting the Portal Token and exchanging it for a Server token works fine and I can print the tokens and they are valid. However, when I submit the geocodeAddresses request to the Federated Server which hosts the Geocoding Service, the server responds with 498: Invalid Token. How could the token be invalid? The Portal just generated the token for the federated server!

 

import urllib
import urllib2
import httplib
import time
import json
import contextlib


def submit_request(request):
    """ Returns the response from an HTTP request in json format."""
    with contextlib.closing(urllib2.urlopen(request)) as response:
        job_info = json.load(response)
        return job_info


def get_PortalToken(username, password):
    """ Returns an authentication token for use in ArcGIS Online."""


    # Set the username and password parameters before
    #  getting the token.
    #
    params = {"username": username,
              "password": password,
              "client": "requestip",
              "f": "json"}


    token_url = "{}/generateToken".format("https://gis.my.domain.com/webadaptor/sharing/rest")
    request = urllib2.Request(token_url, urllib.urlencode(params))
    token_response = submit_request(request)
    if "token" in token_response:
        print("Getting token...")
        token = token_response.get("token")
        return token
    else:
        if "error" in token_response:
            error_mess = token_response.get("error", {}).get("message")
            raise Exception("Portal error: {} ".format(error_mess))


def PortalToken_to_ServerToken(PortalToken):
    """Exchanges a Portal Token for a Server Token to provide access to restricted resources hosted on a Server federated with Portal"""
    params = {"token":PortalToken,
              "serverURL": "https://kdcpgis02.my.domain.com:6443/arcgis",
              "f":"json"}
    tokenURL = "{}/generateToken".format("https://gis.my.domain.com/webadaptor/sharing/rest")
    request = urllib2.Request(tokenURL, urllib.urlencode(params))
    tokenResponse = submit_request(request)
    if "token" in tokenResponse:
        print("Exchanging token...")
        token = tokenResponse.get("token")
        print("Success")
        return token
    else:


        if "error" in token_response:
            error_mess = token_response.get("error", {}).get("message")
            raise Exception("Portal error: {} ".format(error_mess))


def geocodeAddresses(token, addresses):
    """ Returns the result from a geocodeAddresses request"""


    params = {"token": token,
              "addresses": addresses,
              "f": "json"}


    geocode_url = "{}/geocodeAddresses".format("https://kdcpgis02.my.domain.com:6443/arcgis/rest/services/GeocodeServices/USAGeocodingService/GeocodeServer/")
    request = urllib2.Request(geocode_url, urllib.urlencode(params))
    geocode_response = submit_request(request)
    if "error" in geocode_response:
        error_msg = geocode_response.get("error", {}).get("message")
        raise Exception("Error: {}".format(error_msg))
    else:
        return geocode_response


# EXECUTION STATEMENTS
pToken = get_PortalToken("username", "password")
sToken = PortalToken_to_ServerToken(pToken)
addresses = '"records":[{"attributes":{"OBJECTID":1,"Address":"380 New York St.","City":"Redlands","Region":"CA","Postal":"92373"}},{"attributes":{"OBJECTID":2,"Address":"1 World Way","City":"Los Angeles","Region":"CA","Postal":"90045"}}]'
geocodeAddresses(sToken, addresses)

Outcomes