green-cartoon-16392
12/03/2022, 1:30 PMpackage main
import (
"bytes"
"encoding/json"
"errors"
"fmt"
"io/ioutil"
"net/http"
)
type PasswordRequest struct {
CsrfToken string `json:"csrf_token"`
Identifier string `json:"traits.email"`
Password string `json:"password"`
Method string `json:"method"`
}
func getActionUrl(jsonResponse []byte) (string, error) {
var jsonResponseData map[string]interface{}
err := json.Unmarshal(jsonResponse, &jsonResponseData)
if err != nil {
return "", err
}
// UI is the JSON field that ORY send us to build the register form
uiJsonField := jsonResponseData["ui"].(map[string]interface{})
// Clause Guard that verify if the ui is not null
if uiJsonField == nil {
return "", errors.New("The JSON field 'ui' doesn't exists")
}
actionUrl := uiJsonField["action"]
if actionUrl == nil {
return "", errors.New("The json field 'ui/action' doesn't exists")
}
return actionUrl.(string), nil
}
func getCrsfToken(jsonResponse []byte) (string, error) {
var jsonResponseData map[string]interface{}
err := json.Unmarshal(jsonResponse, &jsonResponseData)
if err != nil {
return "", err
}
// UI is the JSON field that ORY send us to build the register form
uiJsonField := jsonResponseData["ui"].(map[string]interface{})
// Clause Guard that verify if the ui is not null
if uiJsonField == nil {
return "", errors.New("The JSON field 'ui' doesn't exists")
}
// In UI we have a 'nodes' that give us a list of <input> to build our form
inputListJsonField := uiJsonField["nodes"].([]interface{})
if inputListJsonField == nil {
return "", errors.New("The JSON field 'ui/nodes' doesn't exists")
}
// Attributes give us the attributes for the input. The value returned is the CRSF token
crsf_token := inputListJsonField[0].(map[string]interface{})["attributes"].(map[string]interface{})["value"]
if crsf_token == nil {
return "", errors.New("The JSON field 'ui/nodes/attributes/value' doesn't exists")
}
return crsf_token.(string), nil
}
func main() {
// HTTP GET Request to initialize the flow
req, err := http.NewRequest("GET", "<http://localhost:4433/self-service/registration/browser>", nil)
if err != nil {
panic(err)
}
// Set headers
req.Header.Set("Accept", "application/json")
// Execute the request
client := &http.Client{}
resp, err := <http://client.Do|client.Do>(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
// From the GET Request we can make the POST request to the actionUrl
// Read the response body
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
panic(err)
}
crsf_token, err := getCrsfToken(body)
if err != nil {
fmt.Println("Error in retrieving crsf_token : ", err)
}
actionUrl, err := getActionUrl(body)
passwordRequest := PasswordRequest{
CsrfToken: crsf_token,
Identifier: "<mailto:test1312@gmail.com|test1312@gmail.com>",
Password: "RandomPassword1234!",
Method: "password",
}
passwordRequestStr, _ := json.Marshal(passwordRequest)
postReq, err := http.NewRequest("POST", actionUrl, bytes.NewBuffer(passwordRequestStr))
postReq.Header.Set("Content-Type", "application/json")
// We set the cookies and headers for CSRF
postReq.Header.Set("X-CSRF-Token", crsf_token)
cookie := &http.Cookie{
Name: "csrf_token",
Value: crsf_token,
}
postReq.AddCookie(cookie)
postClient := &http.Client{}
postResp, err := <http://postClient.Do|postClient.Do>(postReq)
postBody, err := ioutil.ReadAll(postResp.Body)
if err != nil {
panic(err)
}
fmt.Println(string(postBody))
}
But i keep getting a CRSF Token error
{
"error": {
"id": "security_csrf_violation",
"code": 403,
"status": "Forbidden",
"reason": "Please retry the flow and optionally clear your cookies. The request was rejected to protect you from Cross-Site-Request-Forgery (CSRF) which could cause account takeover, leaking personal information, and other serious security issues.",
"details": {
"docs": "<https://www.ory.sh/kratos/docs/debug/csrf>",
"hint": "The anti-CSRF cookie was found but the CSRF token was not included in the HTTP request body (csrf_token) nor in the HTTP Header (X-CSRF-Token).",
"reject_reason": "The HTTP Cookie Header was set and a CSRF token was sent but they do not match. We recommend deleting all cookies for this domain and retrying the flow."
},
"message": "the request was rejected to protect you from Cross-Site-Request-Forgery"
}
}
green-cartoon-16392
12/03/2022, 1:43 PMpackage main
import (
"bytes"
"encoding/json"
"errors"
"fmt"
"io/ioutil"
"net/http"
)
type PasswordRequest struct {
CsrfToken string `json:"csrf_token"`
Identifier string `json:"traits.email"`
Password string `json:"password"`
Method string `json:"method"`
}
func getActionUrl(jsonResponse []byte) (string, error) {
var jsonResponseData map[string]interface{}
err := json.Unmarshal(jsonResponse, &jsonResponseData)
if err != nil {
return "", err
}
// UI is the JSON field that ORY send us to build the register form
uiJsonField := jsonResponseData["ui"].(map[string]interface{})
// Clause Guard that verify if the ui is not null
if uiJsonField == nil {
return "", errors.New("The JSON field 'ui' doesn't exists")
}
actionUrl := uiJsonField["action"]
if actionUrl == nil {
return "", errors.New("The json field 'ui/action' doesn't exists")
}
return actionUrl.(string), nil
}
func getCrsfToken(jsonResponse []byte) (string, error) {
var jsonResponseData map[string]interface{}
err := json.Unmarshal(jsonResponse, &jsonResponseData)
if err != nil {
return "", err
}
// UI is the JSON field that ORY send us to build the register form
uiJsonField := jsonResponseData["ui"].(map[string]interface{})
// Clause Guard that verify if the ui is not null
if uiJsonField == nil {
return "", errors.New("The JSON field 'ui' doesn't exists")
}
// In UI we have a 'nodes' that give us a list of <input> to build our form
inputListJsonField := uiJsonField["nodes"].([]interface{})
if inputListJsonField == nil {
return "", errors.New("The JSON field 'ui/nodes' doesn't exists")
}
// Attributes give us the attributes for the input. The value returned is the CRSF token
crsf_token := inputListJsonField[0].(map[string]interface{})["attributes"].(map[string]interface{})["value"]
if crsf_token == nil {
return "", errors.New("The JSON field 'ui/nodes/attributes/value' doesn't exists")
}
return crsf_token.(string), nil
}
func main() {
// Create a new HTTP request
req, err := http.NewRequest("GET", "<http://localhost:4433/self-service/registration/browser>", nil)
if err != nil {
panic(err)
}
// Set headers
req.Header.Set("Accept", "application/json")
// Execute the request
client := &http.Client{}
resp, err := <http://client.Do|client.Do>(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
get_cookies := resp.Cookies()
// Read the response body
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
panic(err)
}
crsf_token, err := getCrsfToken(body)
if err != nil {
fmt.Println("Error in retrieving crsf_token : ", err)
}
actionUrl, err := getActionUrl(body)
passwordRequest := PasswordRequest{
CsrfToken: crsf_token,
Identifier: "<mailto:test1312@gmail.com|test1312@gmail.com>",
Password: "RandomPassword1234!",
Method: "password",
}
passwordRequestStr, _ := json.Marshal(passwordRequest)
postReq, err := http.NewRequest("POST", actionUrl, bytes.NewBuffer(passwordRequestStr))
postReq.Header.Set("Content-Type", "application/json")
postReq.Header.Set("X-CSRF-Token", crsf_token)
cookie := &http.Cookie{
Name: "csrf_token",
Value: crsf_token,
}
postReq.AddCookie(cookie)
for _, cookie := range get_cookies {
postReq.AddCookie(cookie)
}
postClient := &http.Client{}
postResp, err := <http://postClient.Do|postClient.Do>(postReq)
postBody, err := ioutil.ReadAll(postResp.Body)
if err != nil {
panic(err)
}
fmt.Println(string(postBody))
}
swift-chef-97535
12/03/2022, 5:33 PM