質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.33%

  • Ruby on Rails

    7675questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

  • Unity3D

    1434questions

    Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

  • JSON

    1235questions

    JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

  • HTTPヘッダー

    95questions

    Hypertext Transfer Protocol(HTTP)の中のHTTPヘッダフィールドはHTTPの要求やレスポンスの機能しているパラメーターが含まれます。その要求もしくはレスポンスライン(メッセージの最初の一行)でメッセージヘッダを作ります。

UnityのiOSアプリでセッション情報を取り扱う方法。

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 495

icchie

score 15

概要

現在、Unityを使用したサーバーサイドアプリを作成しており、RailsAPIで発行したセッションを丁度ブラウザにおけるクッキーのように生成されたセッション情報を扱い、それを利用してサーバーとのトークン認証を実現したいと考えております。

セッションを受け取るための初回のリクエストとしてクライアント側でユーザーがフォームに入力した情報をGET通信に付与して合致するユーザー情報を取得したいのですが、取得できません。ご教示願えますと幸いです。

疑問点

①認証に必要な情報をGET通信の際にリクエストヘッダー付与するにはどのようにすれば良いか。
②現在のコードでリクエストを送ったときに、ヘッダーに付与した情報がnilになってしまうのでどのように設定すれば良いか。

以上、何卒宜しくお願い申し上げます。

通信部分コード

Unity3d(c#) 初回リクエスト

void Start(){
  StartCoroutine("Get");
  }

//(通信部分)
  private IEnumerator Get(){

    Dictionary<string, string> header = new Dictionary<string, string>();
    header.Add("Accepted-Language", "ja");
    // 初回リクエスト時にユーザー情報をヘッダーに付与し、GET通信をする。
    header.Add("name", sessionName);
    header.Add("password", sessionPassword);
    WWW www = new WWW(url);
    yield return www;

サーバーサイドの処理

Rails API app/controllers/sessions#show
ヘッダーに付与された:nameと:passwordを元にユーザーを特定する。
この結果を以降クライアント側で保持する。

 def show
    @user = User.find_by(name: params[:name])
    return invalid_name unless @user
    if @user.valid_password?(params[:password])
      render json: @user, serializer: SessionSerializer, root: nil
    else
      invalid_password
    end
  end

GET通信をした時の結果

Processing by SessionsController#show as */*
  User Load (2.4ms)  SELECT  `users`.* FROM `users` WHERE `users`.`name` IS NULL LIMIT 1
Completed 200 OK in 9ms (Views: 0.4ms | ActiveRecord: 5.0ms)
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

RailsAPI触ったことないので分からないのですが、こんな感じではどうでしょうか?

※コードは未検証です。動かなかったらすみません。

IEnumerator Get()
{
    using (UnityWebRequest request = new UnityWebRequest(url))
    {
        request.method = UnityWebRequest.kHttpVerbGET;
        request.SetRequestHeader("Accepted-Language", "ja");
        request.SetRequestHeader("name", sessionName);
        request.SetRequestHeader("password", sessionPassword);

        yield return request.Send();

        if( (int)request.responseCode < 299 && (int)request.responseCode >= 200 ) Debug.Log("SUCCESS");
        else if (!string.IsNullOrEmpty(request.error)) Debug.Log(request.error);
        else Debug.Log("ERROR");
    }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/29 14:19

    ご回答いただきありがとうございました。イメージWWWクラスを利用していますが、nameとpasswordをキーとバリューでペアにしてヘッダーに取り付ける形にしました。
    サーバーサイドでの認証の動作を検証することで、問題解決を進めることに致します。

    キャンセル

  • 2017/09/29 17:09

    あまりお力になれずすみません。
    あと、Usingステートメントを使うことで勝手に使い終わったメモリを破棄(ファイルをクローズ)してくれるのでサーバー通信系は入れておくといいと思います。そうでなければ最後にDisposeメソッドを呼んで自分で破棄する必要があります。

    キャンセル

同じタグがついた質問を見る

  • Ruby on Rails

    7675questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

  • Unity3D

    1434questions

    Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

  • JSON

    1235questions

    JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

  • HTTPヘッダー

    95questions

    Hypertext Transfer Protocol(HTTP)の中のHTTPヘッダフィールドはHTTPの要求やレスポンスの機能しているパラメーターが含まれます。その要求もしくはレスポンスライン(メッセージの最初の一行)でメッセージヘッダを作ります。