ios - 如何使用身份验证方法快速访问 Laravel API?

标签 ios swift laravel api post

我正在开发 iOS 应用程序 我自己制作了 POST API。 现在,当我从 iOS 按下按钮时,我创建了一个函数来访问 APi 并发布值。 我尝试使用 PostMan 输入一次值来测试 API,但出现错误。 页面因不活动而过期。

我理解这个错误是因为POST没有包含csrf_token

如果在iOS上使用csrf_token认证,认证方式是什么?另外,还有其他的认证方式吗?

快捷键功能

@IBAction func bookmarkBtn(_ sender: Any) {
    let user_id = defaultValues.string(forKey: "id")

    let urlString = "http://127.0.0.1:8000/store/favorite"

    let request = NSMutableURLRequest(url: URL(string: urlString)!)

    request.httpMethod = "POST"
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")



    let params:[String:Any] = [
        "user_id": user_id,
        "store_id" : store_id,
    ]

    do{
        request.httpBody = try JSONSerialization.data(withJSONObject: params, options: .prettyPrinted)

        let task:URLSessionDataTask = URLSession.shared.dataTask(with: request as URLRequest, completionHandler: {(data,response,error) -> Void in
            let resultData = String(data: data!, encoding: .utf8)!
            print("result:\(resultData)")
            print("response:\(response)")

        })
        task.resume()
    }catch{
        print("Error:\(error)")
        return
    }

Laravel FavoriteController

public function favorite(Request $request){

   Favorite::create(
        array(
            'user_id' => $request->user_id,
           'store_id' => $request->store_id,
        )
    );
    return ['Status' => 'Success'];
}

Laravel 路由/web.php

Route::post('/store/favorite', 'FavoriteController@favorite');

最佳答案

从 CSRF 保护中排除 URI 有时您可能希望将一组 URI 排除在 CSRF 保护之外。例如,如果您使用 Stripe 处理付款并使用他们的 webhook 系统,您需要将 Stripe webhook 处理程序路由排除在 CSRF 保护之外,因为 Stripe 不知道要向您的路由发送什么 CSRF token 。

通常,您应该将这些类型的路由放置在 RouteServiceProvider 应用于 routes/web.php 文件中所有路由的 web 中间件组之外。但是,您也可以通过将路由的 URI 添加到 VerifyCsrfToken 中间件的 $except 属性来排除路由:

<?php

namespace App\Http\Middleware;

use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;

class VerifyCsrfToken extends Middleware
{
    /**
     * The URIs that should be excluded from CSRF verification.
     *
     * @var array
     */
    protected $except = [
        'stripe/*',
        'http://example.com/foo/bar',
        'http://example.com/foo/*',
    ];
}

注意:Apis 应该是无状态的。最好使用 jwt 进行身份验证,并且 csrf token 仅用于 web 界面而不用于 api

引用:https://laravel.com/docs/5.6/csrf#csrf-excluding-uris

如果你使用的是最新版本的 laravel 那么你有 api.php 而不是 web.php 的 api

如果你仍然想使用 web.php 那么你可以在 VerifyCsrfToken 中排除 csrf token

  protected $except = [
            '/*',

        ];

我建议你在 routes/api.php 中添加你的路由,这样你就不会遇到 csrf token 问题。另外你需要在你的 url 中添加 api

http://localhost:8080/api/yourroutename

关于ios - 如何使用身份验证方法快速访问 Laravel API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52198097/

相关文章:

ios - Plist 文件中的 numberOfRowsInSection 问题

ios - 在 iOS 上循环播放一段时间的音频

iphone - Swift UIAlertController -> ActionSheet iPad iOS8 崩溃

ios Instagram api POST 关系端点使用 Alamofire - 错误

laravel - 过滤不重复的集合

php - Laravel:将查询生成器转换为 Eloquent:ORM

node.js - yarn run dev - 跨环境 : Permission denied

ios - NSLineBreakMode 枚举和向后兼容性

ios - 关闭 View Controller 后约束崩溃

iphone - 如何使用NSJSONSerialization输出数据?